package mygraphs; import java.awt.*; import javax.swing.*; import java.util.Vector; import java.util.Enumeration; import parameters.ParameterSet; import parameters.Parameter; class CamGraphCanvas extends JComponent { Vector paramSets = new Vector(); ParameterSet prototype; boolean offScrUpToDate = false; Image offScrImage = null; double [] cosThetas; double [] sinThetas; double minPlotScore = 0.2; CamGraphCanvas() { setParameters(null); } CamGraphCanvas(ParameterSet params) { setParameters(params); } public void setParameters(ParameterSet params) { prototype = params; if(prototype == null) return; // Will be set later presumably cosThetas = new double[prototype.numParams]; sinThetas = new double[prototype.numParams]; for(int i = 0; i < prototype.numParams; i++) { double theta = 2.0*3.14159*i/(double) prototype.numParams; cosThetas[i] = Math.cos(theta); sinThetas[i] = Math.sin(theta); } } public void addPoint(ParameterSet params) { paramSets.addElement(params); offScrUpToDate = false; } public void removePoint(ParameterSet params) { paramSets.removeElement(params); offScrUpToDate = false; } public void clearPoints() { paramSets.removeAllElements(); offScrUpToDate = false;} public void update(Graphics g) { paint(g); } public void paint(Graphics g) { paintOffScreen(); g.drawImage(offScrImage, 0, 0, this); } public void print(Graphics g) { plotGraph(g); } private void paintOffScreen() { Rectangle area = getBounds(); if(offScrImage == null || offScrImage.getWidth(this) != area.width || offScrImage.getHeight(this) != area.height) { offScrImage = createImage(area.width, area.height); offScrUpToDate = false; } if(offScrUpToDate) return; Graphics og = offScrImage.getGraphics(); og.setColor(Color.white); og.fillRect(0, 0, area.width, area.height); plotGraph(og); og.dispose(); } private void plotGraph(Graphics g) { /* Draw the data */ Dimension area = getSize(); Enumeration enum = paramSets.elements(); g.setColor(Color.black); g.drawLine(0,0,area.width-1,0); g.drawLine(area.width-1, 0, area.width-1, area.height); g.drawLine(area.width-1, area.height, 0, area.height); g.drawLine(0, area.height, 0, 0); int xcen = (int)(area.width/2); int ycen = (int)(area.height/2); int rad = xcen; if(rad > ycen) rad = ycen; rad = (int)(0.8*rad); plotGrid(g, xcen, ycen, rad); while(enum.hasMoreElements()) { ParameterSet set = (ParameterSet)enum.nextElement(); set.draw(g, xcen, ycen, rad, cosThetas, sinThetas); } offScrUpToDate = true; } private void plotGrid(Graphics g, int xcen, int ycen, int rad) { g.setColor(Color.lightGray); String label; int radius=rad; int num_params = prototype.numParams; int xto = xcoord(num_params - 1,xcen, radius); int yto = ycoord(num_params - 1,ycen, radius); int xfrom,yfrom,i; for(i = 0; i < num_params; i++) { // draw the outer circle xfrom=xto; yfrom=yto; xto=xcoord(i,xcen, radius); yto=ycoord(i,ycen, radius); g.drawLine(xfrom,yfrom,xto,yto); } radius = rad/4; xto = xcoord(num_params - 1,xcen, radius); yto = ycoord(num_params - 1,ycen, radius); for(i = 0; i < num_params; i++) { // draw the inner circle xfrom=xto; yfrom=yto; xto=xcoord(i,xcen, radius); yto=ycoord(i,ycen, radius); g.drawLine(xfrom,yfrom,xto,yto); } radius = (int)(1.06*rad); for(i = 0; i < num_params; i++) { // draw the radial rays g.drawLine(xcen,ycen,xcoord(i,xcen,radius),ycoord(i,ycen, radius)); } g.setColor(Color.pink); radius = (int )(rad/0.9); for(i = 0; i < num_params; i++) {// write the parameter names if(prototype.params[i].variationMode == Parameter.LOGARITHMIC) label="ln "; else label=""; g.drawString((label+prototype.params[i].name),xcoord(i,xcen,radius),ycoord(i,ycen, radius)); } } private int xcoord(int i, int xcen, int radius) { return ((int )(xcen + radius*cosThetas[i])); } private int ycoord(int i, int ycen, int radius) { return ((int )(ycen + radius*sinThetas[i])); } }