import java.applet.Applet; import java.awt.*; import java.awt.event.*; import java.applet.*; import java.awt.geom.*; import java.math.*; import java.util.Random; public class PictureCanvas extends ScaleCanvas implements MouseListener, MouseMotionListener, KeyListener { Manager M; PolyWedge P,P2; //P2 is the conjugate of P Point JX; Segment[] SEG=new Segment[50]; int[] OPEN=new int[500]; GeneralPath[] TILE=new GeneralPath[50]; Color[] TILE_COLOR=new Color[50]; int point_count; int segment_count; int tile_count; int VTX; Complex SOURCE,SOURCE2,SOURCE3; PolyWedge ORBIT; int[] STRIPS=new int[10]; Complex POSITION; Animation AN; public PictureCanvas() { addMouseListener(this); addMouseMotionListener(this); addKeyListener(this); P=new PolyWedge(); setScales(350,350,150); tile_count=0; for(int i=0;i<10;++i) SEG[i]=new Segment(); SOURCE=new Complex(0,0); SOURCE3=new Complex(0,0); initShape(); AN=new Animation(); POSITION=new Complex(0,0); } public void initShape() { P=new PolyWedge(); P2=new PolyWedge(); P=PolyWedge.random(5,.8); P.slopes=Strips.sortSlopes(P); P.X=Strips.stripData(P,P.slopes[0]); P2=PolyWedge.conjugate(P); P2.slopes=Strips.sortSlopes(P2); P2.X=Strips.stripData(P2,P2.slopes[0]); } public void paint(Graphics g2) { Graphics2D g=(Graphics2D) g2; g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); drawBackground(g); if((tile_count>0)&&(M.C2.TILEFIT.on==1)) tileFit(); if(M.C2.POLYFIT.on==1) polyFit(); if(M.C2.MODE.mode==0) regularDraw(g); if(M.C2.MODE.mode==1) stripMapDraw(g); if(M.C2.MODE.mode==2) outerMapDraw(g); } public void regularDraw(Graphics2D g) { if(M.C.PC.SHOW.L[2].on==1) drawWedge1(g,M.C.PC.WEDGE1.val); if(M.C.PC.SHOW.L[3].on==1) drawWedge2(g,M.C.PC.WEDGE2.val); if(M.C.PC.SHOW.L[0].on==1) drawRegions1(g); if(M.C.PC.SHOW.L[1].on==1) drawRegions2(g); drawStrips(g); drawTiles(g); drawInitialShape(g,0); drawSpokes1(g); drawSpokes2(g); drawPoint(g,SOURCE,Color.white); drawInitialShape(g,1); animationDraw(g); } public void animationDraw(Graphics2D g) { GeneralPath gp=AuxDraw.disk(POSITION,.025,20); gp=transform(gp); g.setColor(M.C.COLOR.L[6].C); g.fill(gp); g.setColor(Color.white); g.draw(gp); } public void outerMapDraw(Graphics2D g) { if(M.C.PC.SHOW.L[2].on==1) drawWedge1(g,M.C.PC.WEDGE1.val); if(M.C.PC.SHOW.L[0].on==1) drawRegions1(g); drawTiles(g); drawInitialShape(g,0); drawInitialShape(g,1); doOuterMap(g); } public void stripMapDraw(Graphics2D g) { int n=M.C.PC.STRIP.val; drawStrips(g,n); drawTiles(g); drawInitialShape(g,0); drawSpokes1(g); drawSpokes2(g,n); drawInitialShape(g,1); doStripMap(g,n); } public void doOuterMap(Graphics2D g) { if(P.contains(SOURCE3)==0) { Complex w1=BilliardsMap.nextPoint(SOURCE3,P); Complex w2=BilliardsMap.nextPoint2(SOURCE3,P); drawArrow(g,SOURCE3,w1,new Color(80,100,120),1); drawArrow(g,w1,w2,new Color(80,100,120),1); drawArrow(g,SOURCE3,w2,Color.white,3); } } public void doStripMap(Graphics2D g,int n) { Complex w=StripMap.oneStepMap(P,P.slopes[n],SOURCE3); drawArrow(g,SOURCE3,w,Color.white,2); } public void drawArrow(Graphics2D g,Complex z1,Complex z2,Color C,int thick) { GeneralPath gp=new GeneralPath(); gp=AuxDraw.disk(z1,0.025,20); gp=transform(gp); g.setColor(M.C.COLOR.L[6].C); g.fill(gp); g.setColor(Color.white); g.draw(gp); gp=AuxDraw.disk(z2,0.025,20); gp=transform(gp); g.setColor(M.C.COLOR.L[6].C); g.fill(gp); g.setColor(Color.white); g.draw(gp); double d=.2; if(thick==1) d=0; if(Complex.dist(z1,z2)>.000001) { g.setStroke(new BasicStroke(thick)); gp=AuxDraw.getArrow(z1,z2,d); gp=transform(gp); g.setColor(C); g.draw(gp); } g.setStroke(new BasicStroke(1)); } public Color opacify(Color C1,Lever L) { double s=1.0*L.val/6; int trans=(int)(255*s); Color C=new Color(C1.getRed(),C1.getGreen(),C1.getBlue(),trans); return(C); } public void drawBackground(Graphics2D g) { g.setColor(M.C.COLOR.L[0].C); g.fillRect(0,0,getWidth(),getHeight()); } public void drawTiles(Graphics2D g) { for(int i=0;i.00001) { M.C.PC.SELECT[3][E0.n].on=1; M.C.PC.SELECT[2][E0.n].C=PinwheelControl.getColor(zoop,P.count); M.C.PC.SELECT[4][E0.n].C=PinwheelControl.getColor(zoop,P.count); M.C.PC.WEDGE2.val=E0.n; STRIPS[zoop]=E0.n; ++zoop; } Y.z[i+1]=new Complex(E.z); } ORBIT=new PolyWedge(Y); return(Y); } public void drawProbeTile(PolyWedge Y,Complex z,int n,int start) { EnhancedComplex E=new EnhancedComplex(z,start); PolyWedge Q=TileComputer.getTileStatic(SOURCE,1,P); Complex zz=new Complex(0,0); for(int i=0;i.000001)) { Q=Q.translate(zz); TILE[tile_count]=Q.toGeneralPath(); TILE_COLOR[tile_count]=PinwheelControl.getColor(tile_count,P.count); if(i==Y.count-1) TILE_COLOR[tile_count]=new Color(0,0,255,180); ++tile_count; } } } public void reset() { tile_count=0; point_count=0; for(int i=0;i<20;++i) M.C.PC.SELECT[3][i].on=0; for(int i=0;i<20;++i) M.C.PC.SELECT[2][i].C=new Color(30,40,50); for(int i=0;i<20;++i) M.C.PC.SELECT[4][i].C=Color.black; } public void mouseClicked(MouseEvent e) { MouseData J=MouseData.process(e); Point X=J.X; int but=J.mode; doMouseClick(X,but); } public void setVertex() { P.z[VTX]=new Complex(SOURCE2); P.slopes=Strips.sortSlopes(P); P.X=Strips.stripData(P,P.slopes[0]); PolyWedge P2=PolyWedge.conjugate(P); P2.slopes=Strips.sortSlopes(P2); P2.X=Strips.stripData(P2,P2.slopes[0]); } public void findNearest() { int n=P.nearestVertex(SOURCE2); VTX=n; } public void doMouseClick(Point X,int mode) { if(mode==1) scaleUp(X,-1); if(mode==3) scaleUp(X,+1); if((M.C2.MODE.mode==0)&&(mode==2)) { SOURCE=unTransform(X); SOURCE3=unTransform(X); } if((M.C2.MODE.mode>=1)&&(mode==2)) { SOURCE3=unTransform(X); } if(M.C2.MODE.mode==0) { try {doRun();} catch(Exception ee) {} } AN.halt=0; POSITION=new Complex(SOURCE); M.repaint(); } public void mouseEntered(MouseEvent e) { requestFocus(); } public void mouseMoved(MouseEvent e) { try {MouseData J=MouseData.process(e); JX=J.X; } catch(Exception ee) {} } public void keyTyped(KeyEvent e) { char ch = e.getKeyChar(); int test=0; if(ch=='z') test=1; if(ch=='x') test=2; if(ch=='c') test=3; if(ch=='v') test=4; if(test>0) doMouseClick(JX,test); if(test==4) { SOURCE2=unTransform(JX); findNearest(); setVertex(); try {doRun();} catch(Exception ee) {} } } public void keyPressed(KeyEvent e) {} public void keyReleased(KeyEvent e) {} }