/* * Author: tdanford * Date: Nov 14, 2008 */ package org.seqcode.viz.eye; import java.awt.*; import java.awt.geom.AffineTransform; import java.awt.geom.NoninvertibleTransformException; import java.util.Iterator; import org.seqcode.gseutils.models.Model; public class ModelScatterHistograms extends ContainerModelPaintable { private ModelScatter scatter; private ModelHistogram xHist, yHist; public ModelScatterHistograms(String xName, String yName) { scatter = new ModelScatter(xName, yName); xHist = new ModelHistogram(xName); yHist = new ModelHistogram(yName); addModelPaintable(scatter); addModelPaintable(xHist); addModelPaintable(yHist); xHist.setProperty(ModelHistogram.colorKey, Color.blue); yHist.setProperty(ModelHistogram.colorKey, Color.blue); scatter.setProperty(ModelScatter.xScaleKey, scatter.getProperty(ModelScatter.yScaleKey)); scatter.synchronizeProperty(ModelScatter.xScaleKey, xHist, ModelHistogram.xScaleKey); scatter.synchronizeProperty(ModelScatter.yScaleKey, yHist, ModelHistogram.xScaleKey); xHist.setProperty(ModelHistogram.binsKey, 50); yHist.setProperty(ModelHistogram.binsKey, 50); } public ModelScatter getModelScatter() { return scatter; } public ModelHistogram getXHistogram() { return xHist; } public ModelHistogram getYHistogram() { return yHist; } public void paintItem(Graphics g, int x1, int y1, int x2, int y2) { int w = x2-x1, h = y2-y1; int w4 = w/5, h4 = h/5; scatter.paintItem(g, x1+w4, y1, x2, y2-h4); xHist.paintItem(g, x1+w4, y2-h4, x2, y2); Graphics2D g2 = (Graphics2D)g; //int dx = 0, dy = y2-h4; //double theta = -Math.PI/2.0; int dx = x1+w4, dy = y2-h4; double theta = -3.0 * Math.PI/2.0; AffineTransform transform = null, inverse = null; try { transform = new AffineTransform(-1.0, 0.0, 0.0, 1.0, 0.0, 0.0); inverse = transform.createInverse(); } catch (NoninvertibleTransformException e) { e.printStackTrace(); transform = inverse = null; } g2.translate(dx, dy); g2.rotate(theta); if(transform != null) { g2.transform(transform); } yHist.paintItem(g, 0, 0, h-h4, w4); if(inverse != null) { g2.transform(inverse); } g2.rotate(-theta); g2.translate(-dx, -dy); } public void rebin() { xHist.rebin(); yHist.rebin(); } public void addModel(Model m) { super.addModel(m); } public void addModels(Iterator<? extends Model> ms) { super.addModels(ms); rebin(); } }