import java.applet.Applet; import java.awt.event.*; import java.awt.*; /*This applet gives an interactive proof of the Goldman-Parker Conjecture. Programmed by Rich Schwartz*/ /*overall applet layout*/ public class test1 extends Applet { PlotCanvas P1,P2,P3; PlotControlCanvas C1,C2,C3; ControlCanvas C; TextCanvas T; DocumentCanvas D; public void init() { setBackground(Color.black); D=new DocumentCanvas(); P1=new PlotCanvas(1,D); P2=new PlotCanvas(2,D); P3=new PlotCanvas(3,D); C1=new PlotControlCanvas(P1,D); C2=new PlotControlCanvas(P2,D); C3=new PlotControlCanvas(P3,D); C=new ControlCanvas(D,P1,P2,P3,C1,C2,C3); T=new TextCanvas(C,C1,C2,C3,D,P1,P2,P3); C1.setSize(303,17); C2.setSize(303,17); C3.setSize(303,17); P1.setSize(303,270); P2.setSize(303,270); P3.setSize(303,270); T.setSize(915,209); C.setSize(607,222); D.setSize(303,222); add(C3); add(C1); add(C2); add(P3); add(P1); add(P2); add(D); add(C); add(T); } } /*This class implements the double buffering. The idea is to override the update command, so as to have the new picture drawn all at once. */ class DoubleBufferedCanvas extends Canvas { int on=1; public void update(Graphics g) { if(on==0) {g.setColor(Color.black); g.fillRect(0,0,getSize().width,getSize().height); paint(g);} if(on==1) { Graphics g2; Image offscreen = null; offscreen = createImage(getSize().width, getSize().height); g2 = offscreen.getGraphics(); paint(g2); g.drawImage(offscreen, 0, 0, this); offscreen.flush(); } } Point pinpoint(MouseEvent e) { e.consume(); Point p=new Point(); p.x=e.getX(); p.y=e.getY(); return(p); } } /*This class provides the scaling options for the plot windows, and also lets the user toggle the coordinate systems and turn the plot windows on and off.*/ class PlotControlCanvas extends DoubleBufferedCanvas implements MouseListener,MouseMotionListener { ListenSquare active,reset,info,mode; DocumentCanvas D; PlotCanvas P; HorizontalSlider scale,aspect; Font font; Color color1,color2,color3,color4,color5; PlotControlCanvas(PlotCanvas P,DocumentCanvas D) { this.D=D; this.P=P; color1=new Color(255,50,180); color2=new Color(255,0,140); color3=color2; color4=color3; color5=Color.black; addMouseListener(this); addMouseMotionListener(this); scale=new HorizontalSlider(168,0,105,17,220,color1); aspect=new HorizontalSlider(29,0,103,17,80,color1); active=new ListenSquare(273,0,29,17); mode=new ListenSquare(131,0,37,17); reset=new ListenSquare(0,0,29,17); font=new Font("Helvetica",Font.PLAIN,11); } public void paint(Graphics gfx) { Graphics2D g=(Graphics2D) gfx; g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.setFont(new Font("Helvetica",Font.PLAIN,10)); scale.render(g); aspect.render(g); active.render(g,color2); mode.render(g,color3); reset.render(g,color4); g.setColor(color5); g.drawString("reset",3,13); g.drawString("aspect",35,13); g.drawString("scale",176,13); Complex z=new Complex(); z.doubleRender2(P.SCALE,g,220,14); z.doubleRender2(P.XSCALE/P.YSCALE,g,80,14); if(P.ACTIVE==0) g.drawString("off",277,13); if(P.ACTIVE==1) g.drawString("on",277,13); if((P.MODE==0)&&(P.TYPE==1)) g.drawString("elev1",135,13); if((P.MODE==1)&&(P.TYPE==1)) g.drawString("elev2",135,13); if((P.MODE==0)&&(P.TYPE==2)) g.drawString("plan1",135,13); if((P.MODE==1)&&(P.TYPE==2)) g.drawString("plan2",135,13); if((P.MODE==0)&&(P.TYPE==3)) g.drawString("hyp1",135,13); if((P.MODE==1)&&(P.TYPE==3)) g.drawString("hyp2",135,13); g.drawLine(80,14,80,17); g.drawLine(220,14,220,17); } public void mousePressed(MouseEvent e) { Point p=pinpoint(e); if(scale.inside(p)==1) { scale.ACTIVE=1; scale.configure(p); } if(aspect.inside(p)==1) { aspect.ACTIVE=1; aspect.configure(p); D.MESSAGE=50; D.repaint(); repaint(); } } public void mouseClicked(MouseEvent e) { Point p=pinpoint(e); if(active.inside(p)==1) { P.ACTIVE=1-P.ACTIVE; D.MESSAGE=50; D.ACTIVE=1; D.repaint(); repaint(); P.repaint(); } if(mode.inside(p)==1) { P.MODE=1-P.MODE; repaint(); D.MESSAGE=50; D.ACTIVE=1; D.repaint(); P.repaint(); } if(reset.inside(p)==1) { P.SCALE=1; P.XSCALE=60.0; P.YSCALE=60.0; scale.POS=220; aspect.POS=80; P.XORIGIN=0; if(P.TYPE==3) P.XORIGIN=-120; P.YORIGIN=0; D.MESSAGE=50; D.ACTIVE=1; repaint(); D.repaint(); P.repaint(); } } public void mouseReleased(MouseEvent e) { Point p=pinpoint(e); if(scale.ACTIVE==1) { double d1=scale.POS-220; P.SCALE=1.0*Math.exp(d1/40.0); repaint(); } if(aspect.ACTIVE==1) { double d2=aspect.POS-80; double d3=Math.exp(d2/40.0); P.XSCALE=P.YSCALE*d3; D.MESSAGE=50; D.ACTIVE=1; D.repaint(); repaint(); P.repaint(); } scale.ACTIVE=0; aspect.ACTIVE=0; } public void mouseExited(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseDragged(MouseEvent e) {} public void mouseMoved(MouseEvent e) { Point p=pinpoint(e); if(aspect.inside(p)==1) D.MESSAGE=46; if(scale.inside(p)==1) D.MESSAGE=43; if(mode.inside(p)==1) D.MESSAGE=44; if(reset.inside(p)==1) D.MESSAGE=45; if(active.inside(p)==1) D.MESSAGE=47; if((D.ACTIVE==1)&&(D.history!=D.MESSAGE)) D.repaint(); } } /*plotting windows*/ class PlotCanvas extends DoubleBufferedCanvas implements MouseListener, MouseMotionListener { int TYPE,MODE,ACTIVE,COMPUTE,MULTIPLICITY,DENSITY; DocumentCanvas D; double XORIGIN,YORIGIN,SCALE,XSCALE,YSCALE,NUMBER,TRUNCATE; RSphere S1,S2; Segment[] A=new Segment[2000]; Color C,COL,TCOL; PlotCanvas(int j,DocumentCanvas D) { this.TYPE=j; this.D=D; COMPUTE=0; COMPUTE=0; MODE=1; ACTIVE=1; SCALE=1.0; MULTIPLICITY=1; COL=Color.black; TCOL=new Color(0,0,100); this.XSCALE=60.0; this.YSCALE=60.0; this.SCALE=1; this.XORIGIN=0.0; if(TYPE==3) XORIGIN=-120; this.YORIGIN=0.0; this.C=Color.white; addMouseListener(this); addMouseMotionListener(this); setBackground(Color.black); S1=new RSphere(0,0,0,0); S2=new RSphere(0,0,0,0); for(int i=1;i<=1999;++i) A[i]=new Segment(); NUMBER=0; } public void paint(Graphics gfx) { Graphics2D g=(Graphics2D) gfx; g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); if(ACTIVE==1) { g.setColor(Color.white); g.drawRect(0,0,302,269); g.clipRect(1,1,301,268); NUMBER=0; for(int k=1;k<=6;++k) { for(int i=1;i<=30;++i) { if(S1.A[k][i].select==1) { for(int m=1;m<=MULTIPLICITY;++m) { double mm=(m-1.0)/MULTIPLICITY; mm=mm-1.0+0.5/MULTIPLICITY; S_set(1,k,S1.A[k][i].C,i+mm); currentRender(g); } } } } for(int k=1;k<=6;++k) { for(int i=1;i<=30;++i) { if(S2.A[k][i].select==1) { for(int m=1;m<=MULTIPLICITY;++m) { double mm=(m-1.0)/MULTIPLICITY; mm=mm-1.0+0.5/MULTIPLICITY; S_set(2,k,S2.A[k][i].C,i+mm); currentRender(g); } } } } if(S1.S[9].select==1) {C_set(1,S1.S[9].C); currentRender(g);} if(S2.S[9].select==1) {C_set(2,S2.S[9].C); currentRender(g);} if(S1.S[10].select==1) {E_set(2,S1.S[10].C); currentRender(g);} if(S1.S[11].select==1) {Q_set(2,S1.S[11].C); currentRender(g);} if(S2.S[10].select==1) {E_set(1,S2.S[10].C); currentRender(g);} if(S2.S[11].select==1) {Q_set(1,S2.S[11].C); currentRender(g);} if(S1.S[14].select==1) {HQ_set(S1.S[14].C); currentRender(g);} if(S2.S[14].select==1) {HQ_set(S2.S[14].C); currentRender(g);} if(S1.S[15].select==1) {R_set(1,S1.S[15].C); currentRender(g);} if(S2.S[15].select==1) {R_set(2,S2.S[15].C); currentRender(g);} if(S1.S[18].select==1) {QS_set(2,S1.S[18].C); currentRender(g);} if(S2.S[18].select==1) {QS_set(1,S2.S[18].C); currentRender(g);} if(S1.S[7].select==1) {E_set(0,S1.S[7].C); currentRender(g);} if(S2.S[7].select==1) {E_set(0,S2.S[7].C); currentRender(g);} if(S1.S[8].select==1) {Q_set(0,S1.S[8].C); currentRender(g);} if(S2.S[8].select==1) {Q_set(0,S2.S[8].C); currentRender(g);} borderRender(g); } } void borderRender(Graphics g) { int xtrans=150; g.translate(150,135); int x=(int)(XORIGIN); int y=(int)(YORIGIN); int r=(int)(XSCALE); int sx=(int)(XSCALE); int sy=(int)(YSCALE); Color C=new Color(0,0,100); Color C1=new Color(0,0,255); if(TYPE==1) { g.setColor(C); g.fillRect(x-22*sx,y-20*sy,20*sx,40*sy); g.fillRect(x+2*sx,y-20*sy,20*sx,40*sy); g.setColor(C1); g.drawRect(x-22*sx,y-20*sy,20*sx,40*sy); g.drawRect(x+2*sx,y-20*sy,20*sx,40*sy); } if(TYPE==3) { g.setColor(C); g.fillRect(x-20*sx,y-20*sy,20*sx-1,40*sy); g.setColor(C1); g.drawRect(x-20*sx,y-20*sy,20*sx-1,40*sy); } if(TYPE==2) { g.setColor(Color.white); g.drawOval(x-1,y-1,1,1); } g.translate(-150,-135); } void currentRender(Graphics g) { g.setColor(C); g.translate(150,135); double test=0; Complex w1=new Complex(0,0); Complex w2=new Complex(0,0); Segment B=new Segment(w1,w2,C); for(int i=1;i<=NUMBER;++i) { test=A[i].z1.x-A[i].z2.x; test=Math.abs(test); if(test<2.0) { B.z1.x=A[i].z1.x*XSCALE+XORIGIN; B.z1.y=A[i].z1.y*YSCALE+YORIGIN; B.z2.x=A[i].z2.x*XSCALE+XORIGIN; B.z2.y=A[i].z2.y*YSCALE+YORIGIN; B.C=C; B.render(g); } if(TYPE==1) { if((A[i].z2.x2.0)) { B.z1.x=(A[i].z1.x)*XSCALE+XORIGIN; B.z1.y=A[i].z1.y*YSCALE+YORIGIN; B.z2.x=(4.0+A[i].z2.x)*XSCALE+XORIGIN; B.z2.y=A[i].z2.y*YSCALE+YORIGIN; B.C=C; B.render(g); } if((A[i].z2.x>A[i].z1.x)&&(test>2.0)) { B.z1.x=(4.0+A[i].z1.x)*XSCALE+XORIGIN; B.z1.y=A[i].z1.y*YSCALE+YORIGIN; B.z2.x=(A[i].z2.x)*XSCALE+XORIGIN; B.z2.y=A[i].z2.y*YSCALE+YORIGIN; B.C=C; B.render(g); } if((A[i].z2.x2.0)) { B.z1.x=(-4.0+A[i].z1.x)*XSCALE+XORIGIN; B.z1.y=A[i].z1.y*YSCALE+YORIGIN; B.z2.x=(A[i].z2.x)*XSCALE+XORIGIN; B.z2.y=A[i].z2.y*YSCALE+YORIGIN; B.C=C; B.render(g); } if((A[i].z2.x>A[i].z1.x)&&(test>2.0)) { B.z1.x=(A[i].z1.x)*XSCALE+XORIGIN; B.z1.y=A[i].z1.y*YSCALE+YORIGIN; B.z2.x=(-4.0+A[i].z2.x)*XSCALE+XORIGIN; B.z2.y=A[i].z2.y*YSCALE+YORIGIN; B.C=C; B.render(g); } } } g.translate(-150,-135); } void C_set(int q,Color C) { int n=2*DENSITY; Matrix m=new Matrix(); Vector v1,v2; NUMBER=n; this.C=C; double u1=0.0; double u2=0.0; if(q==1) { m.a=S1.P0; m.b=S1.P2; v1=S1.M2.c; v1=v1.normalize(v1); m.b.a=v1.a; } if(q==2) { m.a=S1.P0; m.b=S1.P1; v1=S1.M2.c; v1=v1.normalize(v1); m.b.b=v1.b; m.a=S1.C21; m.b=S1.C22; } Complex z1=new Complex(); v1=m.C_param(0.0); z1=doCoords(v1); for(int i=1;i<=n;++i) { A[i].z1=z1; u2=i; u2=Math.PI*u2/n; v2=m.C_param(u2); A[i].z2=doCoords(v2); z1=A[i].z2; } } void R_set(int q,Color C) { int n=DENSITY; this.C=C; Matrix M=new Matrix(); double u1=0; double u2=0; Vector v1=new Vector(); Vector v2=new Vector(); if(q==1) M=S1.M1.doCone(S1.C11); if(q==2) M=S1.M1.doCone(S1.C21); int lim1=1; int lim2=n; int num=n; NUMBER=0; if(TYPE!=1) { NUMBER=3*num; v1=M.R_param(0); Complex z1=doCoords(v1); for(int i=lim1;i<=lim2;++i) { A[i].z1=z1; u2=i; u2=u2/n; v2=M.R_param(u2); A[i].z2=doCoords(v2); z1=A[i].z2; } if(q==1) M=S1.M1.doLCone(S1.C11); if(q==2) M=S1.M1.doLCone(S1.C21); v1=M.R_param(0); z1=doCoords(v1); for(int i=lim1;i<=lim2;++i) { A[i+num].z1=z1; u2=i; u2=u2/n; v2=M.R_param(u2); A[i+num].z2=doCoords(v2); z1=A[i+num].z2; } if(q==1) M=S1.M1.doRCone(S1.C11); if(q==2) M=S1.M1.doRCone(S1.C21); v1=M.R_param(0); z1=doCoords(v1); for(int i=lim1;i<=lim2;++i) { A[i+2*num].z1=z1; u2=i; u2=u2/n; v2=M.R_param(u2); A[i+2*num].z2=doCoords(v2); z1=A[i+2*num].z2; } } } void E_set(int q,Color C) { int n=3*DENSITY; Matrix m=new Matrix(); Vector v1,v2; NUMBER=0; if((q!=0)||(TYPE==2)||((TYPE==3)&&(MODE==0))) { NUMBER=n; this.C=C; double u1=0.0; double u2=0.0; m.a=S1.M2.b; m.b=S1.M2.c; v1=m.C_param(0.0); if(q==1) v1=S1.I2.act(v1); if(q==2) v1=S1.I1.act(v1); Complex z1=doCoords(v1); for(int i=1;i<=n;++i) { A[i].z1=z1; u2=i; u2=Math.PI*u2/n; v2=m.C_param(u2); if(q==1) v2=S1.I2.act(v2); if(q==2) v2=S1.I1.act(v2); A[i].z2=doCoords(v2); z1=A[i].z2; } } } void Q_set(int q,Color C) { int n=DENSITY; Matrix m=new Matrix(); Vector v1,v2; NUMBER=0; this.C=C; if((q!=0)||(TYPE==2)||((TYPE==3)&&(MODE==0))) { NUMBER=n; this.C=C; double u1=0.0; double u2=0.0; m.a=S1.M1.b; m.b=S1.M1.c; v1=m.C_param(0.0); if(q==1) v1=S1.I2.act(v1); if(q==2) v1=S1.I1.act(v1); Complex z1=doCoords(v1); for(int i=1;i<=n;++i) { A[i].z1=z1; u2=i; u2=0.5*Math.PI*u2/n; v2=m.C_param(u2); if(q==1) v2=S1.I2.act(v2); if(q==2) v2=S1.I1.act(v2); A[i].z2=doCoords(v2); z1=A[i].z2; } } } void QS_set(int q,Color C) { int n=DENSITY; Matrix m=new Matrix(); Vector v1,v2; NUMBER=0; this.C=C; if((q!=0)||(TYPE==2)||((TYPE==3)&&(MODE==0))) { NUMBER=n; this.C=C; double u1=0.0; double u2=0.0; if(q==1) { m.b=S1.C21; m.a=S1.C22; } if(q==2) { m.a=S1.C11; m.b=S1.C12; } Matrix mm=new Matrix(); mm.b=S1.M1.harmonic1(m.C_param(Math.PI/4.0)); mm.a=S1.M1.harmonic1(m.C_param(-Math.PI/4.0)); v1=mm.C_param(0.0); if(q==1) v1=S1.I2.act(v1); if(q==2) v1=S1.I1.act(v1); Complex z1=doCoords(v1); for(int i=1;i<=n;++i) { A[i].z1=z1; u2=i; u2=0.5*Math.PI*u2/n; v2=mm.C_param(u2); if(q==1) v2=S1.I2.act(v2); if(q==2) v2=S1.I1.act(v2); A[i].z2=doCoords(v2); z1=A[i].z2; } } } void S_set(int q,int k,Color C,double POS) { int n=DENSITY; Matrix m=new Matrix(); Vector v1,v2,v3; NUMBER=TRUNCATE*n; this.C=C; double u1=0.0; double u2=0.0; if(q==1) { m.a=S1.C12; m.b=S1.C11; } if(q==2) { m.a=S1.C21; m.b=S1.C22; } double theta=Math.PI*POS/30.0; v3=m.C_param(theta); Matrix M=new Matrix(); if(k==1) M=S1.M1.doLCone(v3); if(k==2) M=S1.M1.doCone(v3); if(k==3) M=S1.M1.doRCone(v3); if(k==4) M=S1.M1.doLCone(v3); if(k==5) M=S1.M1.doCone(v3); if(k==6) M=S1.M1.doRCone(v3); NUMBER=0; int lim1=1; int lim2=n; int num=n; if((k<=3)&&(TYPE==1)) {lim1=1;lim2=n-1;num=n-1;} NUMBER=num*TRUNCATE; v1=M.R_param((lim1+.0000001)/n); if((k!=3)||(TYPE!=1)) v1=M.R_param(0); if((q==1)&&(k>3)) v1=S1.I1.act(v1); if((q==2)&&(k>3)) v1=S1.I2.act(v1); Complex z1=doCoords(v1); for(int i=lim1;i<=lim2;++i) { A[i].z1=z1; u2=i; u2=u2/n; v2=M.R_param(u2); if((q==1)&&(k>3)) v2=S1.I1.act(v2); if((q==2)&&(k>3)) v2=S1.I2.act(v2); A[i].z2=doCoords(v2); z1=A[i].z2; } } void HQ_set(Color C) { int n=DENSITY; Matrix m=new Matrix(); Matrix m2=new Matrix(); Vector v1=new Vector(); Vector v2=new Vector(); double u1=0; double u2=0; v1.a=v1.a.convert(1.0,0.0); v1.b=v1.b.convert(0.0,0.0); v1.c=v1.c.convert(1.0,0.0); NUMBER=0; if(TYPE==3) { NUMBER=n; this.C=C; m.a=S1.M1.b; m.b=S1.M1.c; m.c=m.a.spinalExtension(m.a,m.b,v1); m2.a=m.c; m2.b=m.b; m2.c=m.a; v1=m2.R_param(0); Complex z1=doCoords(v1); for(int i=1;i<=n;++i) { A[i].z1=z1; u2=i; u2=u2/n; v2=m2.R_param(u2); A[i].z2=doCoords(v2); z1=A[i].z2; } } } Complex doCoords(Vector v1) { Complex A=new Complex(); if((TYPE==1)&&(MODE==0)) { Complex u=new Complex(1.0,0.0); u=u.inverse(S1.Z3); u.x=-u.x; u.y=-u.y; A=S1.M2.ELEV1(v1,u); A.x=4*A.x-2; A.y=-2.0*A.y/S1.Z5.y; } if((TYPE==1)&&(MODE==1)) { double top=Math.sqrt(125.0/3.0); A=S1.M1.ELEV2(v1); A.x=4*A.x-2; A.y=2.0*A.y/S1.Z8.y; } if((TYPE==2)&&(MODE==0)) { Complex w=new Complex(); w=w.inverse(S1.Z3); w=w.unit(w); A=S1.M2.PLAN1(v1); A=A.times(A,w); A.y=-A.y/S1.Z6.y; A.x=A.x/S1.Z6.y; } if((TYPE==2)&&(MODE==1)) { Complex w=new Complex(); w=w.inverse(S1.Z4); w=w.unit(w); A=S1.M1.PLAN2(v1); A=A.times(A,w); A.y=-A.y/S1.Z7.y; A.x=A.x/S1.Z7.y; A.x=A.x*S1.Z7.x; } if((TYPE==3)&&(MODE==0)) { A=S1.M1.HYP1(v1); Complex z1=A.minus(A,S1.Z1); Complex z2=A.minus(A,S1.Z2); A=z1.divide(z1,z2); A=z1.divide(A,new Complex(S1.Z5.y,0.0)); A.x=-2.0*A.x; A.y=2.0*A.y; } if((TYPE==3) && (MODE==1)) { A=S1.M1.HYP2(v1); A.x=2.0*A.x/S1.Z8.y; A.y=2.0*A.y/S1.Z8.y; A.x=A.x/S1.Z8.x; } return(A); } public void mousePressed(MouseEvent e) {} public void mouseReleased(MouseEvent e) {} public void mouseDragged(MouseEvent e) {} public void mouseMoved(MouseEvent e) { if(TYPE==1) D.MESSAGE=4; if(TYPE==2) D.MESSAGE=5; if(TYPE==3) D.MESSAGE=6; if((D.ACTIVE==1)&&(D.MESSAGE!=D.history)) D.repaint(); } public void mouseClicked(MouseEvent e) { D.MESSAGE=50; D.repaint(); Point p=pinpoint(e); if((p.x<300)&&(p.y>18)&&(p.y<282)) { double xx=p.x-150.0; double yy=p.y-135.0; if(SCALE>=1) { if((XSCALE<1200)&&(YSCALE<1200)) { XSCALE=XSCALE*SCALE; YSCALE=YSCALE*SCALE; XORIGIN=xx+SCALE*(XORIGIN-xx); YORIGIN=yy+SCALE*(YORIGIN-yy); repaint(); }} if(SCALE<1) { if((XSCALE>12)&&(YSCALE>12)) { XSCALE=XSCALE*SCALE; YSCALE=YSCALE*SCALE; XORIGIN=xx+SCALE*(XORIGIN-xx); YORIGIN=yy+SCALE*(YORIGIN-yy); repaint(); }} } } public void mouseEntered(MouseEvent e) { if(TYPE==1) D.MESSAGE=4; if(TYPE==2) D.MESSAGE=5; if(TYPE==3) D.MESSAGE=6; if(D.ACTIVE==1) D.repaint(); } public void mouseExited(MouseEvent e) { D.MESSAGE=-1; if(D.ACTIVE==1) D.repaint(); } } /*the main control panel*/ class ControlCanvas extends DoubleBufferedCanvas implements MouseListener,MouseMotionListener { DocumentCanvas D; PlotCanvas P1,P2,P3; PlotControlCanvas C1,C2,C3; RSphere S1,S2; Font font; double s,TRUNCATE; HorizontalSlider parameter,truncate,density; ListenSquare plot,erase,clear,money,plink,tlink,t_reset; ListenSquare[] COL=new ListenSquare[40]; ListenSquare[] mode=new ListenSquare[6]; int ERASE,DENSITY,P_LINK,T_LINK,MODE; Color[] color=new Color[4]; ControlCanvas(DocumentCanvas D,PlotCanvas P1,PlotCanvas P2,PlotCanvas P3,PlotControlCanvas C1,PlotControlCanvas C2,PlotControlCanvas C3) { this.D=D; this.P1=P1; this.P2=P2; this.P3=P3; this.C1=C1; this.C2=C2; this.C3=C3; P_LINK=1; T_LINK=1; MODE=1; color[3]=new Color(255,50,200); color[1]=new Color(255,80,220); color[0]=new Color(235,0,145); color[2]=new Color(255,0,180); addMouseListener(this); addMouseMotionListener(this); setBackground(Color.black); font=new Font("Helvetican",Font.PLAIN,11); /*plot selector*/ for(int i=1;i<=4;++i) { mode[i]=new ListenSquare(257+15*i,0,15,17); } /*color selector*/ for(int i=0;i<=6;++i) { for(int j=0;j<=4;++j) { COL[7*j+i+1]=new ListenSquare(272+12*j,120+12*i,12,12); COL[7*j+i+1].C=Color.white; } } COL[0]=new ListenSquare(272,102,60,102); COL[0].C=Color.white; COL[7].C=new Color(100,255,255); COL[14].C=new Color(0,255,255); COL[21].C=new Color(0,200,255); COL[28].C=new Color(0,150,200); COL[35].C=new Color(0,100,150); COL[6].C=new Color(255,255,100); COL[13].C=new Color(255,255,0); COL[20].C=new Color(255,180,0); COL[27].C=new Color(220,140,0); COL[34].C=new Color(160,80,0); COL[5].C=new Color(255,180,255); COL[12].C=new Color(255,50,255); COL[19].C=new Color(200,0,200); COL[26].C=new Color(150,0,150); COL[33].C=new Color(100,0,100); COL[4].C=new Color(180,255,180); COL[11].C=new Color(100,255,100); COL[18].C=new Color(0,240,0); COL[25].C=new Color(0,180,0); COL[32].C=new Color(0,100,0); COL[3].C=new Color(255,170,170); COL[10].C=new Color(255,130,130); COL[17].C=new Color(255,40,40); COL[24].C=new Color(200,0,0); COL[31].C=new Color(120,0,0); COL[2].C=new Color(170,170,255); COL[9].C=new Color(100,100,255); COL[16].C=new Color(40,40,255); COL[23].C=new Color(0,0,200); COL[30].C=new Color(0,0,120); COL[1].C=new Color(255,255,255); COL[8].C=new Color(200,200,200); COL[15].C=new Color(150,150,150); COL[22].C=new Color(80,80,80); COL[29].C=new Color(0,0,0); /*controls*/ plot=new ListenSquare(272,17,60,17); clear=new ListenSquare(272,51,60,17); money=new ListenSquare(272,68,60,34); erase=new ListenSquare(272,34,60,17); parameter=new HorizontalSlider(17,204,589,17,333,color[2]); s=Math.sqrt(35.0); density=new HorizontalSlider(332,0,273,17,382,color[2]); truncate=new HorizontalSlider(17,0,238,17,254,color[2]); TRUNCATE=1; t_reset=new ListenSquare(256,0,16,17); tlink=new ListenSquare(0,0,17,17); plink=new ListenSquare(0,204,17,17); DENSITY=100; erase.C=color[0]; /*object selectors*/ S1=new RSphere( 0,19,270,224); S2=new RSphere(334,19,270,224); } public void paint(Graphics gfx) { Graphics2D g=(Graphics2D) gfx; g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.setFont(font); parameter.render(g); density.render(g); truncate.render(g); t_reset.render(g,color[0]); money.render(g,color[0]); S1.render(g); S2.render(g); plot.render(g,color[0]); clear.render(g,color[0]); erase.render(g,erase.C); plink.render(g,color[0]); tlink.render(g,color[0]); for(int i=1;i<=4;++i) mode[i].render(g,color[0]); mode[MODE].render(g,color[1]); for(int i=0;i<=35;++i) COL[i].render(g,COL[i].C); labelButtons(g,Color.black); /*slider markings*/ Complex z=new Complex(); g.setColor(Color.black); g.drawLine(333,216,333,208); z.doubleRender(s,g,185,217); g.setColor(new Color(120,0,70)); double ss=s/Math.sqrt(35.0); z.doubleRender(ss,g,335,217); double sss=s/Math.sqrt(125.0/3.0); z.doubleRender(sss,g,535,217); Integer I=new Integer(0); g.setColor(Color.black); g.drawString(I.toString(DENSITY),575,14); z.doubleRender(TRUNCATE,g,185,14); } void labelButtons(Graphics g,Color C) { g.setColor(C); font=new Font("Helvetica",Font.PLAIN,11); g.setFont(font); if(P_LINK==0) g.drawString("set parameter",24,217); if(P_LINK==1) g.drawString("set parameter and replot",24,217); if(T_LINK==0) g.drawString("truncate arcs",24,12); if(T_LINK==1) g.drawString("truncate arcs and replot",24,12); g.drawString("set plot density", 340,12); g.drawString("clear", 277,64); g.drawString("plot", 277,30); g.drawString("1", 277,13); g.drawString("2", 292,13); g.drawString("4", 307,13); g.drawString("8", 322,13); g.drawString("erase",277,47 ); g.drawString("show me",277,81); g.drawString("the money",276,98); g.setColor(S1.contrast(COL[0].C)); g.drawString("color",277,116); } double getParameter() { double[] t=new double[5]; t[0]=Math.sqrt(125.0/3.0); t[1]=Math.sqrt(35.0); if(parameter.POS>333) { t[2]=(parameter.POS-333.0)/(parameter.w-333.0); t[3]=(1.0-t[2])*t[1]+t[2]*t[0]; if(t[3]>t[0]-.00001) t[3]=t[0]-.00001; } if(parameter.POS<=333) { t[2]=(parameter.POS-19.0)/314.0; t[3]=t[2]*t[1]; if(t[3]<0.0) t[3]=0.0; } return(t[3]); } double getTruncate() { double ss=0.0; ss=truncate.POS; ss=(ss-truncate.x)/truncate.w; if(ss>.99) ss=1.0; return(ss); } void doPlot() { double t=getTruncate(); D.MESSAGE=50; D.ACTIVE=1; D.repaint(); repaint(); P1.TRUNCATE=TRUNCATE; P2.TRUNCATE=TRUNCATE; P3.TRUNCATE=TRUNCATE; int m=0; m=(int)(Math.pow(2,MODE-1)); P1.MULTIPLICITY=m; P2.MULTIPLICITY=m; P3.MULTIPLICITY=m; P1.DENSITY=DENSITY; P2.DENSITY=DENSITY; P3.DENSITY=DENSITY; for(int i=7;i<=18;++i) { P1.S1.S[i]=S1.S[i]; P1.S2.S[i]=S2.S[i]; P2.S1.S[i]=S1.S[i]; P2.S2.S[i]=S2.S[i]; P3.S1.S[i]=S1.S[i]; P3.S2.S[i]=S2.S[i]; } for(int i=1;i<=6;++i) { for(int j=1;j<=40;++j) { P1.S1.A[i][j]=S1.A[i][j]; P1.S2.A[i][j]=S2.A[i][j]; P2.S1.A[i][j]=S1.A[i][j]; P2.S2.A[i][j]=S2.A[i][j]; P3.S1.A[i][j]=S1.A[i][j]; P3.S2.A[i][j]=S2.A[i][j]; } } P1.S1.setStructure(s); P2.S1=P1.S1; P3.S1=P1.S1; P3.repaint(); P1.repaint(); P2.repaint(); } public void mousePressed(MouseEvent e) { Point p=pinpoint(e); if(density.inside(p)==1) density.ACTIVE=1; if(parameter.inside(p)==1) { parameter.ACTIVE=1; if(P_LINK>01) { D.MESSAGE=50; D.repaint(); } } if(truncate.inside(p)==1) { truncate.ACTIVE=1; if(T_LINK>1) { D.MESSAGE=50; D.repaint(); } } if(t_reset.inside(p)==1) { truncate.POS=254; TRUNCATE=1.0; if(T_LINK>1) { D.MESSAGE=50; D.repaint(); } } } public void mouseReleased(MouseEvent e) { Point p=pinpoint(e); parameter.configure(p); truncate.configure(p); density.configure(p); if(parameter.ACTIVE==1) s=getParameter(); if(truncate.ACTIVE==1) TRUNCATE=getTruncate(); if((parameter.ACTIVE==1)&&(P_LINK==1)) doPlot(); if((truncate.ACTIVE==1)&&(T_LINK==1)) doPlot(); if(t_reset.inside(p)==1) doPlot(); parameter.ACTIVE=0; truncate.ACTIVE=0; density.ACTIVE=0; } public void mouseEntered(MouseEvent e) { D.MESSAGE=1; if(D.ACTIVE==1) D.repaint(); } public void mouseExited(MouseEvent e) { D.MESSAGE=-1; if(D.ACTIVE==1) D.repaint(); } public void mouseMoved(MouseEvent e) { Point p=pinpoint(e); D.MESSAGE=1; if(density.inside(p)==1) D.MESSAGE=9; if(parameter.inside(p)==1) D.MESSAGE=7; if(truncate.inside(p)==1) D.MESSAGE=12; if(t_reset.inside(p)==1) D.MESSAGE=71; if(plink.inside(p)==1) D.MESSAGE=27; if(tlink.inside(p)==1) D.MESSAGE=26; if(COL[0].inside(p)==1) D.MESSAGE=8; if(erase.inside(p)==1) D.MESSAGE=10; if(plot.inside(p)==1) D.MESSAGE=11; if(clear.inside(p)==1) D.MESSAGE=13; if(money.inside(p)==1) D.MESSAGE=14; for(int i=1;i<=4;++i) { if(mode[i].inside(p)==1) D.MESSAGE=70; } int test=0; test=S1.MESSAGE(p); if(test>0) D.MESSAGE=14+test; test=S2.MESSAGE(p); if(test>0) D.MESSAGE=27+test; if((D.ACTIVE==1)&&(D.MESSAGE!=D.history)) D.repaint(); } public void mouseClicked(MouseEvent e) { Point p=pinpoint(e); int test=0; for(int i=1;i<=35;++i) { if(COL[i].inside(p)==1) test=i; } COL[0].C=COL[test].C; if(plink.inside(p)==1) P_LINK=1-P_LINK; if(tlink.inside(p)==1) T_LINK=1-T_LINK; for(int i=1;i<=4;++i) { if(mode[i].inside(p)==1) MODE=i; } if(ERASE==0) { S1.select(p,COL[0].C,DENSITY); S2.select(p,COL[0].C,DENSITY); } if(ERASE==1) { S1.erase(p); S2.erase(p); } if(erase.inside(p)==1) { ERASE=1-ERASE; erase.C=color[ERASE]; } if(clear.inside(p)==1) { S1.clear(); S2.clear(); doPlot(); } if(money.inside(p)==1) { TRUNCATE=1; S1.clear(); S2.clear(); Color c1= COL[16].C; Color c2= COL[23].C; Color c3= COL[2].C; Color c4= COL[9].C; Color c5= COL[24].C; Color c6= COL[31].C; Color c7= COL[3].C; Color c8= COL[17].C; P1.ACTIVE=1; P2.ACTIVE=0; P3.ACTIVE=0; P1.MODE=1; P_LINK=1; T_LINK=1; MODE=2; S1.showMoney(DENSITY,c1,c2,c3,c4); S2.showMoney(DENSITY,c5,c6,c7,c8); truncate.POS=254; D.MESSAGE=50; D.repaint(); C1.repaint(); C2.repaint(); C3.repaint(); doPlot(); } if(plot.inside(p)==1) doPlot(); DENSITY=(int)(2.0*(density.POS-density.x)); repaint(); } public void mouseDragged(MouseEvent e) { Point p=pinpoint(e); if(ERASE==0) { S1.select2(p,COL[0].C,DENSITY); S2.select2(p,COL[0].C,DENSITY); } if(ERASE==1) { S1.erase2(p); S2.erase2(p); } repaint(); } } /*This is the object selector*/ class RSphere { int x,y,w,h; ListenSquare[] S=new ListenSquare[20]; ListenSquare[][] A=new ListenSquare[7][45]; Vector P0,P1,P2; Vector C21,C22,C11,C12; Matrix M1,M2,I0,I1,I2; Complex Z1,Z2,Z3,Z4,Z5,Z6,Z7,Z8; double s; RSphere(int x,int y,int w,int h) { this.x=x; this.y=y; this.w=w; this.h=h; /*w is a multiple of 30 and h is a multiple of 32*/ int ww=w/30; int hh=h/32; int www=ww-1; S[0]=new ListenSquare(x,y,w,h-5*hh-6); //frame S[1]=new ListenSquare(x,y+19,w,2*hh); //NS10 S[2]=new ListenSquare(x,y+5*hh-2,w,5*hh); //S10 S[3]=new ListenSquare(x,y+10*hh-2,w,2*hh); //SS10; S[4]=new ListenSquare(x,y+15*hh-4,w,2*hh); //NS21 S[5]=new ListenSquare(x,y+17*hh-4,w,5*hh); //S21 S[6]=new ListenSquare(x,y+22*hh-4,w,2*hh); //SS21 S[7]=new ListenSquare(x,y,w,19); //E0 S[8]=new ListenSquare(x,y,4*ww+4,19); //Q0 S[9]=new ListenSquare(x,y+12*hh-2,w,19); //C1&C2 S[10]=new ListenSquare(x,y+24*hh-4,w,19); //E2&E1 S[11]=new ListenSquare(x,y+24*hh-4,4*ww+4,19); //Q2&Q1 S[12]=new ListenSquare(x+40,y+7*hh,5*www+2,19); //S10A S[13]=new ListenSquare(x+40,y+17*hh-4,5*www+2,19); //S12A S[16]=new ListenSquare(x+24*www-4,y+7*hh,5*www+2,19); //S10B S[17]=new ListenSquare(x+24*www-4,y+17*hh-4,5*www+2,19); //S12B S[14]=new ListenSquare(x+26*ww-4,y,4*ww+4,19); //HQ0 S[15]=new ListenSquare(x+14*ww-4,y+19,2*ww+8,21*hh-2); //R1 S[18]=new ListenSquare(x+26*ww-4,y+24*hh-4,4*ww+4,19); //Q1# for(int i=1;i<=6;++i) { for(int j=0;j<=6;++j) { A[i][j+1]=new ListenSquare(x+8*j,S[i].y,8,S[i].h); } for(int j=7;j<=7;++j) { A[i][j+1]=new ListenSquare(x+8*j,S[i].y,10,S[i].h); } for(int j=8;j<=15;++j) { A[i][j+1]=new ListenSquare(x+8*j+2,S[i].y,8,S[i].h); } for(int j=15;j<=21;++j) { A[i][j+1]=new ListenSquare(30+x+8*j-2,S[i].y,8,S[i].h); } for(int j=22;j<=22;++j) { A[i][j+1]=new ListenSquare(30+x+8*j-2,S[i].y,10,S[i].h); } for(int j=23;j<=29;++j) { A[i][j+1]=new ListenSquare(30+x+8*j,S[i].y,8,S[i].h); } } } Color contrast(Color C) { int r,g,b; r=C.getRed(); g=C.getGreen(); b=C.getBlue(); Color C1=Color.white; if(r+g+b>400) C1=Color.black; if(g>=240) C1=Color.black; return(C1); } Color contrast2(Color C) { int r,g,b; r=C.getRed(); g=C.getGreen(); b=C.getBlue(); Color C1=new Color(40,40,255); int test=0; test=test+(40-r)*(40-r); test=test+(40-g)*(40-g); test=test+(255-b)*(255-b); if(test<100) C1=new Color(100,100,255); return(C1); } void render(Graphics g) { S[0].render(g,Color.black); for(int i=7;i<=11;++i) { S[i].render3(g,S[i].C,contrast2(S[i].C)); } for(int i=1;i<=6;++i) { for(int j=1;j<=30;++j) { A[i][j].render3(g,A[i][j].C,contrast2(A[i][j].C)); }} for(int i=12;i<=18;++i) S[i].render3(g,S[i].C,contrast2(S[i].C)); S[9].render3(g,S[9].C,contrast2(S[9].C)); int hh=h/30; int ww=w/32; g.setColor(contrast(S[8].C)); g.drawString("Q0",x+hh,y+12); g.setColor(contrast(S[7].C)); g.drawString("E0",x+18*hh+3,y+14); g.setColor(contrast(S[14].C)); g.drawString("HQ0",x+34*hh,y+14); g.setColor(contrast(S[9].C)); if(x<100) g.drawString("C1",x+18*hh+3,y+96); if(x>=100) g.drawString("C2",x+18*hh+3,y+96); g.setColor(contrast(S[10].C)); if(x<100) g.drawString("E2",x+18*hh+3,y+23*ww-6); if(x>=100) g.drawString("E1",x+18*hh+3,y+23*ww-6); g.setColor(contrast(S[11].C)); if(x<100) g.drawString("Q2",x+hh,y+23*ww-6); if(x>=100) g.drawString("Q1",x+hh,y+23*ww-6); g.setColor(contrast(S[18].C)); if(x<100) g.drawString("Q2#",x+34*hh,y+23*ww-6); if(x>=100) g.drawString("Q1#",x+34*hh,y+23*ww-6); g.setColor(contrast(S[15].C)); if(x<100) g.drawString("R1",x+18*hh+3,y+7*ww); if(x<100) g.drawString("R1",x+18*hh+3,y+18*ww-2); if(x>100) g.drawString("R2",x+18*hh+3,y+7*ww); if(x>100) g.drawString("R2",x+18*hh+3,y+18*ww-2); g.setColor(contrast(S[12].C)); if(x<100) g.drawString("S10A",x+7*hh-4,y+8*ww); if(x>100) g.drawString("S20A",x+7*hh-4,y+8*ww); g.setColor(contrast(S[13].C)); if(x<100) g.drawString("S12A",x+7*hh-4,y+17*ww-6); if(x>100) g.drawString("S21A",x+7*hh-4,y+17*ww-6); g.setColor(contrast(S[16].C)); if(x<100) g.drawString("S10B",x+27*hh+4,y+8*ww); if(x>100) g.drawString("S20B",x+27*hh+4,y+8*ww); g.setColor(contrast(S[17].C)); if(x<100) g.drawString("S12B",x+27*hh+4,y+17*ww-6); if(x>100) g.drawString("S21B",x+27*hh+4,y+17*ww-6); } void setStructure(double s) { Vector v=new Vector(); Matrix m=new Matrix(); P0=v.P0(s); P1=v.P1(s); P2=v.P2(s); C21=v.C21(s); C22=v.C22(s); C11=v.C11(s); C12=v.C12(s); M1=m.FIX(s); M2=m.TOR(s); I0=m.I0(s); I1=m.I1(s); I2=m.I2(s); this.s=s; Z1=M1.HYP1(M2.b); Z2=M1.HYP1(M2.c); Z3=M2.PLAN1(P0); Z4=M1.PLAN2(P0); double sym=getOptimalWeight(); C11=C11.scale(C21.a.convert(sym,0.0),C11); C22=C22.scale(C22.a.convert(sym,0.0),C22); Z5=new Complex(); Z7=new Complex(); Z6=new Complex(); Z8=new Complex(); Z5.y=getELEV1Scale(); Z8.x=getHYP2Aspect(); Z8.y=getELEV2Scale(); Z7.x=getPLAN2Aspect(); Z7.y=getPLAN2Scale(); Z6.y=getPLAN1Scale(); } double getELEV2Scale() { Matrix m=new Matrix(); m.b=C11; m.a=C12; double d=M1.map2(m.C_param(Math.PI/4.0)); d=Math.abs(d); return(d); } double getPLAN2Scale() { Complex z=M1.PLAN2(C11); double d=0.775*Math.abs(z.y); return(d); } double getPLAN1Scale() { Complex z=M2.PLAN1(C11); double d=Math.abs(z.y); return(d); } double getHYP2Aspect() { Matrix m=new Matrix(); m.b=C12; m.a=C11; Complex z1=M1.HYP2(m.C_param(Math.PI/4.0)); Complex z2=M1.HYP2(m.C_param(-Math.PI/4.0)); Complex z3=M1.HYP2(m.C_param(Math.PI/2.0)); Complex z4=M1.HYP2(m.C_param(0.0)); double d=(z4.x-z3.x)/(z2.y-z1.y); d=Math.abs(d); return(d); } double getPLAN2Aspect() { Matrix m=new Matrix(); m.b=C11; m.a=C12; Complex z1=M1.PLAN2(m.C_param(Math.PI/4.0)); Complex z2=M1.PLAN2(m.C_param(3.0*Math.PI/4.0)); Complex z3=M1.PLAN2(m.C_param(Math.PI/2.0)); Complex z4=M1.PLAN2(m.C_param(0.0)); Complex z5=z1.minus(z4,z3); Complex z6=z1.minus(z1,z2); double d=z5.norm(z5)/z6.norm(z6); return(d); } double getELEV1Scale() { double t1,t2,t3; Complex x1,x2,x3; double test=1.0; int sign=0; Complex dummy=new Complex(); Matrix m=new Matrix(); t1=0.0; t2=4.0; t3=2.0; x2=new Complex(); sign=0; while(sign==0) { t3=0.5*t1+0.5*t2; if(s<=2) { m.b=m.a.scale(m.a.a.convert(t3,0.0),P0); m.a=C12; } if(s>2) { m.b=m.a.scale(m.a.a.convert(t3,0.0),C11); m.a=C12; } x1=M2.ELEV1(m.C_param(Math.PI/4.0-.00001),dummy); x2=M2.ELEV1(m.C_param(Math.PI/4.0),dummy); x3=M2.ELEV1(m.C_param(Math.PI/4.0+.00001),dummy); test=(x1.y-x2.y)*(x2.y-x3.y); if(test>0) sign=0; if(test<=0) sign=1; if(x1.yx2.y) t2=t3; } return(Math.abs(x2.y)); } double getOptimalWeight() { double t1,t2,t3; double x1,x2,x3; double test=1.0; int sign=0; Matrix m=new Matrix(); t1=0.0; t2=4.0; t3=2.0; x1=0.0; x2=1.0; sign=0; while(sign==0) { t3=0.5*t1+0.5*t2; m.a=m.a.scale(m.a.a.convert(t3,0.0),C11); m.b=C12; x1=M1.map2(m.C_param(Math.PI/4.0-.00001)); x2=M1.map2(m.C_param(Math.PI/4.0)); x3=M1.map2(m.C_param(Math.PI/4.0+.00001)); test=(x1-x2)*(x2-x3); if(test>0) sign=0; if(test<=0) sign=1; if(x1x2) t1=t3; } return(t3); } int MESSAGE(Point p) { int test=0; int MESSAGE=0; for(int i=1;i<=18;++i) { if(S[i].inside(p)==1) test=i; } if(S[9].inside(p)==1) test=9; if(test==7) MESSAGE=1; if(test==8) MESSAGE=10; if(test==9) MESSAGE=5; if(test==10) MESSAGE=9; if(test==11) MESSAGE=11; if(test==1) MESSAGE=2; if(test==2) MESSAGE=3; if(test==3) MESSAGE=4; if(test==4) MESSAGE=6; if(test==5) MESSAGE=7; if(test==6) MESSAGE=8; if(test==12) MESSAGE=3; if(test==13) MESSAGE=7; if(test==14) MESSAGE=70; if(test==15) MESSAGE=71; if(test==18) MESSAGE=72; return(MESSAGE); } void select(Point p,Color COL,int DENS) { int test=0; for(int i=1;i<=18;++i) { if(S[i].inside(p)==1) test=i; } if(S[9].inside(p)==1) test=9; if((test==14)||(test==15)||(test==18)||((test>=7)&&(test<=11))) { S[test].select=1; S[test].C=COL; S[test].dens=DENS; } if(test==12) { S[12].select=1; S[12].dens=DENS; for(int i=1;i<=15;++i) { A[2][i].select=1; A[2][i].C=COL; A[2][i].dens=DENS; } } if(test==13) { S[13].select=1; S[13].dens=DENS; for(int i=1;i<=15;++i) { A[5][i].select=1; A[5][i].C=COL; A[5][i].dens=DENS; } } if(test==16) { S[12].select=1; S[12].dens=DENS; for(int i=16;i<=30;++i) { A[2][i].select=1; A[2][i].C=COL; A[2][i].dens=DENS; } } if(test==17) { S[13].select=1; S[13].dens=DENS; for(int i=16;i<=30;++i) { A[5][i].select=1; A[5][i].C=COL; A[5][i].dens=DENS; } } int test2=0; if((test>=1)&&(test<=6)) { for(int i=1;i<=30;++i) { if(A[test][i].inside(p)==1) test2=i; } if(test2>0) { A[test][test2].C=COL; A[test][test2].select=1; A[test][test2].dens=DENS; } } } void select2(Point p,Color COL,int DENS) { int test=0; for(int i=1;i<=6;++i) { if(S[i].inside(p)==1) test=i; } int test2=0; if((test>=1)&&(test<=6)) { for(int i=1;i<=30;++i) { if(A[test][i].inside(p)==1) test2=i; } if(test2>0) { A[test][test2].C=COL; A[test][test2].select=1; A[test][test2].dens=DENS; } } } void erase(Point p) { int test=0; int test2=0; for(int i=1;i<=18;++i) { if(S[i].inside(p)==1) test=i; } if(S[9].inside(p)==1) test=9; if((test==14)||(test==15)||(test==18)||((test>=7)&&(test<=11))) { S[test].select=0; S[test].C=Color.black; } if(test==12) { S[12].select=0; for(int i=1;i<=15;++i) { A[2][i].select=0; A[2][i].C=Color.black; } } if(test==13) { S[13].select=0; for(int i=1;i<=15;++i) { A[5][i].select=0; A[5][i].C=Color.black; } } if(test==16) { S[12].select=0; for(int i=16;i<=30;++i) { A[2][i].select=0; A[2][i].C=Color.black; } } if(test==17) { S[13].select=0; for(int i=16;i<=30;++i) { A[5][i].select=0; A[5][i].C=Color.black; } } if((test>=1)&&(test<=6)) { for(int i=1;i<=30;++i) { if(A[test][i].inside(p)==1) test2=i; } if(test2>0) { A[test][test2].C=Color.black; A[test][test2].select=0; } } } void erase2(Point p) { int test=0; for(int i=1;i<=6;++i) { if(S[i].inside(p)==1) test=i; } int test2=0; if((test>=1)&&(test<=6)) { for(int i=1;i<=30;++i) { if(A[test][i].inside(p)==1) test2=i; } if(test2>0) { A[test][test2].C=Color.black; A[test][test2].select=0; } } } void clear() { for(int i=7;i<=18;++i) { S[i].select=0; S[i].C=Color.black; } for(int j=1;j<=6;++j) { for(int i=1;i<=30;++i) { A[j][i].C=Color.black; A[j][i].select=0; } } } void showMoney(int d,Color C1,Color C2,Color C3,Color C4) { S[9].select=1; S[9].dens=d; S[9].C=C1; S[18].select=1; S[18].dens=d; S[18].C=C1; for(int i=1;i<=30;++i) { A[2][i].select=1; A[2][i].dens=d/2; A[2][i].C=C2; } for(int i=1;i<=15;++i) { A[5][i].select=1; A[5][i].dens=d/2; A[5][i].C=C3; } for(int i=16;i<=30;++i) { A[5][i].select=1; A[5][i].dens=d/2; A[5][i].C=C4; } } } /*this is the button class*/ class ListenSquare { int x,y,w,h; Color C; String S; int select; int current; int future; int dens; ListenSquare(int x,int y,int w,int h) { this.x=x; this.y=y; this.h=h; this.w=w; this.C=Color.black; this.select=0; S=""; } void render(Graphics g,Color C) { g.setColor(C); g.fillRect(x,y,w,h); g.setColor(Color.black); g.drawRect(x,y,w,h); } void render2(Graphics g,Color C) { if(select==1) { g.setColor(C); g.fillRect(x,y,w,h); g.setColor(Color.black); g.drawRect(x,y,w,h); } } void render3(Graphics g,Color C,Color line) { g.setColor(C); g.fillRect(x,y,w,h); g.setColor(line); g.drawRect(x,y,w,h); } void render4(Graphics g,Color C,Color TC) { if(select==1) { g.setColor(C); g.fillRect(x,y,w,h); g.setColor(TC); g.drawRect(x,y,w,h); } } int inside(Point p) { int test=0; if((p.x>x)&&(p.xy)&&(p.yx)) POS=p.x; } int inside(Point p) { int test=0; if((p.x>x)&&(p.xy)&&(p.y.00001) z=z.divide(w.a,w.c); return(z); } Complex ELEV1(Vector v,Complex u) { Vector w=new Vector(); double test=0.0; Complex z1=new Complex(1.0,0.0); Complex z2=new Complex(1.0,0.0); Complex z3=new Complex(1.0,0.0); w.a=w.hermitian_dot(v,this.a); w.b=w.hermitian_dot(v,this.b); w.c=w.hermitian_dot(v,this.c); test=w.c.norm(w.c); if(test>.00001) z1=z1.divide(w.a,w.c); z1=z1.times(u,z1); z2=z2.divide(w.b,w.c); z3.x=z1.arg(z1)/(Math.PI*2); z3.y=z2.y; return(z3); } Complex HYP1(Vector v) { Complex z=new Complex(); z=a.projection(v); return(z); } Complex ELEV2(Vector v) { Complex z=new Complex(); z.x=map1(v); z.y=map2(v); return(z); } Complex HYP2(Vector v) { Complex z=new Complex(); z.x=map3(v)*map3(v); z.y=map2(v); return(z); } Complex PLAN2(Vector v) { double d1=map1(v); double x=2*Math.PI; Complex z=new Complex(Math.cos(x*d1),Math.sin(x*d1)); double d2=map3(v); z.x=z.x*d2; z.y=z.y*d2; return(z); } /*these routines are the basis for the loxodromic cone construction */ Vector harmonic1(Vector v) { double d=0.0; Complex cc=new Complex(); Complex ss=new Complex(); Vector w2=new Vector(); d=map2(v); d=Math.exp(d*cc.norm(w2.hermitian_dot(b,c))); d=1.0/d; cc.x=1.0/Math.sqrt(1.0+d*d); ss.x=d/Math.sqrt(1.0+d*d); cc.y=0.0; ss.y=0.0; w2=w2.plus(w2.scale(ss,b),w2.scale(cc,c)); w2=w2.normalize(w2); return(w2); } Vector harmonic2(Vector v) { double d=0.0; Complex cc=new Complex(); Complex ss=new Complex(); Vector w2=new Vector(); d=map2(v); d=Math.exp(d*cc.norm(w2.hermitian_dot(b,c))); d=1.0/d; cc.x=-1.0/Math.sqrt(1.0+d*d); ss.x=d/Math.sqrt(1.0+d*d); cc.y=0.0; ss.y=0.0; w2=w2.plus(w2.scale(ss,b),w2.scale(cc,c)); w2=w2.normalize(w2); return(w2); } Matrix doCone(Vector v) { Matrix m=new Matrix(); Matrix m2=new Matrix(); m.a=harmonic2(v); m.c=v; m.b=harmonic1(v); m2=m.perfect_basis(); return(m2); } Matrix doLCone(Vector v) { Matrix m=new Matrix(); Matrix m2=new Matrix(); m.b=harmonic2(v); m.c=v; m.a=harmonic1(v); m2=m.perfect_basis(); return(m2); } Matrix doRCone(Vector v) { Matrix m=new Matrix(); Matrix m2=new Matrix(); m.c=harmonic2(v); m.a=v; m.b=harmonic1(v); m2=m.perfect_basis(); return(m2); } /*these are the routines for parameterizing C-arcs and R-arcs*/ /*C-arcs*/ Vector C_param(double t) { Vector p=new Vector(); Vector w=new Vector(); Complex[] z=new Complex[7]; z[1]=new Complex(); z[1]=z[1].convert(0.0,1.0); z[2]=p.hermitian_dot(a,b); z[2]=z[1].unit(z[2]); z[3]=z[2].divide(z[1],z[2]); w=w.scale(z[3],a); z[4]=z[1].convert(Math.cos(t),0.0); z[5]=z[1].convert(Math.sin(t),0.0); p=p.plus(p.scale(z[4],w),p.scale(z[5],b)); p=p.normalize(p); return(p); } /*R-arcs*/ Matrix perfect_basis() { Vector[] w=new Vector[7]; Complex[] z=new Complex[5]; Matrix m=new Matrix(); w[1]=new Vector(); w[1]=w[1].scale(w[1].hermitian_dot(b,c),a); w[2]=w[1].scale(w[1].hermitian_dot(c,a),b); w[3]=w[1].scale(w[1].hermitian_dot(a,b),c); z[1]=w[1].hermitian_dot(w[1],w[2]); z[1]=z[1].unit(z[1]); z[1]=z[1].inverse(z[1]); z[2]=w[1].hermitian_dot(w[2],w[3]); z[2]=z[2].unit(z[2]); z[3]=z[1].convert(-1.0,0.0); m.a=w[1].scale(z[1],w[1]); m.c=w[1].scale(z[2],w[3]); m.b=w[1].scale(z[3],w[2]); return(m); } /*this routine supposes that the vectors lie in an R-circle*/ Vector R_param(double t) { Complex[] z=new Complex[5]; Matrix m=new Matrix(); Vector[] w=new Vector[6]; m=this.perfect_basis(); w[1]=new Vector(); z[1]=new Complex(); z[1]=z[1].convert(t*(t-1.0),0); z[2]=z[1].convert(t,0.0); z[3]=z[1].convert(1.0-t,0.0); w[1]=w[1].scale(z[1],m.a); w[2]=w[1].scale(z[2],m.b); w[3]=w[1].scale(z[3],m.c); w[4]=w[1].plus(w[1].plus(w[1],w[2]),w[3]); w[5]=w[1].normalize(w[4]); return(w[5]); } } class Vector { Complex a,b,c; Vector() { this.a=new Complex(0.0,0.0); this.b=new Complex(0.0,0.0); this.c=new Complex(0.0,0.0); } void print() { this.a.print(); this.b.print(); this.c.print(); } Vector plus(Vector v,Vector w) { Vector x=new Vector(); x.a=x.a.plus(v.a,w.a); x.b=x.b.plus(v.b,w.b); x.c=x.c.plus(v.c,w.c); return(x); } Vector minus(Vector v,Vector w) { Vector x=new Vector(); x.a=x.a.minus(v.a,w.a); x.b=x.b.minus(v.b,w.b); x.c=x.c.minus(v.c,w.c); return(x); } Vector scale(Complex a,Vector v) { Vector w=new Vector(); w.a=w.a.times(a,v.a); w.b=w.b.times(a,v.b); w.c=w.c.times(a,v.c); return(w); } Complex dot(Vector v,Vector w) { Complex d=new Complex(); d=d.plus(d.plus(d.times(v.a,w.a),d.times(v.b,w.b)),d.times(v.c,w.c)); return(d); } double norm(Vector x) { return(x.a.x*x.a.x+x.b.x*x.b.x+x.c.x*x.c.x); } double dist(Vector v,Vector w) { Vector vv=v.normalize(v); Vector ww=w.normalize(w); return(vv.norm(vv.minus(vv,ww))); } Complex hermitian_dot(Vector v,Vector w) { Complex c1=new Complex(); Complex c2=new Complex(); Complex c3=new Complex(); Complex c=new Complex(); c1=c1.times(v.a,c1.conjugate(w.a)); c2=c2.times(v.b,c2.conjugate(w.b)); c3=c2.times(v.c,c3.conjugate(w.c)); c=c.minus(c.plus(c1,c2),c3); return(c); } Complex angular_invariant(Vector v1,Vector v2,Vector v3) { Complex z1=new Complex(); Complex z2=new Complex(); Complex z3=new Complex(); Complex z=new Complex(); z1=hermitian_dot(v1,v2); z2=hermitian_dot(v2,v3); z3=hermitian_dot(v3,v1); z=z.times(z1,z.times(z2,z3)); return(z); } Vector hermitian_cross(Vector v,Vector w) { Vector x=new Vector(); x.a=x.a.minus(x.a.times(v.b,w.c),x.a.times(v.c,w.b)); x.b=x.b.minus(x.b.times(v.c,w.a),x.b.times(v.a,w.c)); x.c=x.c.minus(x.c.times(v.b,w.a),x.c.times(v.a,w.b)); x.a=x.a.conjugate(x.a); x.b=x.b.conjugate(x.b); x.c=x.c.conjugate(x.c); return(x); } Vector normalize(Vector v) { Vector x=new Vector(); x.a=x.a.divide(v.a,v.c); x.b=x.b.divide(v.b,v.c); x.c=x.c.divide(v.c,v.c); return(x); } Complex projection(Vector v) { Vector w=new Vector(); Complex[] z=new Complex[5]; z[1]=hermitian_dot(v,this); z[2]=hermitian_dot(this,this); z[3]=z[2].divide(z[1],z[2]); z[3].x=-z[3].x; z[3].y=-z[3].y; w=w.plus(v,w.scale(z[3],this)); z[4]=z[3].divide(w.a,w.c); return(z[4]); } Vector P0(double s) { Vector v=new Vector(); v.a=v.a.beta(s); v.b=v.b.conjugate(v.b.beta(s)); v.c.x=1.0; v.c.y=0.0; return(v); } Vector P1(double s) { Vector v=new Vector(); v.a=v.a.beta(s); v.b=v.b.beta(s); v.c.x=1.0; v.c.y=0.0; return(v); } Vector P2(double s) { Vector v=new Vector(); v.a=v.a.conjugate(v.a.beta(s)); v.b=v.b.conjugate(v.b.beta(s)); v.c.x=1.0; v.c.y=0.0; return(v); } Vector C21(double s) { Vector[] v=new Vector[10]; double[] d=new double[10]; Complex[] z=new Complex[10]; v[0]=P0(s); v[1]=P1(s); v[2]=P2(s); z[0]=v[1].hermitian_dot(v[0],v[2]); z[1]=v[1].hermitian_dot(v[1],v[2]); v[0]=v[0].scale(z[0].inverse(z[0]),v[0]); v[1]=v[1].scale(z[1].inverse(z[1]),v[1]); z[2]=hermitian_dot(v[0],v[1]); z[2]=z[2].unit(z[2]); z[3]=z[2].times(z[2],z[2].convert(0.0,1.0)); v[1]=v[1].scale(z[3],v[1]); v[2]=v[1].plus(v[0],v[1]); return(v[2]); } Vector C22(double s) { Vector[] v=new Vector[10]; double[] d=new double[10]; Complex[] z=new Complex[10]; v[0]=P0(s); v[1]=P1(s); v[2]=P2(s); z[0]=v[1].hermitian_dot(v[0],v[2]); z[1]=v[1].hermitian_dot(v[1],v[2]); v[0]=v[0].scale(z[0].inverse(z[0]),v[0]); v[1]=v[1].scale(z[1].inverse(z[1]),v[1]); z[2]=hermitian_dot(v[0],v[1]); z[2]=z[2].unit(z[2]); z[3]=z[2].times(z[2],z[2].convert(0.0,1.0)); v[1]=v[1].scale(z[3],v[1]); v[2]=v[1].minus(v[0],v[1]); return(v[2]); } Vector C11(double s) { Vector[] v=new Vector[10]; double[] d=new double[10]; Complex[] z=new Complex[10]; v[0]=P0(s); v[1]=P1(s); v[2]=P2(s); z[0]=v[1].hermitian_dot(v[0],v[1]); z[2]=v[1].hermitian_dot(v[2],v[1]); v[0]=v[0].scale(z[0].inverse(z[0]),v[0]); v[2]=v[2].scale(z[2].inverse(z[2]),v[2]); z[1]=hermitian_dot(v[0],v[2]); z[1]=z[1].unit(z[1]); z[3]=z[1].times(z[1],z[1].convert(0.0,1.0)); v[2]=v[2].scale(z[3],v[2]); v[1]=v[2].plus(v[0],v[2]); return(v[1]); } Vector C12(double s) { Vector[] v=new Vector[10]; double[] d=new double[10]; Complex[] z=new Complex[10]; v[0]=P0(s); v[1]=P1(s); v[2]=P2(s); z[0]=v[1].hermitian_dot(v[0],v[1]); z[2]=v[1].hermitian_dot(v[2],v[1]); v[0]=v[0].scale(z[0].inverse(z[0]),v[0]); v[2]=v[2].scale(z[2].inverse(z[2]),v[2]); z[1]=hermitian_dot(v[0],v[2]); z[1]=z[1].unit(z[1]); z[3]=z[1].times(z[1],z[1].convert(0.0,1.0)); v[2]=v[2].scale(z[3],v[2]); v[1]=v[2].minus(v[0],v[2]); return(v[1]); } Vector fix1(double s) { Matrix m=new Matrix(); Matrix mm=new Matrix(); double test=0; Vector v1=new Vector(); Vector v2=new Vector(); int i=0; int count=0; m=m.J1(s); test=1.0; mm=mm.critical_axis(); v1=v1.normalize(mm.b); while(test>0.000000000001) { v2=v2.normalize(m.act(v1)); test=v1.dist(v1,v2); v1=v2; } return(v1); } Vector fix2(double s) { Matrix m=new Matrix(); Matrix mm=new Matrix(); double test=0; Vector v1=new Vector(); Vector v2=new Vector(); int i=0; int count=0; m=m.J2(s); test=1.0; mm=mm.critical_axis(); v1=v1.normalize(mm.b); while(test>0.000000000001) { v2=v2.normalize(m.act(v1)); test=v1.dist(v1,v2); v1=v2; } return(v1); } Vector torus_vector1(double s) { Matrix m=new Matrix(); m=m.FIX(s); Complex[] z=new Complex[5]; m.a=m.a.normalize(m.a); for(int i=1;i<=4;++i) z[i]=new Complex(); z[1].x=1.0; z[1].y=Math.sqrt(2.0*z[1].norm(m.a.a)*z[1].norm(m.a.a)-1.0); z[2].x=2.0*m.a.b.x; z[2].y=2.0*m.a.b.y; z[3]=z[3].divide(z[1],z[2]); z[4]=z[3].conjugate(z[3]); m.a.a=z[3]; m.a.b=z[4]; return(m.a); } Vector torus_vector2(double s) { Matrix m=new Matrix(); m=m.FIX(s); Complex[] z=new Complex[5]; m.a=m.a.normalize(m.a); for(int i=1;i<=4;++i) z[i]=new Complex(); z[1].x=1.0; z[1].y=-Math.sqrt(2.0*z[1].norm(m.a.a)*z[1].norm(m.a.a)-1.0); z[2].x=2.0*m.a.b.x; z[2].y=2.0*m.a.b.y; z[3]=z[3].divide(z[1],z[2]); z[4]=z[3].conjugate(z[3]); m.a.a=z[3]; m.a.b=z[4]; return(m.a); } Vector spinalExtension(Vector v,Vector w,Vector X) { Vector[] x=new Vector[10]; Complex[] z=new Complex[10]; x[1]=X; z[1]=X.hermitian_dot(x[1],v); z[2]=z[1].convert(0.0,-1.0); z[3]=z[1].times(z[1],z[2]); x[2]=X.scale(z[1].inverse(z[3]),x[1]); z[7]=X.hermitian_dot(w,v); x[4]=X.scale(z[7].inverse(z[7]),w); z[5]=X.hermitian_dot(x[4],x[2]); z[6]=z[5].convert(-z[5].x,0.0); x[5]=X.plus(x[2],X.scale(z[6],v)); return(x[5]); } } class Complex { double x,y; Complex() { this.x=0.0; this.y=0.0; } Complex(double x,double y) { this.x=x; this.y=y; } Complex convert(double x,double y) { Complex z=new Complex(); z.x=x; z.y=y; return(z); } double arg(Complex z) { double d=0.0; d=Math.atan2(z.y,z.x); if(z.y<0.0) d=d+2.0*+Math.PI; return(d); } double guided_arg(Complex z1,Complex z2) { double d1,d2,d3; d1=z1.arg(z1); d2=z2.arg(z2); d3=0.0; if(Math.abs(d1-d2)=Math.PI) d3=Math.PI+d1/2.0+d2/2.0; return(d3); } double norm(Complex z) { double d=Math.sqrt(z.x*z.x+z.y*z.y); return(d); } Complex square_root(Complex z) { Complex w=new Complex(); double r=z.norm(z); r=Math.sqrt(r); double theta=z.arg(z); w=w.convert(r*Math.cos(theta/2.0),r*Math.sin(theta/2.0)); return(w); } Complex unit(Complex z) { Complex w=new Complex(); double d; d=z.norm(z); w.x=z.x/d; w.y=z.y/d; return(w); } Complex plus(Complex z1,Complex z2) { Complex w= new Complex(); w.x=z1.x+z2.x; w.y=z1.y+z2.y; return(w); } Complex minus(Complex z1,Complex z2) { Complex w= new Complex(); w.x=z1.x-z2.x; w.y=z1.y-z2.y; return(w); } Complex times(Complex z1,Complex z2) { Complex w= new Complex(); w.x=z1.x*z2.x-z1.y*z2.y; w.y=z1.x*z2.y+z1.y*z2.x; return(w); } Complex inverse(Complex z) { Complex w=new Complex(); double d; d=z.x*z.x+z.y*z.y; w.x=z.x/d; w.y=-z.y/d; return(w); } Complex divide(Complex z1,Complex z2) { Complex w= new Complex(); w=w.times(z1,w.inverse(z2)); return(w); } Complex conjugate(Complex z) { Complex w=new Complex(); w.x=z.x; w.y=-z.y; return(w); } Complex beta(double s) { Complex z=new Complex(); z.x=s/Math.sqrt(2.0+2.0*s*s); z.y=1.0/Math.sqrt(2.0+2.0*s*s); return(z); } void print() { System.out.println(x+" "+y+" I"); } void doubleRender(double d,Graphics g,int x,int y) { double[] e=new double[7]; int[] n=new int[7]; Integer I=new Integer(0); e[0]=d; n[0]=(int)(e[0]); g.drawString(I.toString(n[0]),x+10,y); g.fillOval(x+18,y-2,2,2); for(int i=1;i<=5;++i) { e[i]=10.0*(e[i-1]-n[i-1]); n[i]=(int)(e[i]); g.drawString(I.toString(n[i]),x+15+8*i,y); } } void doubleRender2(double d,Graphics g,int x,int y) { double[] e=new double[7]; int[] n=new int[7]; Integer I=new Integer(0); e[0]=d; n[0]=(int)(e[0]); g.drawString(I.toString(n[0]),x+10,y); g.fillOval(x+18,y-2,2,2); for(int i=1;i<=3;++i) { e[i]=10.0*(e[i-1]-n[i-1]); n[i]=(int)(e[i]); g.drawString(I.toString(n[i]),x+15+8*i,y); } } } class Segment { Complex z1,z2; Color C; Segment(Complex z1,Complex z2,Color C) { this.z1=z1; this.z2=z2; this.C=C; } Segment() { this.z1=new Complex(0,0); this.z2=new Complex(0,0); this.C=Color.white; } void render(Graphics g) { g.setColor(C); int x1=(int)(z1.x); int y1=(int)(z1.y); int x2=(int)(z2.x); int y2=(int)(z2.y); g.drawLine(x1,y1,x2,y2); } } /*TEXT AND DOCUMENTATION. The rest of the applet is just strings of text, with a few buttons through in to help the user navigate the text.*/ class TextCanvas extends DoubleBufferedCanvas implements MouseListener { ControlCanvas C; PlotControlCanvas C1,C2,C3; PlotCanvas P1,P2,P3; DocumentCanvas D; String St[]=new String[60]; int MESSAGE; ListenSquare[] L=new ListenSquare[50]; ListenSquare[] G=new ListenSquare[20]; int[] history=new int[1000]; int GALLERY; int depth=0; Color COL,TCOL,BCOL,BTCOL; Font font; int FONT1,FONT2; Font[][] FONT=new Font[4][10]; TextCanvas(ControlCanvas C,PlotControlCanvas C1,PlotControlCanvas C2,PlotControlCanvas C3,DocumentCanvas D,PlotCanvas P1,PlotCanvas P2,PlotCanvas P3) { addMouseListener(this); this.C=C; this.C1=C1; this.C2=C2; this.C3=C3; this.D=D; this.P1=P1; this.P2=P2; this.P3=P3; GALLERY=0; history[0]=0; COL=C.COL[23].C; TCOL=Color.white; BCOL=C.COL[35].C; BTCOL=Color.white; MESSAGE=0; font=new Font("Helvetica",Font.PLAIN,11); FONT1=1; FONT2=4; L[1]=new ListenSquare(150,0,75,17); //restart L[2]=new ListenSquare(225,0,78,17); //back L[3]=new ListenSquare(754,191,75,17); //notation L[4]=new ListenSquare(0,0,302,17); //topic display /*context dependent*/ L[5]=new ListenSquare(303,0,149,17); L[6]=new ListenSquare(452,0,152,17); L[7]=new ListenSquare(303,191,150,17); L[8]=new ListenSquare(452,191,152,17); L[9]=new ListenSquare(604,0,75,17); //tutorial L[10]=new ListenSquare(829,0,83,17); //coords L[11]=new ListenSquare(754,0,75,17); //objects L[12]=new ListenSquare(150,191,75,17); //doc on L[13]=new ListenSquare(829,191,83,17); //gallery L[14]=new ListenSquare(225,191,78,17); //doc off L[15]=new ListenSquare(0,191,75,17); //modify L[16]=new ListenSquare(679,0,75,17); //math L[17]=new ListenSquare(604,191,75,17); //conjecture L[18]=new ListenSquare(679,191,75,17); //proof L[19]=new ListenSquare(75,191,75,17); //checks for(int i=1;i<=19;++i) { L[i].select=1; L[i].current=0; } setPage(); St[42]="back"; St[41]="restart"; St[43]="notation"; St[44]=""; St[45]="where in math?"; St[46]="acknowledgements"; St[47]=""; St[48]=""; St[49]="1.tutorial"; St[51]="4.coords"; St[50]="3.objects"; St[52]="doc:on"; St[54]="doc:off"; St[53]="gallery"; St[55]="modify"; St[56]="2.math"; St[57]="5.conjecture"; St[58]="6.proof"; St[59]="checks"; L[1].future=0; L[2].future=0; L[3].future=999; L[4].future=200; L[5].future=199; L[6].future=400; L[7].future=300; L[8].future=0; L[9].future=200; L[10].future=270; L[11].future=205; L[12].future=0; L[13].future=998; L[14].future=0; L[15].future=1001; L[16].future=1000; L[17].future=300; L[18].future=900; L[19].future=550; /*applet modification*/ L[20]=new ListenSquare(5,130,145,17); L[21]=new ListenSquare(307,130,96,17); L[22]=new ListenSquare(403,130,96,17); L[23]=new ListenSquare(499,130,96,17); for(int i=24;i<=29;++i) { L[i]=new ListenSquare(307+48*i-48*24,147,48,17); } L[30]=new ListenSquare(307,164,144,17); L[33]=new ListenSquare(612,130,15,15); L[31]=new ListenSquare(629,130,16,15); L[32]=new ListenSquare(647,130,16,15); L[34]=new ListenSquare(612,147,15,15); L[35]=new ListenSquare(629,147,34,15); L[36]=new ListenSquare(612,164,51,15); for(int i=1;i<=6;++i) { FONT[1][i]=new Font("Helvetica",Font.PLAIN,8+i); FONT[2][i]=new Font("",Font.PLAIN,8+i); FONT[3][i]=new Font("Helvetica",Font.PLAIN,8+i); } G[1]=new ListenSquare(305,20,17,17); G[2]=new ListenSquare(325,20,17,17); G[3]=new ListenSquare(305,40,17,17); G[4]=new ListenSquare(325,40,17,17); G[5]=new ListenSquare(305,60,17,17); G[6]=new ListenSquare(325,60,17,17); G[7]=new ListenSquare(345,60,17,17); G[8]=new ListenSquare(305,80,17,17); G[9]=new ListenSquare(325,80,17,17); G[10]=new ListenSquare(305,100,17,17); } public void paint(Graphics gfx) { Graphics2D g=(Graphics2D) gfx; g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.setFont(font); g.setColor(COL); g.fillRect(0,0,912,220); g.setColor(TCOL); g.drawRect(303,0,301,299); g.drawRect(604,0,308,298); g.drawRect(0,0,303,299); L[4].render4(g,COL,TCOL); for(int i=1;i<=3;++i) L[i].render4(g,BCOL,BTCOL); for(int i=5;i<=8;++i) L[i].render4(g,new Color(0,130,180),BTCOL); for(int i=9;i<=19;++i) L[i].render4(g,BCOL,BTCOL); g.setColor(BTCOL); g.drawString(St[53],837,203); //gallery g.drawString(St[42],235,13); //back g.drawString(St[43],762,203); //notation g.drawString(St[52],160,203); //documentation on g.drawString(St[54],235,203); //documentation off g.drawString(St[45],308,13); g.drawString(St[46],460,13); g.drawString(St[47],308,203); g.drawString(St[48],460,203); g.drawString(St[49],612,13); //tutorial g.drawString(St[50],762,13); //objects g.drawString(St[41],160,13); //start g.drawString(St[51],837,13); //coords g.drawString(St[56],687,13); //math g.drawString(St[57],612,203); //conj g.drawString(St[58],687,203); //proof g.drawString(St[55],10,203); //modify g.drawString(St[59],85,203); //checks g.setColor(TCOL); g.drawString(St[0],10,13); g.setColor(TCOL); for(int i=1;i<=12;++i) { g.drawString(St[i],5,18+14*i); g.drawString(St[i+12],307,14*i+18); g.drawString(St[i+24],610,14*i+18); } if(GALLERY==1) { Integer I=new Integer(0); for(int i=1;i<=10;++i) { G[i].render(g,new Color(150,0,255)); g.setColor(Color.white); g.drawString(I.toString(i),G[i].x+3,G[i].y+13); } } if(MESSAGE==1001) { for(int i=20;i<=36;++i) L[i].render(g,new Color(255,150,0)); for(int i=31;i<=36;++i) L[i].render(g,new Color(255,255,0)); if(P1.on==0) L[31].render(g,new Color(255,150,0)); if(P2.on==0) L[32].render(g,new Color(255,150,0)); if(P3.on==0) L[33].render(g,new Color(255,150,0)); if(D.on==0) L[34].render(g,new Color(255,150,0)); if(C.on==0) L[35].render(g,new Color(255,150,0)); if(this.on==0) L[36].render(g,new Color(255,150,0)); L[20+FONT1].render(g,new Color(255,255,0)); L[23+FONT2].render(g,new Color(255,255,0)); g.drawString("text window color",10,143); g.drawString("Helvetica",312,143); g.drawString("Plain",407,143); g.drawString("Helvetica",502,143); Integer I=new Integer(0); for(int i=1;i<=6;++i) { g.drawString(I.toString(i+8),312+48*i-45,160); } g.drawString("reset font",317,177); } } void changePage(int a,int b,int c) { if(a>2) { ++depth; history[depth]=b; } if(a==0) depth=0; if((depth>0)&&(a==2)) --depth; L[2].future=history[depth]; MESSAGE=c; for(int i=1;i<=19;++i) L[i].current=c; setPage(); repaint(); } public void mousePressed(MouseEvent e) {} public void mouseReleased(MouseEvent e) {} public void mouseEntered(MouseEvent e) { D.MESSAGE=3; if(D.ACTIVE==1) D.repaint(); } public void mouseExited(MouseEvent e) { D.MESSAGE=-1; if(D.ACTIVE==1) D.repaint(); } public void mouseClicked(MouseEvent e) { Point p=pinpoint(e); int test=-1; for(int i=1;i<=3;++i) { if(L[i].select*L[i].inside(p)==1) test=i; } for(int i=5;i<=19;++i) { if(L[i].select*L[i].inside(p)==1) test=i; } if(test==12) test=-1; if(test==14) test=-1; if(test>-1) changePage(test,L[test].current,L[test].future); if(L[12].inside(p)==1) {D.ACTIVE=1;D.repaint();} if(L[14].inside(p)==1) {D.ACTIVE=0;D.repaint();} repaint(); if(GALLERY==1) { test=0; for(int i=1;i<=10;++i) { if(G[i].inside(p)==1) test=i; } if(test>0) doGallery(test); } if(MESSAGE==1001) { test=0; for(int i=20;i<=36;++i) { if(L[i].inside(p)==1) test=i; } if(test==20) { COL=C.COL[0].C; TCOL=C.S1.contrast(COL); D.COL=COL; D.TCOL=TCOL; repaint(); D.repaint(); } if(test==21) { FONT1=1; } if(test==22) { FONT1=2; } if(test==23) { FONT1=3; } for(int i=24;i<=29;++i) { if(test==i) FONT2=i-24+1; } if(test==30) { FONT1=1; FONT2=4; } if((test>=21)&&(test<=30)) { font=FONT[FONT1][FONT2]; D.font=font; C1.font=font; C2.font=font; C3.font=font; D.repaint(); C1.repaint(); C2.repaint(); C3.repaint(); repaint(); } if(test==31) P1.on=1-P1.on; if(test==32) P2.on=1-P2.on; if(test==33) P3.on=1-P3.on; if(test==34) D.on=1-D.on; if(test==35) C.on=1-C.on; if(test==36) this.on=1-this.on; } } void setScale(int a1,int a2,int a3) { C1.P.XSCALE=a1; C2.P.XSCALE=a2; C3.P.XSCALE=a3; C1.P.YSCALE=a1; C2.P.YSCALE=a2; C3.P.YSCALE=a3; C1.aspect.POS=80; C2.aspect.POS=80; C3.aspect.POS=80; } void setOrigin(int a1,int b1,int a2,int b2,int a3,int b3) { C1.P.XORIGIN=a1; C1.P.YORIGIN=b1; C2.P.XORIGIN=a2; C2.P.YORIGIN=b2; C3.P.XORIGIN=a3; C3.P.YORIGIN=b3; } void doGallery(int k) { D.MESSAGE=50; D.ACTIVE=1; D.repaint(); C.S1.clear(); C.S2.clear(); C1.P.ACTIVE=1; C2.P.ACTIVE=1; C3.P.ACTIVE=1; if((k==1)||(k==2)) { C.parameter.POS=150; C.truncate.POS=254; C.s=C.getParameter(); C.TRUNCATE=C.getTruncate(); C.T_LINK=1; C.P_LINK=1; C.MODE=3; C1.P.MODE=1; C2.P.MODE=1; C3.P.MODE=1; C1.repaint(); C2.repaint(); C3.repaint(); setScale(90,60,60); setOrigin(0,80,0,30,-140,50); for(int i=5;i>=6-k;--i) { for(int j=1;j<=30;j=j+5) { C.S1.A[i][j].select=1; C.S1.A[i][j].C=C.COL[14].C; C.S1.A[i][j].dens=100; } for(int j=2;j<=30;j=j+5) { C.S1.A[i][j].select=1; C.S1.A[i][j].C=C.COL[6].C; C.S1.A[i][j].dens=100; } for(int j=3;j<=30;j=j+5) { C.S1.A[i][j].select=1; C.S1.A[i][j].C=C.COL[16].C; C.S1.A[i][j].dens=100; } for(int j=4;j<=30;j=j+5) { C.S1.A[i][j].select=1; C.S1.A[i][j].C=C.COL[17].C; C.S1.A[i][j].dens=100; } for(int j=5;j<=30;j=j+5) { C.S1.A[i][j].select=1; C.S1.A[i][j].C=C.COL[19].C; C.S1.A[i][j].dens=100; }} if(k==2) { C.S1.S[10].select=1; C.S1.S[10].C=C.COL[1].C; C.S1.S[10].dens=100; } C.S1.S[9].select=1; C.S1.S[9].C=C.COL[1].C; C.S1.S[9].dens=100; C.doPlot(); } if((k==3)||(k==4)) { C1.P.MODE=0; C2.P.MODE=0; C3.P.MODE=0; C.S1.S[9].select=1; C.S1.S[9].C=C.COL[24].C; C.S1.S[9].dens=100; C1.repaint(); C2.repaint(); C3.repaint(); setScale(60,60,60); setOrigin(0,40,0,0,-140,40); C.T_LINK=1; C.P_LINK=1; C.MODE=3; C.parameter.POS=300; C.truncate.POS=254; C.s=C.getParameter(); C.TRUNCATE=1.0; for(int j=1;j<=30;j=j+1) { C.S1.A[2][j].select=1; if(k==4) { C.S1.A[2][j].C=C.COL[16].C; if((j>19)&&(j<27)) C.S1.A[2][j].C=C.COL[6].C; } if(k==3) C.S1.A[2][j].C=C.COL[17].C; C.S1.A[2][j].dens=100; } C.doPlot(); } if(k==5) { C1.P.MODE=1; C2.P.MODE=1; C3.P.MODE=1; C1.repaint(); C2.repaint(); C3.repaint(); setScale(70,80,70); setOrigin(0,40,0,40,-120,40); C.T_LINK=1; C.P_LINK=1; C.MODE=3; C.parameter.POS=100; C.s=C.getParameter(); C.truncate.POS=254; C.TRUNCATE=1.0; for(int j=1;j<=15;j=j+1) { C.S1.A[5][j].select=1; C.S1.A[5][j].dens=100; C.S1.A[5][31-j].dens=100; C.S1.A[5][31-j].select=1; if(j<=5) { C.S1.A[5][j].C=C.COL[9].C; C.S1.A[5][31-j].C=C.COL[23].C; } if((j>5)&&(j<=10)) { C.S1.A[5][j].C=C.COL[10].C; C.S1.A[5][31-j].C=C.COL[24].C; } if((j>10)&&(j<=15)) { C.S1.A[5][j].C=C.COL[6].C; C.S1.A[5][31-j].C=C.COL[27].C; } } C.S1.S[9].select=1; C.S1.S[9].C=C.COL[1].C; C.S1.S[9].dens=100; C.S1.S[15].select=1; C.S1.S[15].C=C.COL[1].C; C.S1.S[15].dens=100; C.doPlot(); } if((k==6)||(k==7)) { C1.P.MODE=1; C2.P.MODE=1; C3.P.MODE=1; C.T_LINK=1; C.P_LINK=1; C.MODE=3; C1.repaint(); C2.repaint(); C3.repaint(); setScale(60,60,60); setOrigin(0,0,0,0,-120,0); if(k==7) { setScale(300,200,200); setOrigin(0,0,-100,0,-240,0); } C.parameter.POS=100; C.truncate.POS=254; C.s=C.getParameter(); C.TRUNCATE=1.0; for(int j=1;j<=30;j=j+1) { C.S1.A[5][j].select=1; C.S1.A[5][j].C=C.COL[16].C; C.S1.A[5][j].dens=100; C.S2.A[5][j].select=1; C.S2.A[5][j].C=C.COL[16].C; C.S2.A[5][j].dens=100; } C.S1.S[9].select=1; C.S1.S[9].C=C.COL[1].C; C.S1.S[9].dens=100; C.S2.S[9].select=1; C.S2.S[9].C=C.COL[1].C; C.S2.S[9].dens=100; C.doPlot(); } if((k==8)||(k==9)) { C1.P.MODE=1; C2.P.MODE=1; C3.P.MODE=1; C1.repaint(); C2.repaint(); C3.repaint(); setScale(60,60,60); setOrigin(0,-40,10,-20,-120,-40); C.T_LINK=1; C.P_LINK=1; C.MODE=3; C.parameter.POS=500; if(k==8) C.truncate.POS=60; if(k==9) C.truncate.POS=254; C.s=C.getParameter(); C.TRUNCATE=C.getTruncate(); for(int j=1;j<=30;j=j+1) { C.S2.A[2][j].select=1; C.S2.A[2][j].C=C.COL[23].C; C.S2.A[2][j].dens=100; C.S2.A[5][j].select=1; C.S2.A[5][j].C=C.COL[2].C; C.S2.A[5][j].dens=100; } C.S2.S[9].select=1; C.S2.S[9].C=C.COL[13].C; C.S2.S[9].dens=100; C.doPlot(); } if(k==10) { C1.P.MODE=0; C2.P.MODE=0; C3.P.MODE=0; C1.repaint(); C2.repaint(); C3.repaint(); setScale(80,80,80); setOrigin(0,0,0,0,-150,0); C.T_LINK=1; C.P_LINK=1; C.MODE=2; C.parameter.POS=400; C.truncate.POS=254; C.s=C.getParameter(); C.TRUNCATE=1.0; for(int j=1;j<=30;j=j+1) { C.S1.A[6][j].select=1; C.S1.A[6][j].C=C.COL[16].C; C.S1.A[6][j].dens=100; C.S2.A[6][j].select=1; C.S2.A[6][j].C=C.COL[14].C; C.S2.A[6][j].dens=100; } C.doPlot(); } } void setPage() { for(int i=0;i<=39;++i) St[i]=""; D.pix=0; D.repaint(); GALLERY=0; if(MESSAGE==0) { St[0]="Introduction"; St[1]="I wrote this applet to illustrate my new proof"; St[2]="of the Goldman-Parker conjecture. My original"; St[3]="proof was complicated, but the new proof is"; St[4]="simple enough to explain, fairly completely,"; St[5]="with an applet. The applet does not contain"; St[6]="a complete rigorous proof, but it does explain"; St[7]="all the essential ideas in the proof. If you"; St[8]="want to see the proof in full, download my"; St[9]="paper 'A Better Proof of the G.-P. Conjecture'."; St[10]="My idea is that the applet and the paper should"; St[11]="complement each other, with the applet giving"; St[12]="more intuition and the paper giving more rigor."; St[13]="This text is divided into 6 parts:"; St[14]="1. tutorial: explains how to use the applet."; St[15]="2. math: explains the mathematics."; St[16]="3. objects: explains the objects you plot."; St[17]="4. coords: explains the coordinate systems."; St[18]="5. the conjecture: explains the conjecture."; St[19]="6. the proof: explains the proof of the conjecture."; St[20]="You can read these in any order, but the above"; St[21]="order is a good one. Another approach: after"; St[22]="learning how to use the applet, read the conjecture"; St[23]="and proof, clicking on the hypertext links to"; St[24]="learn about unfamiliar material as you go along."; St[25]="This applet does not run equally well on all"; St[26]="browsers. It the applet appears to be running"; St[27]="poorly you can try to improve things by"; St[28]="clicking on the 'modify' button and"; St[29]="then using the orange keys to change some"; St[30]="features of the applet."; St[32]="I welcome your comments or suggestions about the"; St[33]="applet. (email: res@math.brown.edu)."; St[35]="What to do now? I recommend that you click"; St[36]="the 'tutorial' key and take the tutorial."; St[45]="where in math?"; St[46]="acknowledgements"; St[47]=""; St[48]=""; L[5].future=199; L[6].future=400; L[7].future=0; L[8].future=0; depth=0; history[0]=0; history[1]=0; } if(MESSAGE==110) { St[0]="Hermitian geometry"; St[1]="Summary:"; St[2]="The Hermitian geometry we have in mind"; St[3]="is the geometry of C^3 and CP^2"; St[4]="When C^3 is equipped with the standard form"; St[5]="of type (2,1). Equipped with this form"; St[6]="C^3 is usually denoted by C^(2,1)."; St[7]="The group of form preserving complex linear"; St[8]="transformations of C^(2,1) is called SU(2,1)."; St[9]="This group acts naturally on CP^2, and"; St[10]="the group action there is called PU(2,1)."; St[11]="To understand this stuff, you need to learn"; St[12]="about these topics:"; St[13]="1. The standard form of type (2,1)."; St[15]="2. What is CP^2."; St[17]="3. What is PU(2,1)"; St[19]="4. element classification in PU(2,1)."; St[20]="a. elliptics"; St[21]="b. parabolics."; St[22]="c. loxodromics."; St[23]="d. C-reflections."; St[45]="1. type (2,1) form"; St[46]="2. CP^2"; St[47]="PU(2,1)"; St[48]="element classification"; L[5].future=221; L[6].future=781; L[7].future=220; L[8].future=111; } if(MESSAGE==111) { St[0]="element classification"; St[1]="The elements of PU(2,1) are classified into"; St[2]="3 types:"; St[4]="elliptic elements"; St[5]="parabolic elements"; St[6]="loxodromic elements"; St[8]="A C-reflection is a special kind of elliptic"; St[9]="element pertinent to our constructions."; St[45]="elliptic elements."; St[46]="parabolic elements"; St[47]="loxodromic elements"; St[48]="C-reflections"; L[5].future=360; L[6].future=361; L[7].future=362; L[8].future=350; } if(MESSAGE==120) { St[0]="CR objects."; St[1]="Our constructions use some special objects"; St[2]="in S^3:"; St[4]="C-circles and C-arcs."; St[5]="R-circles and R-arcs."; St[6]="The contact structure in S^3."; St[8]="All these objects are respected by the action"; St[9]="of PU(2,1) on S^3."; St[45]="C-circles and C-arcs"; St[46]="R-circles and R-arcs"; St[47]="contact structure"; St[48]="PU(2,1)"; L[5].future=210; L[6].future=211; L[7].future=770; L[8].future=220; } if(MESSAGE==150) { St[0]="R-spheres"; St[1]="The basic idea of our proof is to construct"; St[2]="R-spheres S0,S1,S2 corresponding to each of"; St[3]="the generators of the triangle group"; St[4]="Actually we just need to consider S1 and S2."; St[6]="An R-sphere is foliated by R-arcs, each of"; St[7]="which connects a point on one C-circle to a"; St[8]="point on another one, according to a certain"; St[9]="rule. Thus, to understand R-spheres you need"; St[10]="to understand R-circles, R-arcs"; St[11]="C-circles, and C-arcs"; St[13]="If you already understand these basic curves,"; St[14]="click on the S1 button to see the construction"; St[15]="of S1. The other two R-spheres are constructed"; St[16]="in the same way, once the indices are permuted."; St[17]="Click 'show me the money' to see S1 and S2"; St[18]="drawn in 3 coordinate systems."; St[19]="I introduced R-spheres, as they appear here, in"; St[20]="my paper 'Degenerating the Complex Hyperbolic"; St[21]="Ideal Triangle Groups' (Acta #186, 2001)"; St[45]="C-circles and C-arcs"; St[46]="R-circles and R-arcs"; St[47]="triangle groups"; St[48]="S1"; L[5].future=210; L[6].future=211; L[7].future=280; L[8].future=250; } if(MESSAGE==199) { St[0]="where in math?"; St[1]="This page is supposed to answer the"; St[2]="question, 'how does the G.P. conjecture"; St[3]="fit into the world of mathematics?'"; St[4]="Here is a list of topics, with each"; St[5]="one being a subfield of the previous one."; St[6]="geometry and topology"; St[7]="infinite symmetry groups."; St[8]="discrete subgroups of lie groups"; St[9]="isometry groups of the complex hyperbolic plane."; St[10]="complex hyperbolic triangle groups."; St[11]="complex hyperbolic C-reflection ideal triangle groups."; St[13]="In short, the G.P. conjecture is the statement"; St[14]="which classifies complex hyperbolic C-reflection"; St[15]="ideal triangle groups up to discreteness."; St[16]="The significance of the conjecture is that"; St[17]="these groups are some of the simplest"; St[18]="nontrivial discrete isometry groups of the"; St[19]="complex hyperbolic plane. Understanding"; St[20]="their discreteness is a foundational"; St[21]="step in understanding complex hyperbolic"; St[22]="discrete groups."; St[25]="For me the main significance of the"; St[26]="conjecture is that it was a simply"; St[27]="stated and geometrically interesting problem"; St[28]="that I could actually solve."; St[45]=""; St[46]=""; St[47]=""; St[48]=""; L[5].future=199; L[6].future=199; L[7].future=199; L[8].future=199; D.ACTIVE=1; D.repaint(); } if(MESSAGE==200) { St[0]="tutorial part 1"; St[1]="This is a 13 step tutorial. Once you finish"; St[2]="this page of the tutorial, click on the"; St[3]="'tutorial, part 2' key to read the next page."; St[4]="After that, click on 'tutorial, part 3'."; St[6]="1. The DOCUMENTATION TEXT in the window"; St[7]="above this one documents the rest of the applet. "; St[8]="Move the mouse over the other parts of the"; St[9]="applet and watch this text change. (Don't"; St[10]="(worry right now what the documentation "; St[11]="text says.) You can turn on/off the text"; St[12]="by clicking on it or by using the buttons"; St[13]="2. Move the mouse to multicolored cluster of"; St[14]="35 squares. This is the COLOR SELECTOR."; St[15]="Click on some of the 35 little squares and"; St[16]="watch the 'color' rectangle change color."; St[18]="3. Move the mouse over into the long black bar"; St[19]="labelled C1. This bar is part of the cluster"; St[20]="of rectangles, outlined in blue, called the"; St[21]="OBJECT SELECTOR 1. Now click on the"; St[22]="C1 bar. Notice that it changes into the"; St[23]="same color that you last selected with the color"; St[24]="selector. Try to turn the C1 bar red."; St[25]="4. Move the mouse to the magenta PLOT BUTTON"; St[26]="and press it. A red curve appears in the 3"; St[27]="coordinate windows. You are seeing plots of"; St[28]="C1 in 3 coordinate systems. (Don't worry now"; St[29]="about what C1 is or what the coordinates are.)"; St[31]="5. Click the S12A button."; St[32]="Now click the '1' button, then plot."; St[33]="Now click the '2' button, then replot."; St[34]="Plotting with the 'N' button produces"; St[35]="a picture with N times the detail as"; St[36]="plotting with the '1' button."; St[45]="tutorial part 2"; St[46]=""; St[47]=""; St[48]=""; L[5].future=201; L[6].future=200; L[7].future=200; L[8].future=200; D.ACTIVE=1; D.repaint(); } if(MESSAGE==201) { St[0]="tutorial part 2"; St[1]="6. Plot the objects C1,C2,E1,E2 all in"; St[2]="different colors. C1 and E2 are part"; St[3]="C1, E2 are part of OBJECT SELECTOR 1,"; St[4]="the left cluster of black rectangles."; St[5]="C2, E1 are part of OBJECT SELECTOR 2,"; St[6]="the right cluster of black rectangles."; St[7]="Object selector N controls the plotting"; St[8]="of objects associated to a sphere SN. The"; St[9]="objects E0,Q0,HQ0 are associated to"; St[10]="both S1 and S2. Not all the objects"; St[11]="are actually subsets of S1 and S2."; St[13]="7. Click the magenta SHOW ME THE MONEY"; St[14]="button. Wait for the plot. You are seeing"; St[15]="plots of the 2 spheres:"; St[16]="S1 is in red."; St[17]="S2 is in blue."; St[19]="8. Click the magenta TRUNCATE ARCS bar and"; St[20]="wait for the replot. Repeat, clicking"; St[21]="different spots along the bar."; St[22]="This bar controls the extent to which the"; St[23]="arcs of S21, etc. are drawn."; St[25]="9. Click on the magenta ERASE BUTTON and note"; St[26]="that it turns black. Click several times. You"; St[27]="are turning the erase button on/off. When"; St[28]="the erase button is highlighted you can de-select"; St[29]="objects. Try de-selecting 3 thin blue"; St[30]="rectangles from object selector 1."; St[31]="These should all be colored, if you've just"; St[32]="finished steps 7&8. That's the erase button."; St[45]="tutorial part 3"; St[46]=""; St[47]=""; St[48]=""; L[5].future=202; L[6].future=201; L[7].future=201; L[8].future=201; } if(MESSAGE==202) { St[0]="tutorial part 3"; St[1]="10. Erase everything, then plot C1. Move"; St[2]="the mouse to the magenta 'select parameter' bar."; St[3]="This is the PARAMETER SELECTOR. The plotted"; St[4]="objects depend on a parameter which you change"; St[5]="by clicking on this bar. Try plotting the"; St[6]="same object at different parameters. See"; St[7]="the documentation for more details."; St[9]="11. Move the mouse to the magenta PLOT DENSITY"; St[10]="SELECTOR. This bar lets you change the"; St[11]="plotting density. Read the documentation. Try"; St[12]="plotting the same object at different densities."; St[13]="12. Now let's learn the ELEV plot window."; St[14]="(PLAN and HYP operate in the same way.)"; St[15]="(A) Erase everything, then plot C1 and C2."; St[16]="(B) Click the blue 'aspect' bar."; St[17]="(C) Click the blue 'reset' button."; St[18]="(D) Click the blue 'on(off)' button. Repeat."; St[19]="(E) Click the blue 'ELEV2(ELEV1) button'. Repeat."; St[20]="(F) Move the white line in the blue 'scale'"; St[21]="bar to the left of center. Click on the black part"; St[22]="of the plot window and watch the image rescale."; St[23]="(G) Repeat (F), this time with the white line"; St[24]="to the right of the center."; St[25]="13. The orange buttons at the bottom of the applet"; St[26]="change various features of the applet. As an"; St[27]="exercise, use the color selector, the orange"; St[28]="buttons, and the instructions from the"; St[29]="documentation text to make this window yellow"; St[30]="with green text. (The left orange 'reset'"; St[31]="button returns you to the original color scheme.)"; St[33]="(final word) If you click a button and"; St[34]="there is no response, just wait. If you"; St[35]="click repeatedly before waiting for a"; St[36]="response, you can jam the applet, you fool."; St[48]=""; St[46]=""; St[47]=""; St[45]=""; L[8].future=202; L[6].future=202; L[7].future=202; L[5].future=202; } if(MESSAGE==205) { St[0]="objects, part 1"; St[1]="This 12 step tutorial assumes you know how"; St[2]="to operate the applet. If you don't know how"; St[3]="to operate the applet, you should click on"; St[4]="the 'tutorial' button and read that."; St[5]="Also, it is a good idea before reading this"; St[6]="section to take a glance at the notation."; St[7]="You can access the notation at any time"; St[8]="using the 'notation' button."; St[9]="Once you are done with this page, click"; St[10]="the 'objects, part 2' button to read the"; St[11]="next page."; St[13]="1. C-circles:"; St[14]="If you don't know what C-circles are, click"; St[15]="on the link and read about them now."; St[16]="The objects C1,C2,E0,E1,E2 are C-circles."; St[17]="The images of C-circles in PLAN1 and HYP1."; St[18]="are round circles (or points.) Plot all"; St[19]="the C-circles and look in PLAN1 and HYP1"; St[25]="2. C-arcs:"; St[26]="Qj is an arc of Ej for j=0,1,2."; St[27]="Plot Q0,Q1,Q2 using light red, blue, green"; St[28]="Plot E0,E1,E2 using dark red, blue, green."; St[29]="Plot HQ0 in dark grey."; St[30]="Move the parameter towards the right end"; St[31]="As you do this, watch Q0,Q1,Q2 shrink to points."; St[32]="HQ0 is not a C-arc, but its closely related"; St[33]="to E0 and Q0. Click the link below to read"; St[34]="more about HQ0."; St[45]="C-circles and C-arcs"; St[46]="E0 and Q0"; St[47]="objects, part 2"; St[48]=""; L[5].future=210; L[6].future=800; L[7].future=206; L[8].future=205; } if(MESSAGE==206) { St[0]="objects, part 2"; St[1]="3. R-circles:"; St[2]="If you don't know what an R-circle is, click"; St[3]="on the link and read about it now."; St[4]="The figure above shows what we call a"; St[5]="'short-long-short combo' or 'SLSC'."; St[6]="There are 120 SLSCs on the object selectors."; St[7]="These are grouped into 4 groups of 30."; St[8]="Each SLSC is an R-circle. The image"; St[9]="of an SLSC in PLAN1 is a lemniscate."; St[10]="A lemniscate looks like a figure 8."; St[11]="Plot an SLSC. Now plot one from each"; St[12]="of the 4 groups. Vary the parameter; replot."; St[13]="4. R-arcs"; St[14]="Each SLSC is segmented into 3-pieces. Each"; St[15]="represents an R-arc. Plot some more SLSCs,"; St[16]="using a different color for each of the segments,"; St[17]="as in the figure above. Look in PLAN1."; St[19]="5. SLSCs labelled by S10A:"; St[20]="Consider the 15 SLSCs clustered around the"; St[21]="label S10A. (Functionally, this label"; St[22]="only turns on the 'long part' of each SLSC."; St[23]="We'll get to that later.)"; St[24]="Each SLSC in the S10A group intersects"; St[25]="E0-Q0 once, Q0 once, and C1 once."; St[26]="Let X be an SLSC. Plot X."; St[27]="Note that the double point of PLAN1(X) is"; St[28]="is 0=PLAN1(E0). This is a consequence of"; St[29]="the fact that X and E0 intersect twice."; St[30]="Looking in HYP1 we get the more refined picture"; St[31]="that one intersection point lies in E0-Q0 and"; St[32]="one in Q0. We can also see that HYP1(X) is a"; St[33]="geodesic perpendicular to the geodesic which"; St[34]="connects the endpoints of HYP1(Q0)."; St[45]="R-circles and R-arcs"; St[46]=""; St[47]="objects, part 3"; St[48]=""; L[5].future=211; L[6].future=206; L[7].future=207; L[8].future=206; D.pix=1; D.ACTIVE=0; D.repaint(); } if(MESSAGE==207) { St[0]="objects, part 3"; St[1]="6. Amplifying Step 6:"; St[2]="For each point s on C1 there is (it turns out)"; St[3]="a unique R-circle X(s) with these properties:"; St[4]="A. s is contained in X(s)."; St[5]="B. X(s) intersects E0 twice."; St[6]="C. HYP(X(s)) is a geodesic perpendicular to the"; St[7]="geodesic connecting the endpoints of HYP1(Q0)."; St[8]="My preprint gives a proof. For 30 choices of"; St[9]="s, the R-circles X(s) are labelled by the SLSCs"; St[10]="associated to (E0,Q0;C1)."; St[13]="7. The long part:"; St[14]="Let X be an SLSC as in steps 6 and 7. The"; St[15]="part of X represented by the middle (long)"; St[16]="rectangle is the R-arc which connects C1 to Q0"; St[17]="while avoiding E0-Q0. Plot a long part of X &"; St[18]="also plot C1 and Q0. Look at the picture."; St[19]="in PLAN1 and HYP."; St[21]="8. S10"; St[22]="S10=S10B u. S10A."; St[23]="Plot this object and see that it is"; St[24]="An embedded disk. The arcs you see"; St[25]="are R-arcs, and they are controlled"; St[26]="by the long parts of the SLSCs associated."; St[27]="to (E0,Q0;C1)"; St[28]="If you want to see the structure more"; St[29]="clearly, use the 'truncate arcs' bar"; St[30]="after plotting the picture."; St[31]="to read more about S10 click the link."; St[45]="S10"; St[46]=""; St[47]="objects, part 4"; St[48]=""; L[5].future=260; L[6].future=207; L[7].future=208; L[8].future=207; D.pix=1; D.ACTIVE=0; D.repaint(); } if(MESSAGE==208) { St[0]="objects, part 4"; St[1]="9. This brings us to S21. This object"; St[2]="is the image of S10 under the map I1,"; St[3]="one of the generators of the triangle group."; St[4]="Plot this object and look in PLAN1 or PLAN2."; St[5]="You can see, more clearly than for S10,"; St[6]="that it is an embedded disk."; St[8]="10. S1 = S10 u. S21."; St[9]="These are two disks which meet only at C1."; St[10]="(Thus S1 is an embedded sphere. Compare Property 1)"; St[11]="You can see how the disks intersect by plotting"; St[12]="both and looking in PLAN2."; St[13]="11. S2 = S20 u. S21."; St[14]="S2 has the same description as S1, but with"; St[15]="indices 1 and 2 swapped."; St[16]="When you push 'Show me the money' it plots"; St[17]="S1 and S2. Do this. Look at the picture in"; St[18]="ELEV2. Note that ELEV2(S1) and ELEV(S2)"; St[19]="seem to only intersect in a single point."; St[20]="This fact is the key to the GP conjecture."; St[22]="12. R1 is the unique R-circle contained in S1."; St[23]="R1 intersects each hemisphere of S1 in a pair"; St[24]="of R-arcs. R1 is called the R-axis of S1."; St[25]="Plot pictures of R1 and S1 and you can see that"; St[26]="R1 is an axis of bilateral symmetry for S1."; St[27]="If you want to see this bilateral symmetry."; St[28]="go to the gallery and push button 5."; St[29]="R2 plays the same role for S2."; St[31]="Remark: The objects NS(...) and SS(..)"; St[32]="are made from the short parts of the SLSCs."; St[33]="These objects are not actually"; St[34]="subsets of the spheres S1 and S2. However,"; St[35]="they help explain the structure of S1 and S2."; St[45]="S10"; St[46]="triangle groups"; St[47]="Property 1"; St[48]=""; L[5].future=260; L[6].future=280; L[7].future=910; L[8].future=208; D.pix=1; D.ACTIVE=0; D.repaint(); } if(MESSAGE==210) { St[0]="C-circles and C-arcs"; St[1]="A C-circle is the intersection of a complex line"; St[2]="with S^3. This object is a round circle."; St[3]="Every two distinct points in S^3 determine a"; St[4]="unique C-circle."; St[5]="The group PU(2,1) permutes the C-circles."; St[7]="A C-arc is a proper arc of a C-circle."; St[18]="To learn more C-circles, see Bill's book."; St[45]="PU(2,1)"; St[46]="Bill's book"; St[47]=""; St[48]=""; L[5].future=220; L[6].future=240; L[7].future=211; L[8].future=211; } if(MESSAGE==211) { St[0]="R-circles and R-arcs"; St[1]="An R-circle is a curve in S^3 which is PU(2,1)"; St[2]="equivalent to the circle R^2 # S^3."; St[3]="(Here # stands for intersection.)"; St[4]="Not all R-circles are round circles."; St[5]="An R-arc is a proper arc of an R-circle."; St[7]="Given 2 distinct points in S^3 there is a"; St[8]="circle's worth of R-arcs connecting them."; St[9]="The union of these R-arcs is an analytically"; St[10]="embedded sphere called a spinal sphere."; St[18]="To learn more about R-circles, see Bill's book."; St[45]="PU(2,1)"; St[46]="Bill's book"; St[47]=""; St[48]=""; L[5].future=220; L[6].future=240; L[7].future=211; L[8].future=211; } if(MESSAGE==220) { St[0]="PU(2,1)"; St[1]="PU(2,1) has many equivalent definitions. Here"; St[2]="we will give 4 such definitions."; St[4]="1. PU(2,1) is the group of bi-holomorphic"; St[5]="automorphisms of the open unit ball in C^2."; St[7]="2. PU(2,1) is the group of complex projective"; St[8]="automorphisms of CP^2 which stabilize S^3,"; St[9]="when S^3 is considered as a subset of CP^2."; St[11]="3. PU(2,1) is the projectivization of SU(2,1)."; St[12]="Concretely this means that PU(2,1) is the group"; St[13]="of maps (z,w) --> (z',w'), having the form"; St[14]="z'=t1/t3;"; St[15]="w'=t2/t3;"; St[16]="tj=Aj1 z + Aj2 w + Aj3."; St[17]="The 3x3 matrix (Aij) preserves the"; St[18]="standard Hermitian form of type (2,1)"; St[19]="PU(2,1) is an 8-dimensional real lie"; St[20]="group, acting transitively on the open"; St[21]="unit ball in C^2. The open unit ball"; St[22]="admits a PU(2,1) invariant metric known"; St[23]="the complex hyperbolic metric. When"; St[24]="equipped with this metric, the open unit"; St[25]="ball is denoted CH^2. Thus one final"; St[26]="definition of PU(2,1) is:"; St[28]="4. PU(2,1) is the holomorphic isometry"; St[29]="group of CH^2."; St[36]="See Bill's book for more information."; St[45]="Bill's book"; St[46]="type (2,1) form"; St[47]=""; St[48]=""; L[5].future=240; L[6].future=221; L[7].future=220; L[8].future=220; } if(MESSAGE==221) { St[0]="type (2,1) form"; St[1]="Given two vectors v and w in C3 define"; St[3]="=v1 [w1] + v2 [w2] - v3[w3]."; St[5]="Here v=(v1,v2,v3) and w=(w1,w2,w3) and"; St[7]="[z] denotes the complex conjugate of z"; St[9]="To say that a matrix A preserves this form"; St[10]="is to say that = for all"; St[11]="choices of v and w."; St[13]="The form above is the standard Hermitian"; St[14]="form of type (2,1)."; St[18]="See Bill's book for more information."; St[45]="Bill's book"; St[46]=""; St[47]=""; St[48]=""; L[5].future=240; L[6].future=221; L[7].future=221; L[8].future=221; } if(MESSAGE==240) { St[0]="Bill's book"; St[1]="Bill wrote a great book on this subject:"; St[3]="William M. Goldman"; St[4]="Complex Hyperbolic Geometry"; St[5]="Oxford University Press, 1999"; St[7]="The ISBN number is 0 19 853793 X"; St[45]=""; St[46]=""; St[47]=""; St[48]=""; L[5].future=240; L[6].future=240; L[7].future=240; L[8].future=240; } if(MESSAGE==250) { St[0]="S1"; St[1]="S1 is a piecewise analytic sphere embedded"; St[2]="in S^3. This object is the union of two"; St[3]="piecewise analytic embedded disks:"; St[5]="S10 and S21"; St[7]="S1 and its companion S2 are the basic objects"; St[8]="in the proof of the Goldman-Parker Conjecture"; St[45]="S10"; St[46]="S12"; St[47]="S2"; St[48]=""; L[5].future=260; L[6].future=261; L[7].future=251; L[8].future=250; } if(MESSAGE==251) { St[0]="S2"; St[1]="S2 is a piecewise analytic sphere embedded"; St[2]="in S^3. This object is the union of two"; St[3]="piecewise analytic embedded disks:"; St[5]="S20 and S21"; St[7]="S2 and its companion S1 are the basic objects"; St[8]="in the proof of the Goldman-Parker Conjecture"; St[45]="S20"; St[46]="S21"; St[47]="S1"; St[48]=""; L[5].future=262; L[6].future=263; L[7].future=250; L[8].future=251; } if(MESSAGE==260) { St[0]="S10"; St[1]="HARMONIC POSITION:"; St[2]="4 cyclically ordered points a1,b1,a2,b2"; St[3]="on a C-circle are in harmonic position if"; St[4]="there is a conformal automorphism of the"; St[5]="complex line containing the C-circle which"; St[6]="maps these points to the vertices of a square."; St[8]="MAIN CONSTRUCTION"; St[9]="Given x in C1 there is a unique R-circle R(x)"; St[10]="with the following properties:"; St[11]="R(x) contains x and intersects E0 twice,"; St[12]="once in Q0 and once in E0-Q0. Let a1 and"; St[13]="a2 be these intersection points."; St[14]="Let b1 and b2 be the endpoints of Q0. Then"; St[15]="The 4 points a1,b1,a2,b2 are in harmonic pos."; St[16]="S(E0,Q0;x) is defined as the R-arc of R(x)"; St[17]="which connects x to Q0."; St[19]="END OF CONSTRUCTION:"; St[20]="S10 is defined as the"; St[21]="union, over x in C1, of the R-arcs S(E0,Q0;x)."; St[22]="If you already know how to use the applet"; St[23]="you can plot this object, in whole or part"; St[24]="and see what it looks like."; St[26]="SEE THE PICTURE"; St[27]="1. Plot C1 and S10."; St[28]="2. Set the 'truncate arcs' slider to auto. replot"; St[29]="3. Click on the left part of the 'truncate arcs'"; St[30]="slider and incrementally move it to the right."; St[31]="Watch S10 grow out of C1."; St[32]="Try the plot at different parameters."; St[45]="C-circles and C-arcs"; St[46]="R-circles and R-arcs"; St[47]="PU(2,1)"; St[48]="triangle group"; L[5].future=210; L[6].future=211; L[7].future=220; L[8].future=280; D.pix=2; D.ACTIVE=0; D.repaint(); } if(MESSAGE==261) { St[0]="S20"; St[1]="This object has the same definition as"; St[2]="S10, but with the indices"; St[3]="1 and 2 switched"; St[45]="S10"; St[46]=""; St[47]=""; St[48]=""; L[5].future=260; L[6].future=261; L[7].future=261; L[8].future=261; } if(MESSAGE==262) { St[0]="S21"; St[1]="This object has the same definition as"; St[2]="S10, but with the indices"; St[3]="0 and 2 switched."; St[5]="Alternatively, S21=I1(S10)."; St[6]="Try plotting S21 and doing the same"; St[7]="business with the 'truncate arcs' slider"; St[8]="that we suggested for S10."; St[45]="S10"; St[46]=""; St[47]=""; St[48]=""; L[5].future=260; L[6].future=262; L[7].future=262; L[8].future=262; } if(MESSAGE==263) { St[0]="S21"; St[1]="This object has the same definition as"; St[2]="S10, but with the indices"; St[3]="permuted as 0->1->2"; St[45]="S10"; St[46]=""; St[47]=""; St[48]=""; L[5].future=260; L[6].future=263; L[7].future=263; L[8].future=263; } if(MESSAGE==270) { St[0]="coords."; St[1]="There are 6 coordinate systems used:"; St[3]="1a. ELEV1; 1b. ELEV2"; St[4]="2a. PLAN1; 2b. PLAN2"; St[5]="3a. HYP1; 3b HYP2"; St[7]="These coorespond to the 3 windows on"; St[8]="the applet with the same names."; St[9]="The left window toggles ELEV1/ELEV2."; St[10]="The middle window toggles PLAN1/PLAN2."; St[11]="right window toggles HYP1/HYP2."; St[12]="These coordinates are all maps from S^3,"; St[13]="the 3-sphere, to surfaces. Click on"; St[14]="the buttons below to get more info"; St[15]="about the coordinate systems."; St[17]="There is an analogy between the"; St[18]="coordinate systems and the three planar"; St[19]="projections of cylindrical coordinates."; St[20]="Let (r,theta,z) be the standard cylindrical"; St[21]="coordinate system in R^3. Then"; St[22]="ELEV is like projection to the (theta,z) cylinder."; St[23]="PLAN is like projection to the (r,theta) plane"; St[24]="HYP is like projection to the (r,z) plane."; St[25]="The 3 projections ELEV2, HYP2, PLAN2"; St[26]="are perfectly adapted to the geometric structure"; St[27]="of our construction. The coordinate systems"; St[28]="ELEV1, HYP1, PLAN1 are not quite as well"; St[29]="adapted to our construction, but they are"; St[30]="more familiar coordinate systems and sometimes"; St[31]="it is easier to compute in them."; St[32]="Also, the coordinates HYP1 and PLAN1 are"; St[33]="less computationally intensive, and hence"; St[34]="the pictures in these coordinates are plotted"; St[35]="more quickly than in HYP2 and PLAN2."; St[45]="PLAN1 and PLAN2"; St[46]="ELEV1 and ELEV2"; St[47]="HYP1 and HYP2"; St[48]=""; L[5].future=275; L[6].future=276; L[7].future=777; L[8].future=270; } if(MESSAGE==275) { St[0]="PLAN1 and PLAN2"; St[1]="Both coord. systems are based on E0 and Q0."; St[2]="PLAN1 is based on 1 special point contained"; St[3]="in the interior of Q0. PLAN1 is naturally"; St[4]="adapted to the group of parabolic elements"; St[5]="which stabilize this special point."; St[6]="This stabilizer group does not play a direct"; St[7]="role in our construction and for this reason"; St[8]="PLAN1 is not quite adapted to our constructions."; St[9]="However, in practice it is much easier to"; St[10]="compute in PLAN1."; St[12]="PLAN2 is based on the 2 endpoints of Q0."; St[13]="PLAN2 is naturally adapted to the group of"; St[14]="loxodromic elements which stabilizer Q0."; St[15]="This coordinate system is theoretically much"; St[16]="nicer, for our construction, but but we"; St[17]="don't have a good handle on how to compute"; St[18]="things in it."; St[19]="To give just one example. The images of"; St[20]="C-circles in PLAN1 are round circles."; St[21]="The images of C-circles in PLAN2 are mystery"; St[22]="curves. We don't even have a formula!"; St[23]="Neither coordinate system plays a big role"; St[24]="in our proof. ELEV2 is the main system."; St[26]="We note that PLAN1 and PLAN2 converge"; St[27]="to each other as the parameter s tends to"; St[28]="sqrt(125/3). The point is that the 2 points"; St[29]="on which PLAN2 is based coalesce to the 1"; St[30]="point on which PLAN1 is based."; St[31]="Try it out on the applet."; St[45]="PLAN1"; St[46]="PLAN2"; St[47]="E0 and Q0"; St[48]="C-Circles and C-arcs"; L[5].future=701; L[6].future=785; L[7].future=800; L[8].future=210; } if(MESSAGE==276) { St[0]="ELEV1 and ELEV2"; St[1]="Both coord. systems are based on E0 and Q0."; St[2]="ELEV1 is based on 1 special point contained"; St[3]="in the interior of Q0. ELEV1 is naturally"; St[4]="adapted to the group of parabolic elements"; St[5]="which stabilize this special point."; St[6]="This stabilizer group does not play a direct"; St[7]="role in our construction and for this reason"; St[8]="ELEV1 is not quite adapted to our constructions."; St[9]="However, in practice it is much easier to"; St[10]="compute in ELEV1."; St[12]="ELEV2 is based on the 2 endpoints of Q0."; St[13]="ELEV2 is naturally adapted to the group of"; St[14]="loxodromic elements which stabilizer Q0."; St[15]="This coordinate system is theoretically much"; St[16]="nicer, for our construction, but but we"; St[17]="don't have a good handle on how to compute"; St[18]="things in it."; St[19]="In spite of the competing benefits of the"; St[20]="two coordinate systems, we overwhelmingly use"; St[21]="ELEV2 in our proof. ELEV2 is the main"; St[22]="coordinate system in the applet and the other"; St[23]="coordinate systems, including ELEV1, are added"; St[24]="mainly to complement ELEV2"; St[26]="We note that ELEV1 and ELEV2 converge"; St[27]="to each other as the parameter s tends to"; St[28]="sqrt(125/3). The point is that the 2 points"; St[29]="on which ELEV2 is based coalesce to the 1"; St[30]="point on which ELEV1 is based."; St[31]="Try it out on the applet."; St[32]="Actually, the convergence is only up to"; St[33]="a scaling factor in the vertical direction."; St[34]="I adjusted the scaling factor by hand."; St[45]="ELEV1"; St[46]="ELEV2"; St[47]="E0 and Q0"; St[48]="C-Circles and C-arcs"; L[5].future=924; L[6].future=700; L[7].future=800; L[8].future=210; } if(MESSAGE==280) { St[0]="triangle groups"; St[1]="In this applet, 'triangle group' always stands"; St[2]="for complex hyperbolic reflection ideal triangle"; St[3]="group. Such a group is constructed as follows:"; St[4]="Let p0,p1,p2 be three points in S^3"; St[5]="which do not all lie in the same complex line."; St[6]="Let Cj be the complex line which contains"; St[7]="p(j-1) and p(j+1), with indices taken mod 3."; St[8]="Let Ij be the C-reflection fixing Cj. Then"; St[9]="The triangle group is the group generated by"; St[10]="I0,I1 and I2."; St[12]="We can get the complete family of groups"; St[13]="up to conjugation in PU(2,1), by taking"; St[15]="p0=(b,[b]);"; St[16]="p1=(b,b);"; St[17]="p2=([b],[b])"; St[19]="Here b=(s+i)/sqrt(2+s^2) and"; St[20]="[b] is the complex conjugate of b."; St[22]="The parameter is s and the parameter"; St[23]="range of interest is [0,sqrt(125/3))."; St[24]="In this range the product I0.I1.I2 is loxodromic."; St[45]="PU(2,1)"; St[46]="C-reflections"; St[47]=""; St[48]="loxodromic elements"; L[5].future=220; L[6].future=350; L[7].future=280; L[8].future=362; D.pix=3; D.ACTIVE=0; D.repaint(); } if(MESSAGE==300) { St[0]="the conjecture"; St[1]="The Goldman-Parker Conjecture classifies "; St[2]="the complex hyperbolic ideal reflection"; St[3]="triangle groups according to discreteness."; St[5]="Bill Goldman and John Parker made their"; St[6]="Conjecture in [GP] and there made partial"; St[7]="progress on it."; St[9]="In 1997 I found a computer-aided proof of"; St[10]="the conjecture, which I published in [S1]."; St[11]="The proof was quite complicated."; St[13]="This year (2004) I found a much better"; St[14]="proof, which I've written down in [S2]."; St[15]="This applet is based on the material in [S2]"; St[17]="To read about the precise statement of the"; St[18]="conjecture, click the link below."; St[19]="REFERENCES:"; St[21]="[GP] W. Goldman and J.R. Parker,"; St[22]="Complex Hyperbolic Triangle Groups,"; St[23]="J. reine agnew Math. #425, 1992"; St[25]="[S1] R.E. Schwartz,"; St[26]="Ideal Triangle Groups, Dented Tori, and"; St[27]="Numerical Analysis'."; St[28]="Annals of Math #153, 2001"; St[30]="[S2] R.E. Schwartz,"; St[31]="A Better Proof of the Goldman-Parker Conj."; St[32]="preprint, 2004"; St[45]="triangle groups"; St[46]="precise statement"; St[47]=""; St[48]=""; L[5].future=280; L[6].future=500; L[7].future=300; L[8].future=300; } if(MESSAGE==350) { St[0]="C-reflections"; St[1]="A C-reflection is a certain kind of order 2"; St[2]="element in PU(2,1). Here are 2 equivalent:"; St[3]="definitions:"; St[5]="1. A C-reflection is an element conjugate"; St[6]="in PU(2,1) to the map (z,w) --> (z,-w)."; St[8]="2. A C-reflection is an involution which fixes"; St[9]="A C-circle."; St[11]="The C-reflections are the building blocks of the"; St[12]="triangle groups."; St[45]="PU(2,1)"; St[46]="C-circles and C-arcs"; St[47]="triangle groups"; St[48]=""; L[5].future=220; L[6].future=210; L[7].future=280; L[8].future=350; } if(MESSAGE==360) { St[0]="elliptic elements"; St[1]="An elliptic element of PU(2,1) is"; St[2]="an element which fixes a point inside"; St[3]="the open unit ball in C^2."; St[45]="PU(2,1)"; St[46]="parabolic elements"; St[47]="loxodromic elements"; St[48]="Bill's book"; L[5].future=220; L[6].future=361; L[7].future=362; L[8].future=240; } if(MESSAGE==361) { St[0]="parabolic elements"; St[1]="An parabolic element of PU(2,1) is"; St[2]="an element which fixes a unique point"; St[3]="on S^3"; St[5]="parabolic elements have no fixed points"; St[6]="in CH^2. However, for any d>0 there are points"; St[7]="in CH^2 which are moved less than d by and"; St[8]="given parabolic element."; St[45]="PU(2,1)"; St[46]="elliptic elements"; St[47]="loxodromic elements"; St[48]="Bill's book"; L[5].future=220; L[6].future=360; L[7].future=362; L[8].future=240; } if(MESSAGE==362) { St[0]="loxodromic elements"; St[1]="An loxodromic element of PU(2,1) is"; St[2]="an element which fixes exactly 2 points"; St[3]="on S^3."; St[5]="For any given loxodromic element there is some"; St[6]="d>0 such that every point in CH^2 is moved"; St[7]="more than d units by the loxodromic element."; St[45]="PU(2,1)"; St[46]="elliptic elements"; St[47]="parabolic elements"; St[48]="Bill's book"; L[5].future=220; L[6].future=360; L[7].future=361; L[8].future=240; } if(MESSAGE==400) { St[0]="acknowledgements"; St[1]="This work is supported by:"; St[3]="The University of Maryland"; St[4]="www.math.umd.edu"; St[6]="The Institute for Advanced Study"; St[7]="www.ias.edu"; St[9]="The National Science Foundation"; St[10]="grant DMS-0305047"; St[11]="www.nsf.gov"; St[13]="A Guggenheim Fellowship"; St[14]="www.gf.org"; St[16]="I'd like to thank these institutions for their"; St[17]="generous support. I'd also like to thank"; St[19]="My wife Brienne Brown, for design suggestions."; St[21]="Nathan Dunfield, for much helpful feedback."; St[22]="www.its.caltech.edu/~dunfield"; St[25]="Bill Goldman and John Parker, for many helpful"; St[26]="conversations over the years, and also for"; St[27]="their conjecture."; St[28]="www.math.umd.edu/~wmg"; St[29]="maths.dur.ac.uk/~dma0jrp"; St[45]=""; St[46]=""; St[47]=""; St[48]=""; L[5].future=400; L[6].future=400; L[7].future=400; L[8].future=400; } if(MESSAGE==500) { St[0]="precise statement"; St[1]="In this applet, 'triangle group' always stands for"; St[2]="complex hyperbolic reflection ideal triangle group."; St[3]="The triangle groups are generated by three"; St[4]="C-reflections I0,I1,I2 in PU(2,1). Up to"; St[5]="conjugation in PU(2,1) there is a 1-parameter"; St[6]="family of such groups."; St[8]="THE CONJECTURE:"; St[9]="A triangle group is discrete if and only if"; St[10]="the product I0.I1.I2 is not an elliptic element."; St[11]="This range corresponds to parameters in the"; St[12]="interval [0,sqrt(125/3)]."; St[13]="Goldman and Parker verified their conjecture for"; St[14]="parameters in the interval [0,sqrt(35)) but"; St[16]="couldn't analyze the interval (sqrt(35),sqrt(125/3]"; St[18]="When s>sqrt(125/3) the element I0.I1.I2 is an"; St[19]="infinite order elliptic element and hence the"; St[20]="group is indiscrete. Some of our constructions,"; St[21]="when suitably modified, also work for s in this"; St[22]="range, and some of the pix would look similar."; St[23]="However our discreteness proof (obviously) breaks"; St[24]="down for s>sqrt(125/3)."; St[45]="triangle groups"; St[46]="C-reflections"; St[47]="PU(2,1)"; St[48]="elliptic elements"; L[5].future=280; L[6].future=350; L[7].future=220; L[8].future=360; } if(MESSAGE==550) { St[0]="checks"; St[1]="Here we explain some sanity checks which"; St[2]="convince us that we have not made"; St[3]="programming mistakes. You can test these"; St[4]="for yourself (except #7) using the applet."; St[6]="1. The C-circles C1,C1,E1,E2 map to round"; St[7]="circles in PLAN1 and HYP1."; St[8]="2. The R-arcs of S10A, etc. map to arcs of"; St[9]="lemniscates in PLAN1."; St[10]="3. Each arc of S10A, S10B, S20A, S20B maps to"; St[11]="a point in ELEV2."; St[13]="4. R1 bisects C1 in HYP2 and PLAN2, as it should."; St[14]="Likewise for R2 and C2."; St[15]="5. ELEV2(C1) and ELEV2(C2) are isometric to each."; St[16]="other and each curve has 180 degree rotational"; St[17]="symmetry."; St[18]="6. Each arc X of S12A, aside from the middle"; St[19]="arc, has a partner arc Y such that ELEV2(X)"; St[20]="and ELEV2(Y) share an endpoint. Moreover, the"; St[21]="other endpoints of ELEV2(X) and ELEV2(Y) have"; St[22]="the same height. Likewise for S12B,S21A,S21B."; St[23]="7. The plots of ELEV1(C1) and ELEV1(C2) agree"; St[24]="visually with plots using the direct formulas."; St[25]="8. The arcs of S10A,S10B,S20A,S20B are straight"; St[26]="horizontal rays in HYP2 and circular arcs in HYP1."; St[27]="9. Each arc of S10A makes a 180 degree angle with"; St[28]="the corresponding arc of S12A, at an endpoint,"; St[29]="in PLAN1 and PLAN2. Likewise for S10B and S12B."; St[30]="Likewise for S20A and S21A, and for S20B and S21B."; St[32]="Each of these phenomena is predicted from the"; St[33]="theory. If we made a gross programming error"; St[34]="in our code, the chances would be almost nil"; St[35]="that the 9 above listed properties would still"; St[36]="hold."; St[45]="C-circles and C-arcs"; St[46]="R-circles and R-arcs"; St[47]=""; St[48]=""; L[5].future=210; L[6].future=211; L[7].future=550; L[8].future=550; } if(MESSAGE==700) { St[0]="ELEV2 part 1"; St[1]="The ELEV2 coordinate system is the main"; St[2]="one of the 6 coordinate systems used."; St[3]="ELEV2 is based on the C-arc Q0 and the"; St[4]="C-circle E0 which contains it."; St[6]="HARMONIC POSITION:"; St[7]="4 cyclically ordered points a1,b1,a2,b2"; St[8]="on a C-circle are in harmonic position if"; St[9]="there is a conformal automorphism of the"; St[10]="complex line containing the C-circle which"; St[11]="maps these points to the vertices of a square."; St[13]="HARMONIC R-ARCS:"; St[14]="Let b1 and b2 be the endpoints of Q0"; St[15]="An R-arc A is harmonic if:"; St[16]="A intersects Q0 in a point a1;"; St[17]="A intersects E0-Q0 in a point a2;"; St[18]="the points a1,b1,a2,b2, are in harmonic pos."; St[19]="SPACE OF HARMONIC ARCS"; St[20]="Note that there is a circle's worth"; St[21]="of R-arcs joining a1 from a2. From this"; St[22]="we see that the space H of harmonic arcs"; St[23]="is a cylinder, essentially the interior"; St[24]="of Q0 cross a circle"; St[26]="MAIN DEFINITION:"; St[27]="Every point x in S^3-E0 is contained in a"; St[28]="unique harmonic arc A(x). ELEV2 is"; St[29]="the map which sends x to the arc A(x)."; St[30]="Here we interpret A(x) as a point in H."; St[31]="Thus ELEV2 maps S^3-E0 to the cylinder H."; St[33]="The black cylinder in the ELEV2 window is H"; St[34]="Try plotting some objects in ELEV2 coordinates."; St[45]="C-circles and C-arcs"; St[48]="R-circles and R-arcs"; St[47]="Q0 and E0"; St[46]="ELEV2 part 2"; L[5].future=210; L[8].future=211; L[7].future=800; L[6].future=750; D.pix=5; D.ACTIVE=0; D.repaint(); } if(MESSAGE==701) { St[0]="PLAN1 part 1"; St[1]="The PLAN1 coordinate system is an auxilliary"; St[2]="coordinate system designed to complement and"; St[3]="sometimes clarify the images in the main"; St[4]="coordinate system, ELEV2. Here we discuss"; St[5]="the structure of PLAN1."; St[7]="A SPECIAL INVOLUTION"; St[8]="Given the construction of our triangle groups"; St[9]="The map J(z,w)=([w],[z]). plays a special role."; St[10]="(Here [z] is the complex conjugate of z.)"; St[11]="J fixes the point p0 and swaps p1 and p2."; St[12]="Hence, conjugation by J is an automorphism of"; St[13]="the triangle group. The map J stabilizes"; St[14]="the arc Q0 and has a unique fixed point q in Q0."; St[16]="TWO PROJECTIONS"; St[17]="Let Y: S^3-q --> CxR be stereographic proj."; St[18]="Let P: CxR --> C be ordinary projection."; St[19]="MAIN DEFINITION"; St[20]="We have PLAN1=PY: S^3-q -->C."; St[21]="By construction PLAN1 maps E0-q to 0."; St[23]="LINKING CRITERION"; St[24]="One useful feature of PLAN1 is that it"; St[25]="let's us see easily if a curve in S^3 links"; St[26]="E0. If A is a curve in S^3 which links"; St[27]="E0 then PLAN1(A) is a closed loop in C"; St[28]="which surrounds 0. For the curves of"; St[29]="interest to us, the converse is also true:"; St[30]="PLAN1(A) surrounds 0 only if A links E0"; St[31]="In the next section we discuss these curves."; St[48]="stereographic proj."; St[46]="E0 and Q0"; St[47]="triangle groups"; St[45]="PLAN1 part 2"; L[8].future=780; L[6].future=800; L[7].future=280; L[5].future=705; } if(MESSAGE==705) { St[0]="PLAN1 part 2"; St[1]="The curves of interest to us are C-circles,"; St[2]="C-arcs, R-circles, and R-arcs"; St[4]="IMAGES OF C-CIRCLES:"; St[5]="If C is a C-circle in S^3-q then PLAN1(C) is a"; St[6]="round circle which surrounds 0. The idea of"; St[7]="proof is that PLAN1 is holomorphic on complex"; St[8]="and hence acts as a Mobius transformation"; St[9]="on such lines. Try plotting C1,C2,E1,E2"; St[10]="and looking at the image in PLAN1. Notice"; St[11]="that PLAN1(C1) and PLAN1(C2) are symmetrically"; St[12]="placed with repect to the real axis. The same"; St[13]="goes for PLAN1(E1) and PLAN1(E2). This is one"; St[14]="of the consequences of our choice of the"; St[15]="point q fixed by the map J discussed above."; St[16]="PLAN1(C) surrounds the origin iff C links E0."; St[17]="The image of a C-arc in PLAN1 is an arc of"; St[18]="a circle."; St[19]="IMAGES OF R-CIRCLES"; St[20]="If A is an R-CIRCLE in S^3-q then PLAN1(A) is a"; St[21]="lemniscate. I don't have a good geometric"; St[22]="reason for this. See Bill's book for a proof."; St[23]="You can see the lemniscates in action by"; St[24]="plotting a short-long-short combinaction"; St[25]="of thin rectangles from the object selectors"; St[26]="and looking at the image in PLAN1. Such a"; St[27]="trio of rectangles corresponds to an R-circle"; St[28]="You can see that these R-circles all link E0"; St[29]="though sometimes it is a close call and"; St[30]="you have to zoom in to see it. My preprint"; St[31]="gives a precise statement and a proof of"; St[32]="the linking result."; St[48]="C-circles and C-arcs."; St[46]="R-circles and R-arcs"; St[47]="Bill's book"; St[45]="PLAN1 part 3"; L[8].future=210; L[6].future=211; L[7].future=240; L[5].future=706; D.pix=6; D.ACTIVE=0; D.repaint(); } if(MESSAGE==706) { St[0]="PLAN1 part 3"; St[1]="CHECKING R-SPHERES"; St[2]="PLAN1 can be used as a check that we have"; St[3]="constructed our R-spheres as claimed."; St[4]="For instance, the R-arcs of S1 which connect"; St[5]="E0 to C1 should join 0 to a point on C1."; St[6]="Referring to object selector 1 on the control"; St[7]="panel, these are the arcs of S10"; St[8]="The figure above shows the relevant plot"; St[13]="FORMULA FOR PLAN1"; St[14]="Let A1,A2,B be the eigenvectors for the matrix"; St[15]="G0 representing the product I1.I0.I2, as we"; St[16]="discussed for ELEV2. Here we just use B"; St[17]="Given x=(x1,x2) in S^3-q we define X=(x1,x2,1)"; St[18]="as we did for ELEV2. Writing q=(q1,q2) let"; St[19]="Let Q=(q1,q2,1). Then"; St[20]="PLAN1(x)=/."; St[25]="Here we are using the standard Hermitian"; St[26]="form of type (2,1), as we did for ELEV2."; St[27]="Note that PLAN1 is holomorphic."; St[45]="R-sphere"; St[46]="ELEV2"; St[47]="type (2,1) form"; St[48]=""; L[5].future=150; L[6].future=700; L[7].future=221; L[8].future=793; D.pix=7; D.ACTIVE=0; D.repaint(); } if(MESSAGE==750) { St[0]="ELEV2 part 2"; St[1]="FLAT STRUCTURE"; St[2]="The PU(2,1) stabilizer of Q0 acts transitively"; St[3]="on the cylinder H of harmonic arcs. This"; St[4]="endows H with a flat Euclidean structure."; St[5]="Thus, up to scaling, we can identify H with the"; St[6]="standard flat cylinder - e.g. the white one"; St[7]="in the ELEV plotting window. ELEV2 conjugates"; St[8]="The stabilizer of Q0 to the group of isometries"; St[9]="of the flat cylinder. This phenomenon is"; St[10]="manifested in the fact that the objects"; St[11]="corresponding to the object selector 2"; St[12]="are isometric images of the objects"; St[13]="corresponding to the object selector 1."; St[15]="FORMULAS"; St[16]="When the identification with the flat cylinder"; St[17]="is made, there are nice formulas for ELEV2,"; St[18]="which we now describe."; St[19]="The product I1.I0.I2 is represented by a"; St[20]="a matrix G0 whose eigenvectors are A1,A2,B"; St[21]="Here A1 and A2 correspond to the two"; St[22]="fixed points of I1.I0.I2 on S^3 and B is the"; St[23]="vector which is perpendicular to A1 and A2"; St[24]="in the type (2,1) form."; St[26]="Given x=(x1,x2) in S^3-E0 let X=(x1,x2,1)."; St[27]="Then ELEV2(x)=(e1(x),e2(x));"; St[29]="e1(x)=2 arg() - arg() - arg()"; St[30]="e2(x)=log || - log ||"; St[32]="Different choices of A1,A2,B lead to a new map"; St[33]="which differs only by scaling. Here we are"; St[34]="using the type (2,1) form in our formulas."; St[45]="type (2,1) form"; St[48]="PU(2,1)"; St[47]="Q0 and E0"; St[46]="ELEV2 part 3"; L[5].future=239; L[8].future=220; L[7].future=800; L[6].future=760; } if(MESSAGE==760) { St[0]="ELEV2 part 3"; St[1]="WHY THE FORMULAS WORK"; St[2]="Up to scaling, ELEV2 is characterized by the"; St[3]="propety that it conjugates the PU(2,1)"; St[4]="stabilizer of Q0 to the isometry group of H. The"; St[5]="elements in the stabilizer are diagonalized"; St[6]="by the basis A1,A2,B above. Hence the eqns."; St[7]="give a map which has the defining property."; St[9]="IMAGES OF C-CIRCLES"; St[10]="If C is a C-circle which links E0 then ELEV2(C)"; St[11]="is a smooth loop which winds once around H."; St[12]="This applies to the C-circles C1,C2,E1,E2"; St[13]="on the object selectors. Try it out."; St[14]="I give a proof in my preprint."; St[15]="The main idea is that C-circles are transverse"; St[16]="to the contact structure in S^3, but the fibers"; St[17]="of ELEV2 are integral to the contact structure. "; St[19]="IMAGES OF R-CIRCLES"; St[20]="If A is an R-circle which links E0 then ELEV2(A)"; St[21]="is a loop which winds once around the cylinder."; St[22]="This loop is the union of two smooth arcs of"; St[23]="nonzero slope, joined at 2 cusps."; St[24]="I give a proof in my preprint. The idea is"; St[25]="that R-circles are integral to the contact"; St[26]="structure and a linked R-circle is tangent"; St[27]="to exactly two fibers of ELEV2. The tangency."; St[28]="points account for the cusps. If you plot"; St[29]="a short-long-short combo of thin rectangles,"; St[30]="joining C1 to E2, you will see the picture. How"; St[31]="do we know that the said s-l-s combo gives"; St[32]="a linked R-circle. Look in PLAN1 and see a"; St[33]="curve (a lemniscate actually) which links the"; St[34]="origin!"; St[45]="What is PU(2,1)"; St[46]="contact structure"; St[47]="Q0 and E0"; St[48]="about the coords."; L[5].future=239; L[6].future=770; L[7].future=800; L[8].future=270; D.pix=6; D.ACTIVE=0; D.repaint(); } if(MESSAGE==770) { St[0]="contact structure"; St[1]="The tangent space to a point on S^3 is a"; St[2]="copy of R3 and contains a unique complex"; St[3]="complex line. Thus there is unique"; St[4]="complex line tangent to each point of S^3."; St[5]="The union of these complex lines is the"; St[6]="standard contact structure on S^3. Elements"; St[7]="of PU(2,1) preserve the contact structure."; St[9]="C-circles are transverse to the contact"; St[10]="structure at every point. In other words, the"; St[11]="tangent vector to a C-circle never lies in the"; St[12]="complex line tangent to S^3 at the same point."; St[14]="R-circles are integral to the contact"; St[15]="structure at every point. In other words, the"; St[16]="tangent vector to a R-circle always lies in the"; St[17]="complex line tangent to S^3 at the same point."; St[19]="The image of the contact structure under"; St[20]="Stereographic projection has a nice formula:"; St[21]="It is given by the kernel of the 1-form"; St[22]="w=dt-xdy-ydx. Here we are coordinatizing"; St[23]="CxR, the range of stereographic projection"; St[24]="as (x+iy,t)."; St[26]="Green's theorem has a beautiful geometric"; St[27]="interpretation in this context: a closed loop"; St[28]="in C lifts to an integral closed loop in CxR"; St[29]="iff it bounds a region of 0 signed area."; St[30]="more general, the height difference between"; St[31]="the endpoints of the lift of a closed loop"; St[32]="equals the signed area of the region bounded"; St[33]="by the loop"; L[5].future=210; L[6].future=211; L[7].future=220; L[8].future=780; St[45]="C-circles and C-arcs"; St[46]="R-circles and R-arcs"; St[47]="PU(2,1)"; St[48]="stereographic proj."; } if(MESSAGE==777) { St[0]="HYP1 and HYP2"; St[1]="HYP1 and HYP2 are both based"; St[2]="on the projection map from S^3 to disk bounded"; St[3]="by the C-circle E0. For HYP1, this disk"; St[4]="is identified with a half-plane via the usual"; St[5]="conformal stereographic projection. For HYP2."; St[6]="The disk is identified with a half plane in such"; St[7]="a way that a certain family of geodesics are"; St[8]="are mapped isometrically to horizontal straight"; St[9]="lines. Click on the links below for details"; St[10]="We adjusted the various scaling factors"; St[11]="so that the two coordinate systems"; St[12]="converge to each other as the parameter"; St[13]="s converges to sqrt(125/3). Try it out."; St[17]="lines. Click on the links below for details"; St[18]="about HYP1 and HYP2."; L[5].future=792; L[7].future=797; L[6].future=210; L[8].future=777; St[45]="HYP1"; St[47]="HYP2"; St[46]="C-circles and C-arcs"; St[48]=""; } if(MESSAGE==780) { St[0]="stereographic proj."; St[1]="Let q be a point in S^3. Stereographic"; St[2]="projection maps S^3-q to the Heisenberg group."; St[3]="The Heisenberg group has the underlying"; St[4]="space CxR, but with a nonabelian group law."; St[5]="This map is the basis for the PLAN1 coordinates."; St[6]="Here we sketch the construction."; St[8]="THE SIEGEL DOMAIN"; St[9]="The Siegel domain Z is the unbounded subset of"; St[10]="C2 defined as the set (z,w) such that Re(w)>|z|^2"; St[11]="This set of complex projectively equivalent to"; St[12]="the open unit ball in C2."; St[14]="STEP 1:"; St[15]="Embed C2 as an affine subset of CP^2."; St[16]="Let B be a complex projective automorphism"; St[17]="which carries the open unit ball to Z"; St[18]="in such a way that B(q) is not in C2."; St[19]="STEP 2"; St[20]="B carries S^3-p to boundary(Z)"; St[21]="Let A: boundary(Z) --> CxR be given by the map"; St[22]="A(z,w)=(w,Im(w))."; St[23]="Then the composition AB: S^3-q --> CxR"; St[24]="is a stereographic projection map."; St[26]="This construction is more formally known as"; St[27]="Heisenberg stereographic projection. For more"; St[28]="details, see my preprint, or Bill's book."; L[5].future=781; L[6].future=240; L[7].future=701; L[8].future=780; St[45]="CP^2"; St[46]="Bill's book"; St[47]="PLAN1"; St[48]=""; } if(MESSAGE==781) { St[0]="CP^2"; St[1]="CP^2 is the space of 1-dimensional complex"; St[2]="linear subspaces of C^3. That is, CP^2"; St[3]="is the usual projectivization of C^3."; St[4]="Complex linear maps automatically act on"; St[5]="CP^2 as complex projective transformations."; St[6]="because they permute the 1-dimensional"; St[7]="subspaces. The term 'complex projective"; St[8]="transformation' may sound fancy, but it is"; St[9]="just the name for a linear transformation acting"; St[10]="on the 1-dimensional subspaces of C^3."; St[18]="For more information, see Bill's book."; L[5].future=240; L[6].future=110; L[7].future=781; L[8].future=781; St[45]="Bill's book."; St[46]="Hermitian geometry"; St[47]=""; St[48]=""; } if(MESSAGE==792) { St[0]="HYP1 part 1"; St[1]="The HYP1 coordinate system is an auxilliary"; St[2]="coordinate system designed to complement and"; St[3]="sometimes clarify the images in the main"; St[4]="coordinate system, ELEV2. Here we discuss"; St[5]="the structure of HYP1."; St[7]="MAIN DEFINITION"; St[8]="When E0 is normalized to be the circle"; St[9]="C^1 # S^3, HYP1 is defined as the map"; St[10]="(z,w) --> z. (We will give a direct formula"; St[11]="in Part 3). The image of HYP1 is the"; St[12]="right half-plane, which we think of as the"; St[13]="HYPerbolic half-plane."; St[19]="FOR EXPERTS:"; St[20]="HYP1 is the following composition. First"; St[21]="project orthogonally, in the CH^2 sense,"; St[22]="onto the C-slice bounded by E0, then"; St[23]="identify this slice with the a half-plane"; St[24]="via a conformal transformation."; St[26]="SYMMETRIES"; St[27]="HYP1 conjugates the stabilizers of E0 to "; St[28]="conformal automorphisms of hyperbolic plane."; St[29]="Within this, HYP1 conjugates the stabilizers"; St[30]="of Q0 to the subgroup which preserves the"; St[31]="endpoints of HYP1(Q0). Note that HYP1(E0) is"; St[32]="a line and HYP1(Q0) is a sub-arc. When"; St[45]="ELEV2"; St[46]="Q0 and E0"; St[47]="HYP1 part 2"; St[48]="PU(2,1)"; L[5].future=700; L[6].future=270; L[7].future=793; L[8].future=220; } if(MESSAGE==785) { St[0]="PLAN2 part 1"; St[1]="The PLAN2 coordinate system is an auxilliary"; St[2]="coordinate system designed to complement and"; St[3]="sometimes clarify the images in the main"; St[4]="coordinate system, ELEV2. Here we discuss"; St[5]="the structure of PLAN2. I do not have such"; St[6]="an elementary description of PLAN2, and"; St[7]="the description I give depends heavily on ELEV2."; St[8]="You should learn about ELEV2 first."; St[10]="HORIZONTAL FIBER"; St[11]="Let h be a horizontal line in cylinder H,"; St[12]="the range of ELEV2. The inverse image"; St[13]="if h undee ELEV2 is a sphere S, consisting"; St[14]="of all the R-arcs which join a certain pair"; St[15]="of points on E0. To be canonical, we can"; St[16]="choose one of these points to be q, the point"; St[17]="used in the definition of PLAN1."; St[18]="S has a natural complex structure"; St[19]="Every point x of S^3-E0 is equivalent to a"; St[20]="point x' of S via an unique element g of the "; St[21]="stabilizer of Q0 which acts as a pure"; St[22]="translation. We mean that ELEV2 conjugates"; St[23]="g to a vertical translation of the cylinder."; St[24]="When we identify S-Q0 with the complex plane,"; St[25]="PLAN2 is precisely the map x --> x'=g(x)."; St[27]="GEOMETRIC PROPERTIES:"; St[28]="--PLAN2 conjugates the stabilizer of Q0 to the"; St[29]="the group of rotations of the plane fixing 0."; St[30]="--PLAN2 maps the fibers of ELEV2 to rays"; St[31]="through the origin!"; St[32]="--In general I don't have a characterization"; St[33]="of the images, under plan, of C-circles"; St[34]="and R-circles."; St[45]="ELEV2"; St[46]="Q0 and E0"; St[48]="PLAN2 part 2"; St[47]="PLAN1"; L[5].future=700; L[6].future=270; L[8].future=786; L[7].future=701; } if(MESSAGE==786) { St[0]="PLAN2 part 2"; St[1]="FORMULA FOR PLAN2"; St[2]="Given v in S^3-E0 we have"; St[4]="PLAN2(v)=exp(d)*exp(ix), where"; St[6]="x is the x-coordinate of ELEV2."; St[8]="d is the signed hyperbolic distance from HYP1(v)"; St[9]="to the hyperbolic geodesic which connects the"; St[10]="endpoints of HYP1(Q0). The quantity exp(d)"; St[11]="has a natural interpretation in terms of"; St[12]="cross ratios, which makes it easy to compute."; St[13]="CROSS RATIO COMPUTATION OF exp(d):"; St[14]="Let v1 and v2 be the two points where the arc"; St[15]="S(E0,Q0;v) intersects E0. We take v1 in Q0"; St[16]="a=HYP1(v1)"; St[17]="b=HYP1(an endpoint of Q0)"; St[18]="c=HYP1(v2)"; St[19]="HYP1(v1)"; St[20]="Then exp(d) is the imaginary part of:"; St[21]="sqrt(((e-a)(c-b))/((b-a)(c-e)))"; St[45]="ELEV2"; St[46]="Q0 and E0"; St[47]="HYP1 and HYP2"; St[48]=""; L[5].future=770; L[6].future=270; L[7].future=792; L[8].future=786; } if(MESSAGE==793) { St[0]="HYP1 part 2"; St[1]="IMAGES OF C-CIRCLES"; St[2]="If C is a C-circle in S^3 then HYP1(C) is a round"; St[3]="circle in the half-plane. Try this out by plotting"; St[4]="C1,C2,E1,E2. Note that HYP1(C1) and HYP1(C2)"; St[5]="are symmetrically placed. Likewise for HYP1(E1)"; St[6]="and HYP1(E2). We arranged this by normalizing"; St[7]="by a conformal transformation so that HYP1(Q0)"; St[8]="is symmetrically placed with respect to the"; St[9]="R axis."; St[11]="IMAGES OF R-CIRCLES"; St[12]="In general, the image of an R-circle under HYP1"; St[13]="is a complicated curve. We don't know the"; St[14]="general formula. But, if A is an R-arc which"; St[15]="is harmonic with respect to Q0, in the sense we"; St[16]="discussed in connection with ELEV2, then"; St[17]="HYP1(A) is a circular arc which meets the unit"; St[18]="disk at right angles. That is, HYP1(A)"; St[19]="is a hyperbolic geodesic in the half-plane"; St[20]="when the half-plane is equipped with the"; St[21]="usual hyperbolic metric. Moreover, HYP1(A)"; St[22]="is orthogonal to the hyperbolic geodesic"; St[23]="which joins the endpoints of HYP1(Q0). We call"; St[24]="HYP1(A) a 'fiber geodesic' in this case."; St[26]="Our claims here follow from the symmetry."; St[27]="that HYP1 conjugates the stabilizer of Q0"; St[28]="to the stabilizer of the geodesic joining"; St[29]="the endpoints of HYP1(Q0). You can test"; St[30]="these claims by looking at the plots."; St[45]="C-circles and C-arcs"; St[46]="R-circles and R-arcs"; St[47]="HYP1 part 3"; St[48]="ELEV2"; L[5].future=210; L[6].future=211; L[7].future=794; L[8].future=700; D.pix=7; D.ACTIVE=0; D.repaint(); } if(MESSAGE==794) { St[0]="HYP1 part 3"; St[1]="FORMULA FOR HYP1"; St[2]="Let A1,A2,B be the eigenvectors for the matrix"; St[3]="G0 representing the product I1.I0.I2, as we"; St[4]="discussed for ELEV2. Here we just use B"; St[5]="Given x=(x1,x2) in S^3 we define X=(x1,x2,1)"; St[6]="as we did for ELEV2. We first define the vector"; St[8]="V(x)=X-(/) B"; St[10]="(Basically we are doing Gram Schmidt with"; St[11]="respect to the type (2,1) Hermitian form.)"; St[12]="Writing V=(v1,v2,v3) we define"; St[14]="HYP1(x)=v1/v3"; St[16]="and apply a suitable conformal transformation."; St[19]="HEIGHT PRINCIPLE:"; St[20]="There is a structural relation between"; St[21]="ELEV2 and HYP1. If ELEV2(x1) and ELEV2(x2)"; St[22]="have the same height in the cylinder-i.e."; St[23]="the same y coordinate-then HYP1(x1) and"; St[24]="HYP1(x2) lie on the same fiber geodesic."; St[25]="(Recall that the fiber geodesics are"; St[26]="the images of the fibers of ELEV2, in HYP1.)"; St[27]="The height principle follows from symmetry"; St[28]="and can also be seen by calculation. If you"; St[29]="play with the applet, comparing images"; St[30]="in ELEV2 and HYP1, you will see the principle"; St[31]="in action."; St[45]="ELEV2"; St[46]="type (2,1) form"; St[47]=""; St[48]=""; L[5].future=700; L[6].future=221; L[7].future=794; L[8].future=794; } if(MESSAGE==797) { St[0]="HYP2"; St[1]="The HYP2 coordinate system is an auxilliary"; St[2]="coordinate system designed to complement and"; St[3]="sometimes clarify the images in the main"; St[4]="coordinate system, ELEV2. Here we discuss"; St[5]="the structure of HYP2. HYP2 is build out"; St[6]="of ELEV2 and PLAN2. You should read about"; St[7]="these coordinates first."; St[8]="MAIN DEFINITION"; St[10]="The x-coordinate of HYP2 is the square"; St[11]="of the radial coordinate of PLAN2."; St[12]="The y-coordinate of HYP2 is the y-coordinate"; St[13]="of ELEV2."; St[14]="Note that HYP2 is not defined on Q0 and E0."; St[19]="GEOMETRIC INTERPRETATION"; St[20]="First, a word about HYP1. The range"; St[21]="of HYP1 is the right half-plane, which we"; St[22]="think of the hyperbolic 'upper half-plane'"; St[23]="turned on its side."; St[24]="There is a natural map B which carries the"; St[25]="HYP1 half-plane to itself such that:"; St[26]="1. B maps the geodesic HQ0 connecting the"; St[27]="endpoints of HYP1(Q0) to a vertical line."; St[28]="2. B maps the geodesics perpendicular to HQ0"; St[30]="(the fiber geodesics) isometrically to"; St[31]="horizontal rays."; St[32]="Then HYP2=B composed with HYP1."; St[45]="ELEV2"; St[46]="PLAN2"; St[47]="HYP1"; St[48]="E0 and Q0"; L[5].future=700; L[6].future=785; L[7].future=792; L[8].future=800; } if(MESSAGE==800) { St[0]="Q0 and E0"; St[1]="Let I0.I1.I2 be the product of the generators."; St[2]="Of the triangle group. We are interested in the"; St[3]="parameters where the product g0=I1.I0.I2 is"; St[4]="loxodromic. In this case, g0 fixes 2"; St[5]="points in S^3."; St[7]="E0 is the C-circle determined by these 2 points."; St[8]="Q0 is one of the two arcs of E0 bounded by the"; St[9]="2 points. Of the two possibilities, we choose."; St[10]="So that Q0 varies continuously with the"; St[11]="parameter and shrinks to a point as the"; St[12]="parameter tends to sqrt(125/3)."; St[14]="try plotting Q0 and E0. Due to the way our"; St[15]="coordinates are defined,"; St[16]="Q0 and E0 both map to 0 in PLAN1"; St[17]="Q0 and E0 are not defined in ELEV2 or HYP2"; St[19]="This is a good opportunity to talk about"; St[20]="The special object HQ0. This object"; St[21]="is the union of all R-arcs which"; St[22]="contain the endpoints of Q0. The image."; St[23]="HYP1(HQ0) is the hyperbolic geodesic which"; St[24]="joins the endpoints of HYP1(Q0)."; St[25]="The image HYP2(HQ0) is a vertical line."; St[26]="The images in the other coordinate systems"; St[27]="would be surfaces; but we do not plot"; St[28]="HQ0 in the other coordinate systems."; L[5].future=280; L[6].future=362; L[7].future=211; L[8].future=210; St[45]="triangle groups"; St[46]="loxodromic elements"; St[47]="R-circles and R-arcs"; St[48]="C-circles and C-arcs"; } if(MESSAGE==900) { St[0]="the proof"; St[1]="This discussion assumes that you know about"; St[2]="the the other 5 portions of the text, namely:"; St[3]="1. how to operate the applet."; St[4]="2, the topics in the math."; St[5]="3. the objects in the applet."; St[6]="4. the coordinate systems."; St[7]="5. the conjecture."; St[8]="However, you can forge ahead without this"; St[9]="background and look things up as you go."; St[11]="Our main idea is to create the 3 R-spheres"; St[12]="S0,S1,S2 in the 3-sphere S^3 such that"; St[13]="1. Sj is an embedded piecewise analytic sphere."; St[14]="2. Si and Sj intersect in a contractible graph"; St[15]="3. Ij(Sj)=Sj."; St[16]="4. Ij interchanges the two components of S^3-Sj"; St[18]="given Properties 1 and 2, Properties 3 and 4"; St[19]="follow from the symmetry of the construction."; St[20]="From Properties 1-4 there are balls B0,B1,B2,"; St[21]="bounded by S0,S1,S2, which have pairwise"; St[22]="disjoint interiors. This situation immediately"; St[23]="implies that G is a discrete group."; St[25]="The Goldman-Parker conjecture boils down"; St[26]="to establishing Properties 1 and 2."; St[28]="One can make the stronger statement that"; St[29]="the set F is a fundamental domain for the"; St[30]="action of G:"; St[31]="F=(S^3-X) u. (Y-Z)"; St[32]="X=B0 u. B1 u. B2;"; St[33]="Y=S0 u. S1 u. S2"; St[34]="Z=p0 u. p1 u. p2"; St[35]="However, we shall not give the argument here."; L[5].future=900; L[6].future=700; L[7].future=910; L[8].future=920; St[45]=""; St[46]="ELEV2"; St[47]="Property 1"; St[48]="Property 2"; D.pix=4; D.ACTIVE=0; D.repaint(); } if(MESSAGE==910) { St[0]="Property 1 part 1"; St[1]="First, we'll do an experiment."; St[2]="1. Push 'Show me the money!'. Wait"; St[3]="2. Erase the red objects and replot."; St[4]="3. You are now looking plots of S1-E0"; St[5]="Looking in PLAN2 you can see clearly that"; St[6]="S1 consists of 2 embedded hemispheres,"; St[7]="a dark blue one: S10"; St[8]="a light blue one: S21"; St[9]="and that these hemispheres intersect only"; St[10]="at the equator C1. (Or see gallery picture 9.)"; St[11]="We don't know theoretically about PLAN2"; St[12]="so we will take a different approach"; St[13]="in explaining why S1 is an embedded sphere."; St[15]="WHY THE HEMISPHERES ARE EMBEDDED"; St[16]="(Erase the dark blue objects and replot.)"; St[17]="You are looking at S21"; St[18]="The space S21-C1 fibers over"; St[19]="C1, with the fibers being half-open R-arcs."; St[20]="The closed endpoints of the fibers are on C1"; St[21]="the open endpoints limit on Q2 and are"; St[22]="identified in pairs. (To see this, add Q2 to"; St[23]="the mix, in a different color, and replot."; St[24]="Look in ELEV2.) This structure shows that"; St[25]="S21 is an embedded disk. The case"; St[26]="S10 follows from symmetry."; St[28]="If you want to see how the fibration works."; St[29]="toggle the 'truncate arcs' slider so that"; St[30]="the picture automatically replots, and then"; St[31]="click on this slider, starting at left and"; St[32]="moving incrementally to the right."; St[45]="about the coords."; St[47]="Property 1 part 2"; St[48]="PLAN2"; St[46]="S1"; L[5].future=270; L[7].future=911; L[8].future=785; L[6].future=250; } if(MESSAGE==911) { St[0]="Property 1 part 2"; St[1]="HOW THE HEMISPHERES INTERSECT"; St[2]="Comparing the definition of ELEV2 to"; St[3]="the construction of S1 we see that"; St[4]="ELEV2(S10-E0)=ELEV2(C1). On the"; St[5]="other hand, all the arcs of the set"; St[6]="ELEV2(S(E2,Q2;C2)-E0), which are near"; St[7]="ELEV2(C1), move away from ELEV2(C1)"; St[8]="monotonically. From this picture we see that"; St[9]="S10 # S21 is a subset"; St[10]="of C1 u. E0. By symmetry the same"; St[11]="intersection is a subset of C1 u. E2."; St[12]="But E0 and E2 are disjoint, as one can"; St[13]="see by plotting these objects in HYP1."; St[14]="Hence S10 # S21=C1."; St[19]="You can see a clearer picture of"; St[20]="How the hemispheres intersect by plotting S1"; St[21]="and then playing the same game with the"; St[22]="the 'truncate arcs' slider we described in"; St[23]="part 1."; St[45]="about the coords."; St[46]="ELEV2"; St[48]="monotonicity"; St[47]="S1"; L[5].future=270; L[6].future=700; L[8].future=939; L[7].future=250; } if(MESSAGE==920) { St[0]="Property 2"; St[1]="Push 'Show me the money!'. Wait. Now"; St[2]="adjust the ELEV2 window to your liking. The"; St[3]="ELEV2 window shows ELEV2(S1-E0) in blue"; St[4]="and ELEV2(S2-E0) in red. Note that the 2"; St[5]="sets appear to intersect in just a single"; St[6]="point, which must be ELEV2(p0)."; St[7]="Try the plots at other parameters."; St[9]="Assume for now that"; St[10]="(*) ELEV2(S1-E0)#ELEV2(S1-E0)=ELEV2(p0)."; St[11]="The fibers of ELEV2 are R-arcs. Hence"; St[12]="(S1-E0)#(S2-E0) is contained in an R-arc"; St[13]="Let A=S(E0,Q0;p0)."; St[14]="Click the link below to see why, in fact:"; St[15]="(S1-E0) # (S2-E0) = A"; St[17]="S1 # E0 and S2 # E0 are overlapping arcs."; St[18]="(Add E0 to the plot and look in HYP1.)"; St[19]="Hence S1 # S2 # E = B, another arc."; St[20]="S1 # S1=A u. B, two arcs which meet"; St[21]="in a 'T' formation. Property 2 follows."; St[25]="The main steps in showing (*) are:"; St[27]="1. Show that the curves ELEV2(C1) and"; St[28]="ELEV2(C2) intersect in a single point."; St[29]="This a kind of calculus problem."; St[31]="2. Show that the arcs of ELEV2(S1), which"; St[32]="are near ELEV(C1)#ELEV(C2), rise"; St[33]="monotonically away from ELEV2(C2)."; St[34]="This monotonicity property is the heart of"; St[35]="matter, the main point of the proof."; St[45]="ELEV2"; St[46]="why A"; St[48]="monotonicity"; St[47]="calculus problem"; L[5].future=700; L[6].future=927; L[8].future=939; L[7].future=922; D.pix=8; D.ACTIVE=0; D.repaint(); } if(MESSAGE==922) { St[0]="calculus problem"; St[1]="First of all, plot C1 and C2. Move the"; St[2]="parameter slider around to see the"; St[3]="picture for many parameters. Look in"; St[4]="the ELEV window. Zoom in on the point"; St[5]="of intersection and see that it remains a"; St[6]="point even at the highest dilation. All"; St[7]="this is good experimental evidence that the"; St[8]="ELEV2(C1) # ELEV2(C2)=ELEV2(p0)."; St[10]="One idea for a proof is that ELEV2(C1) and"; St[11]="ELEV2(C2) have the same slope at ELEV2(p0)"; St[12]="by symmetry. Thus, the second derivative"; St[13]="determines the local picture. It seems"; St[14]="that ELEV2(C1) is convex in a neighborhood."; St[15]="of ELEV2(p0) and that ELEV2(C2) is concave"; St[16]="in a neighborhood of ELEV2(C1). Thus"; St[17]="ELEV2(C1) stays above ELEV2(C2) in a"; St[18]="neighborhood of ELEV2(p0). By the time"; St[19]="the curves lose their respective convexity"; St[20]="and concavity, ELEV2(C1) is so far above"; St[21]="ELEV2(C2) that the result is obvious."; St[23]="To get a precise picture of what seems"; St[24]="to be going on, clear the screen and"; St[25]="then plot C1 and E2. Note that ELEV2(C1)"; St[26]="and ELEV2(E2) intersect in two points."; St[27]="These two points are both points of"; St[28]="isometric symmetry for ELEV2(C1) and"; St[29]="ELEV2(E2) and hence are inflection points"; St[30]="for both curves. It seems that these are the"; St[31]="only inflection points for ELEV2(C1). A"; St[32]="similar result holds for ELEV2(C2), by symmetry."; St[32]="This result on inflection points, would"; St[33]="prove ELEV2(C1) # ELEV2(C2)=ELEV2(p0)."; St[45]="the catch"; St[46]=""; St[47]=""; St[48]=""; L[5].future=923; L[6].future=922; L[7].future=922; L[8].future=922; } if(MESSAGE==923) { St[0]="the catch"; St[1]="There is a catch:"; St[2]="The approach we just described has a"; St[3]="hidden difficulty which prevents us from"; St[4]="using it as we have written. While the"; St[5]="formulas for the first and second derivatives"; St[6]="ELEV2(C1) and ELEV2(C2) are easy to write down"; St[7]="in terms of the eigenvectors of the product"; St[8]="I1.I0.I2 in the generators of the triangle group,"; St[9]="the formula for these eigenvectors, in terms"; St[10]="of the rational functions describing the"; St[11]="matrix entries for the group elements, is"; St[12]="extremely complicated. For any given"; St[13]="parameter I can easily calculate things out"; St[14]="but I couldn't get an estimate that works for"; St[15]="all parameters at once."; St[17]="To get around the problem I introduce another"; St[18]="coordinate system, ELEV1, which is simpler"; St[19]="than ELEV2 in terms of formulas. and closely"; St[20]="related to PLAN1. Given ELEV1, I then:"; St[22]="1. Prove the 2-inflection point result for"; St[23]="ELEV1(C1) and ELEV1(C2);"; St[24]="2. Use an elementary geometric comparison"; St[25]="comparison argument to show that the result"; St[26]="for ELEV1 implies the result for ELEV2."; St[28]="This approach doesn't work for all parameters"; St[29]="but it does work for all parameters in the"; St[30]="interval (sqrt(35),sqrt(125/3)), and this is"; St[31]="enough to establish the conjecture. See my"; St[32]="preprint for the details."; St[45]="triangle group"; St[46]="ELEV1"; St[47]="why sqrt(35)"; St[48]=""; L[5].future=280; L[6].future=924; L[7].future=925; L[8].future=922; } if(MESSAGE==924) { St[0]="ELEV1"; St[1]="ELEV1 is closely related to PLAN1"; St[2]="Let Y be the Heisenberg stereographic"; St[3]="projection used in the definition of ELEV2"; St[4]="Let H* be the cylinder (R/2 Pi Z) x S1"; St[5]="Let P*: (C-0)xR --> H* be the map"; St[6]="given by P*(z,t)=(arg(z),t)."; St[7]="Then ELEV1=P*Y."; St[9]="If we identify H* with H, the cylinder used in"; St[10]="the definition of ELEV2, then ELEV2 and ELEV1"; St[11]="have the same range and can be compared."; St[45]="ELEV2"; St[46]="PLAN1"; St[47]="stereographic proj."; L[5].future=700; L[6].future=701; L[7].future=780; L[8].future=924; } if(MESSAGE==925) { St[0]="why sqrt(35)"; St[1]="Goldman and Parker prove their"; St[2]="Conjecture for all parameters in"; St[3]="the range [0,sqrt(35)]. See the precise"; St[4]="statement of the conjecture"; St[6]="Actually, our 2-inflection-point result"; St[7]="holds in a slightly larger interval than"; St[8]="[sqrt(35),sqrt(125/3)). Also, even"; St[9]="in the worst case, there are just 4 inflection"; St[10]="points and these do not occur near the"; St[11]="point of tangency of ELEV1(C1) and"; St[12]="ELEV1(C2)-the point of interest to us."; St[13]="I could actually push through the"; St[14]="calculus proof for all parameters, but"; St[15]="I didn't do this because it is tedious."; St[17]="I hope to figure out a direct way to compute"; St[18]="the inflection points of ELEV2(C1) and ELEV2(C2)."; St[45]="precise statement"; St[46]="what is ELEV1"; St[47]=""; St[48]=""; L[5].future=500; L[6].future=924; L[7].future=925; L[8].future=922; } if(MESSAGE==927) { St[0]="why A"; St[1]="STEP 1"; St[2]="Comparing the construction of S1 and the"; St[3]="definition of ELEV2 we get that"; St[4]="ELEV2(S(E0,Q0;x)-E0)=ELEV2(x), all x in C1"; St[5]="ELEV2(S(E0,Q0;x)-E0)=ELEV2(x), all x in C2"; St[6]="Assuming ELEV2(C1) # ELEV2(C2)=ELEV2(p0),"; St[7]="we get that"; St[8]="(S10-E0) # (S20-E0)=A."; St[10]="STEP 2:"; St[11]="Erase the plot windows and plot"; St[12]="ELEV2(S21 and ELEV2(C1). Note"; St[13]="that each arc of ELEV2(S12), which"; St[14]="is near ELEV2(S21, rises"; St[15]="monotonically up and away from ELEV(C1)."; St[16]="Thus, if A' is an R-arc of S21 then"; St[17]="ELEV2(A'-C1) # ELEV2(C1) = (()). Hence"; St[18]="ELEV2(S21-C1) # ELEV2(C1)=(())."; St[19]="So ELEV2(S21-C1) # ELEV2(p0)=(())"; St[20]="Given ELEV2(S1-E0) # ELEV2(S2-E0)=ELEV2(p0)"; St[21]="we have (S21-C1) # (S2-E0)=(()). Also"; St[22]="(S21-C2) # (S1-E0)=(())."; St[25]="STEP 3"; St[26]="Combining STEP 1 and STEP 2, and noting"; St[27]="that C1 is a subset of S10 and"; St[28]="that C1 is a subset of S20 we"; St[29]="see that (S1-E0) # (S2-E0) = A."; St[31]="Our proof here reduces the 'why A'"; St[32]="question to the monotonicity property and the"; St[33]="calculus problem mentioned above."; St[45]="S1"; St[46]="ELEV2"; St[47]="monotonicity property"; St[48]="calculus problem"; L[5].future=250; L[6].future=700; L[7].future=939; L[8].future=922; D.pix=8; D.ACTIVE=0; D.repaint(); } if(MESSAGE==939) { St[0]="monotonicity"; St[1]="Let's see the monotonicity property in action."; St[2]="1. Erase everything."; St[3]="2. Set the plot windows to"; St[4]="ELEV2, PLAN2, HYP2."; St[5]="3. Select:"; St[6]="C1,E2,R1 all in different colors."; St[7]="S12A in red."; St[8]="S12B in blue."; St[9]="4. Plot the picture."; St[10]="5. move the 'truncate arcs' slider to the left."; St[11]="6. Start clicking on the slider so that it"; St[12]="goes to the right incrementally, replotting."; St[13]="You can watch the arcs of"; St[14]="ELEV2(S12B) fall monotonically and"; St[15]="ELEV2(S12A) rise monotonically."; St[16]="You can see the same rising and falling in HYP2."; St[17]="With 2 exceptions, half the arcs (red) rise up"; St[18]="and the other half (blue) fall down. The two"; St[19]="exceptions are the arcs R1 # S21."; St[20]="You could say that the exceptions are"; St[21]="the 2 arcs which divide the red from the blue."; St[22]="Click the link below to learn more about"; St[23]="these 2 exceptional arcs."; St[25]="The monotonicity property is really the heart"; St[26]="of our proof. It is the property that"; St[27]="theoretically lets us justify that the"; St[28]="`show me the money' picture is really"; St[29]="what it seems to be."; St[48]="monotonicity, part 2"; St[47]="ELEV2"; St[46]="S21"; St[45]="2 exceptions"; L[8].future=941; L[7].future=700; L[6].future=261; L[5].future=980; } if(MESSAGE==941) { St[0]="monotonicity, part 2"; St[1]="Let's analyze the monotonicity property closely."; St[2]="1. Plot a short-long-short combo of thin"; St[3]="rectangles connecting C1 to E2, as shown"; St[4]="at right. You can pick the combo at random"; St[5]="from the 30 choices, but use the colors"; St[6]="indicated at right."; St[7]="2. Repeat the plot for different combos and"; St[8]="different parameters. "; St[9]="3. Click on the 'truncate arcs' slider & replot."; St[10]="4. Put the 'truncate arcs' slider to the right."; St[12]="You see a union of 2 smooth arcs of nonzero"; St[13]="slope, joined at 2 cusps. This is discussed"; St[14]="in ELEV2 part 3. Notice that the blue"; St[15]="arc never contains a cusp in it's interior."; St[16]="Cusp 1 is the blue/red intersection and"; St[17]="Cusp 2 is disjoint from the blue arc."; St[18]="Click the links for the explanation."; St[19]="Now add C1 and Q2 to the plot. Note that the"; St[20]="blue arc joins ELEV2(C1) to ELEV2(Q2). Note"; St[21]="also that the slope of the blue arc near"; St[22]="ELEV2(C1) is larger than the slope of ELEV2(C1)"; St[23]="This comes from the fact that C1 is a C-circle"; St[24]="transverse to the contact structure whereas"; St[25]="each R-arc of S21 is integral to the"; St[26]="contact structure. Hence the blue arc is"; St[27]="transverse to ELEV2(C1) at the point"; St[28]="A single plot is enough to see that the"; St[29]="slope of the blue arc is always greater"; St[30]="rather than always lesser than the"; St[31]="slope of ELEV2(C1) at this point."; St[32]="The inequality persists for enough of"; St[33]="the arc to give the monotonicity property."; St[34]="See me preprint for more details."; St[48]="contact structure"; St[47]="ELEV2"; St[46]="about cusp 2"; St[45]="about cusp 1"; L[8].future=770; L[7].future=700; L[6].future=960; L[5].future=950; D.pix=6; D.ACTIVE=0; D.repaint(); } if(MESSAGE==950) { St[0]="about cusp 1"; St[1]="Repeat the experiment at the top of"; St[2]="the previous page, this time plotting"; St[3]="the objects shown at right."; St[5]="Look at the picture in PLAN1. Note that"; St[6]="the sky blue arc and the blue arc have the"; St[7]="the same tangent line at the green circle."; St[8]="The same thing goes in HYP1. In ELEV2"; St[9]="The sky blue arc maps to a point."; St[11]="The R-arcs, represented by these plots"; St[12]="indeed have the same tangent line at"; St[13]="their common point, which lies on C1."; St[14]="The idea is that these R-arcs are tangent to"; St[15]="the contact structure, and the map I1 rotates"; St[16]="the contact planes, based at points of C1, by"; St[17]="180 degrees. Moreover, I1 swaps the arcs."; St[19]="The sky blue arc, being an arc of"; St[20]="S10, is contained in a fiber of ELEV2."; St[21]="Hence the blue arc is tangent to a fiber of"; St[22]="ELEV2 at its endpoint. Such tangencies"; St[23]="correspond to the cusps. Hence, Cusp 1"; St[24]="is at the endpoint of the blue arc in"; St[25]="ELEV2, as claimed above."; St[48]="contact structure"; St[47]="coords"; St[46]="C-reflections"; St[45]="triangle groups"; L[8].future=770; L[7].future=700; L[6].future=350; L[5].future=280; D.pix=9; D.ACTIVE=0; D.repaint(); } if(MESSAGE==960) { St[0]="about cusp 2"; St[1]="Our argument is based on the height principle"; St[2]="discussed in HYP1 part 3. Say that a 'relevant"; St[3]="R-circle' is one of the R-circles which"; St[4]="contains an arc of S21. These"; St[5]="R-circles correspond to the red-blue-green"; St[6]="combos we have been plotting. Plot one now."; St[8]="Certainly there are some relevant R-circles"; St[9]="for which the second cusp is disjoint from the"; St[10]="blue arc-e.g. the one you just plotted!"; St[11]="If the property ever fails then there is some"; St[12]="relevant R-circle for which the second cusp"; St[13]="is an endpoint of the blue arc. (Here we mean"; St[14]="the hypothetical continuum of relevant"; St[15]="R-circles, not just the 30 you can plot.) Given"; St[16]="we know about the first cusp, we would have"; St[17]="produced a relevant R-circle X for which"; St[18]="the two cusps of ELEV2(X) are the endpoints of"; St[19]="the blue arc of X, namely X # S21."; St[20]="Call X a wierd R-circle. We have to rule"; St[21]="out the existence of wierd R-circles."; St[23]="Suppose X is a wierd R-circle. By symmetry"; St[24]="we can assume that X is in S12B"; St[25]="(exercise: plot such an X."; St[26]="Of course, the one you plot"; St[27]="won't be wierd; there aren't any wierd ones!"; St[28]="now add C1 and E2 to the plot.)"; St[30]="Note that the blue-green and red-green"; St[31]="intersection points of ELEV2(X) both lie on"; St[32]="on ELEV2(E2). The cusp points of ELEV2(X) are"; St[33]="the points of extreme height. Hence, the"; St[34]="b/g point lies above the r/g point."; St[48]="ELEV2"; St[47]="HYP1 part 3"; St[46]="cusp 2, part 2."; St[45]="about cusp 1"; L[8].future=700; L[7].future=794; L[6].future=961; L[5].future=950; D.pix=6; D.ACTIVE=0; D.repaint(); } if(MESSAGE==961) { St[0]="cusp 2, part 2."; St[1]="For the R-circle you have"; St[2]="plotted the r/g point lies above the"; St[3]="the b/g point. Hence, by continuity there is"; St[4]="some relevant R-circle Y for which the b/g"; St[5]="point and the r/g point have the same"; St[6]="height. By the height principle for HYP1,"; St[7]="the b/g points and r/g points of HYP1(Y)"; St[8]="lie one the same fiber geodesic."; St[10]="What is wrong with this picture. If"; St[11]="(the parameter) s=0 there is nothing wrong"; St[12]="with this picture. (exercise: do the plot for"; St[13]="s=0 note that the b/g and r/g points lie"; St[14]="on the same fiber geodesic in HYP1.) In"; St[15]="this case we contradict the existence of"; St[16]="X directly: the b/g and r/g points of HYP1(X)"; St[17]="do not lie on the same fiber geodesic.)"; St[18]="Henceforth assume s>0."; St[19]="Assume that the b/g and r/g points of"; St[20]="HYP1(Y) lie on the same fiber geodesic g"; St[21]="Recalling the construction of S21"; St[22]="we note that the r/g and b/g points of Y"; St[23]="are harmonic partners with respect to (E2,Q2)"; St[24]="Since HYP1 is linear fractional when restricted"; St[25]="to E2 we see from basic conformal geometry"; St[26]="that g is perpendicular to the circle V2"; St[27]="which is perpendicular to HYP1(E2) and contains"; St[28]="the endpoints of HYP1(Q2)."; St[29]="On the other hand, g is also perpendicular"; St[30]="to the circle V0 which is perpendicular to"; St[31]="HYP1(E0) and contains th endpoints of HYP1(Q0)"; St[32]="Finally, g is perpendicular to the line V1"; St[33]="bounding the half-plane. In summary g is perp."; St[34]="to V0,V1,V2. We will now rules this out."; St[48]="ELEV2"; St[47]="HYP1 part 3"; St[46]="cusp 2, part 3."; St[45]="S21"; L[8].future=700; L[7].future=794; L[6].future=962; L[5].future=261; } if(MESSAGE==962) { St[0]="cusp 2, part 3."; St[1]="STEP 1"; St[2]="The geodesic g lies on a circle which"; St[3]="is perpendicular to the three circles V0,V1,V2"; St[4]="We think of the line V1 as a generalized circle"; St[5]="Such a 'triply perpendicular circle' is unique"; St[6]="unless V0 # V1 # V2 is nonempty."; St[8]="STEP 2"; St[9]="In fact V0#V1#V2=(()) for s>0. This is hard"; St[10]="to see for s small, but for (say) s>4 it is"; St[11]="obvious from the plots. To actually prove the"; St[12]="Goldman-Parker conjecture we only need the"; St[13]="case s>sqrt(35)>4. So we will not further"; St[14]="justify the claim that V0#V1#V2=(())."; St[19]="STEP 3:"; St[20]="Given that V0#V1#V2=(()), the geodesic g is"; St[21]="UNIQUE. Let R1 be the axis of S1. Then"; St[22]="HYP1(R1) is a fiber geodesic which, by symmetry"; St[23]="is simultaneously perpendicular to V0,V1,V2."; St[24]="By uniqueness g=HYP1(R1)."; St[26]="STEP 4:"; St[27]="Given that g=HYP1(R1) the height principle"; St[28]="tells us that ELEV2 maps the b/g and r/g"; St[29]="points of Y into the set ELEV2(C1) # ELEV2(E2)"; St[30]="But then ELEV2(Y) is neither up-monotonicity nor"; St[31]="nor down monotonicity. It is one of the 2"; St[32]="exceptions. This is a contradiction."; St[48]="precise statment"; St[47]="HYP1 part 3"; St[46]="2 exceptions"; St[45]=""; L[8].future=500; L[7].future=794; L[6].future=980; L[5].future=962; } if(MESSAGE==980) { St[0]="2 exceptions"; St[1]="S1 is made from the union of 2 hemispheres,"; St[2]="each foliated by R-arcs. It turns out that"; St[3]="there is a unique R-circle R1 contained in S1."; St[4]="R1 intersects each hemisphere in 2 of the"; St[5]="R-arcs. In my preprint I call R1 the R-axis"; St[6]="You can plot a picture of R1 using the applet,"; St[7]="The axis R2 is defined similarly for S2."; St[9]="We have ELEV2(R1-E0)=ELEV2(C1) # ELEV2(E2)."; St[10]="ELEV2 maps the 2 R-arcs of R1 # S21"; St[11]="to the two points of ELEV2(C1) # ELEV2(E2)."; St[12]="this accounts for the two exceptional arcs"; St[13]="which neither rise nor fall. These"; St[14]="exceptional arcs must exist, by symmetry."; St[15]="There is no other way to make the transition"; St[16]="from rising to falling."; St[48]="ELEV2"; St[47]="S1"; St[46]=""; St[45]=""; L[8].future=700; L[7].future=250; L[6].future=980; L[5].future=980; } if(MESSAGE==998) { St[0]="gallery"; St[1]="Click the purple buttons to see some nice"; St[2]="plots. Once a plot is done you can use"; St[3]="the applet controls to adjust it any way"; St[4]="you like."; St[48]=""; St[47]=""; St[46]=""; St[45]=""; L[8].future=998; L[7].future=998; L[6].future=998; L[5].future=998; GALLERY=1; repaint(); } if(MESSAGE==999) { St[0]="notation"; St[1]="R and C denote the real and complex numbers."; St[2]="R^n is real n-space; C^n is complex n-space"; St[3]="CP^2 denotes the complex projective plane."; St[4]="S^3 is the unit 3-sphere in C^2."; St[5]="CH^2 is the open unit ball in C^2."; St[6]="PU(2,1) is the automorphism group of CH^2."; St[8]="[z] = the complex conjugate of z"; St[9]=" = (2,1) Hermitian dot of x and y."; St[10]="A # B = the intersection of A and B."; St[11]="A u. B = the union of A and B."; St[12]="(()) = emptyset."; St[13]="p0,p1,p2: vertices of the ideal triangle."; St[14]="I0,I1,I2: generators of the group"; St[15]="C0,C1,C2: C-circles fixed by I0,I1,I2"; St[16]="E0: C-circle stabilized by I1.I0.I2"; St[17]="Q0: C-arc of E0 stabilized by I1.I0.I2."; St[18]="E1=I2(E0) and E2=I1(E0). Likewise for Q1,Q2."; St[19]="S0,S1,S2: R-spheres stabilized by I0,I1,I2"; St[20]="S10, S21: hemispheres of S1."; St[21]="S20, S21: hemispheres of S2."; St[22]="R1,R2: R-axes of S1 and S2."; St[23]="S(E0,Q0;x): ELEV2 fiber connecting x to Q0."; St[24]="A=S(E0,Q0;p0)."; St[25]="Some Relations:"; St[26]="S10=S10A u. S10B, etc."; St[27]="S1=S10 u. S12"; St[28]="S2=S20 u. S21"; St[29]="C1=S10 # S12"; St[30]="C2=S20 # S21"; St[31]="S10 # S12=C1"; St[32]="S20 # S21=C2."; St[33]="(S10A u. S12A) # (S10B u. S12B)=R1"; St[34]="(S20A u. S21A) # (S20B u. S21B)=R2"; St[35]="Q1#=E1 # S2= Q1 # S2"; St[36]="Q2#=E2 # S1= Q2 # S1"; St[48]="type (2,1) form"; St[47]="triangle group"; St[46]="C-circles and C-arcs"; St[45]="R-circles and R-arcs"; L[8].future=221; L[7].future=280; L[6].future=210; L[5].future=211; } if(MESSAGE==1000) { St[0]="math"; St[1]="Here is a list of the basic math topics"; St[2]="underlying the applet. This is not the"; St[3]="complete list. Some additional topics are"; St[4]="introduced elsewhere in the text. However,"; St[5]="this is a pretty good foundation."; St[7]="1. Hermitian Geometry"; St[8]="a. The form of type (2,1)"; St[9]="b. CP^2"; St[10]="c. PU(2,1)"; St[11]="d. The element classification in PU(2,1)"; St[13]="2. CR Objects"; St[14]="a. C-circles and C-arcs"; St[15]="b. R-circles and R-arcs"; St[16]="c. The contact structure"; St[18]="3. Triangle Groups"; St[20]="Bill Goldman's book has information about all"; St[21]="these topics, and so does my preprint."; L[8].future=240; L[6].future=120; L[5].future=110; L[7].future=280; St[48]="Bill's book"; St[46]="2. CR objects"; St[45]="1. Hermitian Geometry"; St[47]="3. triangle groups"; } if(MESSAGE==1001) { St[0]="modify applet"; St[1]="If you click the button below, the"; St[2]="background color in this window changes"; St[3]="to the color shown on the color selector."; St[13]="These buttons control the font type."; St[14]="The first 3 buttons let you choose between 3"; St[15]="different fonts."; St[16]="The second 6 buttons let you choose the"; St[17]="font size, from 9 pts to 14 pts."; St[18]="The last button resets the font to the"; St[19]="original value, which is 12pt Helvetica."; St[25]="These buttons toggle the double buffering"; St[26]="feature. The double buffering makes the"; St[27]="graphics look better but some browsers have"; St[28]="trouble with it. If the applet seems to be"; St[29]="running fine, it is best to leave these buttons"; St[30]="alone. The 6 buttons correspond in an obvious way"; St[31]="to the 6 windows of the applet (yellow=on)"; L[8].future=1001; L[6].future=1001; L[5].future=1001; L[7].future=1001; St[48]=""; St[46]=""; St[45]=""; St[47]=""; } } } class DocumentCanvas extends DoubleBufferedCanvas implements MouseListener { String St[]=new String[30]; int MESSAGE,history; int ACTIVE; Font font; int pix; Color COL,TCOL; DocumentCanvas() { addMouseListener(this); setBackground(Color.black); MESSAGE=50; history=-1; on=0; font=new Font("Helvetica",Font.PLAIN,11); ACTIVE=0; TCOL=Color.white; COL=new Color(0,0,200); } public void paint(Graphics gfx) { Graphics2D g=(Graphics2D) gfx; g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); setMESSAGE(); g.setFont(font); if(ACTIVE==1) { g.setColor(Color.white); g.drawRect(0,0,301,221); for(int i=2;i<=21;++i) { g.drawString(St[i],10,-13+14*i); history=MESSAGE; } } if(ACTIVE==0) pixRender(g); } void pixRender(Graphics g) { g.setColor(COL); g.fillRect(0,0,301,221); g.setColor(TCOL); g.drawRect(0,0,301,221); if(pix==0) { g.setFont(font); g.setColor(TCOL); g.drawString("Rich: Applet 45",10,20); g.drawString("June 23, 2004",100,20); g.translate(0,-3); g.drawString("An",10,60); g.drawString("Interactive",10,75); g.drawString("Proof",10,90); g.drawString("of",10,105); g.drawString("the",10,120); g.drawString("Goldman-Parker",10,135); g.drawString("Conjecture",10,150); g.translate(0,3); g.drawString("Click on this window or",10,183); g.drawString("on the 'doc:on' button",10,198); g.drawString("to activate the documentation text.",10,213); } if(pix==1) { g.translate(0,-13); g.setColor(Color.red); g.fillRect(20,20,15,30); g.setColor(TCOL); g.drawRect(20,20,15,30); g.setColor(new Color(100,100,255)); g.fillRect(20,50,15,100); g.setColor(TCOL); g.drawRect(20,50,15,100); g.setColor(new Color(0,200,0)); g.fillRect(20,150,15,30); g.setColor(TCOL); g.drawRect(20,150,15,30); g.drawString("a short-long-short combo",43,30); g.translate(10,-30); g.setColor(new Color(0,200,0)); g.drawArc(80,80,160,160,90,180); g.setColor(new Color(100,100,255)); g.drawArc(80,80,160,160,270,90); g.setColor(Color.red); g.drawArc(80,80,160,160,0,90); g.setColor(TCOL); g.drawLine(160,50,160,260); g.drawString("Ej",145,255); g.drawLine(200,160,280,160); g.drawString("C1",265,150); g.translate(-10,40); } if(pix==2) { g.translate(-20,-68); g.setColor(new Color(0,200,0)); g.drawArc(80,80,160,160,90,180); g.setColor(new Color(100,100,255)); g.drawArc(80,80,160,160,270,90); g.setColor(new Color(0,200,0)); g.drawArc(80,80,160,160,0,90); g.setColor(Color.red); g.drawLine(160,0,160,320); g.setColor(TCOL); g.fillOval(157,77,6,6); g.fillOval(157,197,6,6); g.fillOval(157,237,6,6); g.fillOval(237,157,6,6); g.fillOval(157,277,6,6); g.drawLine(160,200,160,280); g.drawString("Q0",140,260); g.drawString("E0",140,150); g.drawString("b1",165,200); g.drawString("a1",165,232); g.drawString("a2",165,92); g.drawString("b2",165,280); g.drawString("R(x)",83,85); g.drawLine(200,160,280,160); g.drawString("C1",265,150); g.drawString("x",243,170); g.drawString("S(E0,Q0;x)",230,230); g.translate(20,40); } if(pix==3) { g.translate(0,-40); g.setColor(Color.red); g.drawOval(50,50,200,200); g.setColor(new Color(100,100,255)); g.drawLine(0,100,300,100); g.drawLine(235,0,235,300); g.drawLine(0,65,300,235); g.setColor(TCOL); g.fillOval(232,97,6,6); g.fillOval(60,97,6,6); g.fillOval(233,196,6,6); g.drawString("C1",240,60); g.drawString("p2",240,92); g.drawString("C0",280,92); g.drawString("p1",60,118); g.drawString("p0",215,205); g.drawString("C2",280,220); g.drawString("S^3",70,63); g.translate(0,40); } if(pix==4) { g.translate(-20,-10); g.setColor(new Color(200,200,200)); g.fillOval(63,70,100,100); g.drawOval(63,70,100,100); g.setColor(new Color(255,0,0)); g.fillOval(150,120,100,100); g.drawOval(150,120,100,100); g.setColor(new Color(100,100,255)); g.fillOval(150,20,100,100); g.drawOval(150,20,100,100); g.setColor(TCOL); g.drawString("S1",250,52); g.drawString("S0",55,90); g.drawString("S2",140,203); } if(pix==5) { g.translate(-20,-65); g.setColor(new Color(100,100,255)); g.drawArc(80,80,160,160,270,90); g.setColor(new Color(100,100,255)); g.drawArc(80,80,160,160,0,90); g.setColor(Color.red); g.drawLine(160,0,160,320); g.setColor(TCOL); g.fillOval(157,77,6,6); g.fillOval(157,197,6,6); g.fillOval(157,237,6,6); g.fillOval(237,157,6,6); g.fillOval(157,277,6,6); g.drawLine(160,200,160,280); g.drawString("Q0",140,260); g.drawString("E0",140,150); g.drawString("b1",165,200); g.drawString("a1",165,232); g.drawString("a2",165,94); g.drawString("b2",165,280); g.drawString("A(x)",190,83); g.drawString("x",243,170); g.translate(20,65); } if(pix==6) { g.translate(0,-35); g.setColor(Color.black); g.fillRect(30,40,250,30); g.fillRect(30,220,250,30); g.setColor(new Color(150,150,150)); g.drawRect(30,40,250,30); g.drawRect(30,220,250,30); g.drawString("C1",120,62); g.drawString("E2",120,242); g.translate(50,50); g.setColor(Color.red); g.fillRect(20,20,15,30); g.setColor(TCOL); g.drawRect(20,20,15,30); g.setColor(new Color(100,100,255)); g.fillRect(20,50,15,100); g.setColor(TCOL); g.drawRect(20,50,15,90); g.setColor(new Color(0,200,0)); g.fillRect(20,140,15,30); g.setColor(TCOL); g.drawRect(20,140,15,30); g.drawString("a short-long-short combo",43,58); g.drawString("connecting C1 to E2",43,75); g.translate(-50,-50); g.translate(0,35); } if(pix==7) { g.translate(0,-35); g.setColor(Color.black); g.fillRect(30,40,250,30); g.fillRect(30,220,250,30); g.fillRect(70,70,15,30); g.fillRect(70,190,15,30); g.setColor(new Color(100,100,255)); g.fillRect(70,100,15,90); g.setColor(new Color(150,150,150)); g.drawRect(30,40,250,30); g.drawRect(30,220,250,30); g.drawRect(70,70,15,30); g.drawRect(70,190,15,30); g.drawRect(70,100,15,90); g.drawString("E0",120,62); g.drawString("C1",120,242); g.translate(0,35); } if(pix==8) { g.setColor(TCOL); g.translate(0,-12); g.drawString("Downward flow of implications:",10,25); g.translate(0,-6); g.drawString("monotonicity",10,50); g.drawString("calculus problem",120,50); //g.setFont(new Font("Helvetica",Font.PLAIN,10)); g.drawString("ELEV2(S1-E0) # ELEV2(S2-E0)=ELEV2(p0)",35,140); g.drawString("ELEV2(C1) # ELEV2(C2)=ELEV2(p0)",100,85); g.setFont(font); g.drawString("properties",50,170); g.drawString("of ELEV2 & S1",50,185); g.drawString("(S1-E0) # (S2-E0) = A",130,235); g.drawLine(150,55,150,70); g.drawLine(30,55,150,125); g.drawLine(150,90,150,125); g.drawLine(282,90,282,150); g.drawLine(10,55,10,210); g.drawLine(282,150,160,220); g.drawLine(10,210,160,220); g.drawLine(200,150,160,220); g.drawLine(80,190,160,220); g.translate(0,18); } if(pix==9) { g.translate(0,-35); g.setColor(Color.black); g.fillRect(100,40,10,150); g.setColor(new Color(0,170,0)); g.fillRect(30,140,230,20); g.setColor(TCOL); g.drawString("C1",120,155); g.setColor(new Color(100,100,255)); g.fillRect(100,180,10,70); g.setColor(new Color(180,180,255)); g.fillRect(100,40,10,80); g.setColor(new Color(150,150,150)); g.drawRect(100,160,10,20); g.drawRect(100,180,10,70); g.drawRect(100,120,10,20); g.drawRect(100,40,10,80); g.translate(0,35); } } void setMESSAGE() { for(int i=1;i<=21;++i) St[i]=""; if(MESSAGE==-1) { St[2]="You are not currently interacting."; St[3]="with the applet. Move the cursor"; St[4]="into one of the windows of the"; St[5]="applet to interact with it"; } if(MESSAGE==0) { St[2]="This is the documentation window."; St[3]="If you want to learn about some part of"; St[4]="the applet, move the mouse over that part"; St[5]="and then read about it here."; St[6]="When the documentation feature is not active"; St[7]="this window is used to display pictures"; St[8]="which accompany the text. You can"; St[9]="switch between the two modes of this window"; St[10]="either by clicking on this window or by"; St[11]="using the 'doc:on' and 'doc:off' keys below."; } if(MESSAGE==1) { St[2]="You have entered the control panel."; St[3]="In the control panel you can select"; St[4]="objects to plot, and control the"; St[5]="parameters of the plot. Once you"; St[6]="push the plot button, the selected objects"; St[7]="are plotted in 6 coordinate systems:"; St[8]="ELEV1/ELEV2, PLAN1/PLAN2, HYP1/HYP2."; } if(MESSAGE==2) { St[2]="You've entered the text illustrator."; St[3]="This window draws figures which"; St[4]="accompany the text."; } if(MESSAGE==3) { St[2]="You've entered the text window."; St[3]="Click on a key to read about the displayed"; St[4]="topic. The current topic title is shown at"; St[5]="the top left. The left 6 and right 8 keys"; St[6]="do not change. The middle 4 keys change"; St[7]="according to the displayed topic."; St[8]="Some specially important things:"; St[9]="Click the 'restart' to return to the intro."; St[10]="Click the 'back' text page to backtrack."; St[11]="Click on the 'notation' key for notation."; St[12]="Click the 'modify' key to change some"; St[13]="basic features of the applet's operation,"; St[14]="including the font and text size."; } if(MESSAGE==4) { St[2]="You've entered the ELEV window."; St[3]="The black vertical stripe represents a cylinder"; St[4]="and the edges are meant to be identified."; St[5]="The cylinder is the range for all the plots."; } if(MESSAGE==5) { St[2]="You've entered the PLAN window."; St[3]="The white dot is the origin."; St[4]="The plane is the range for all the plots."; } if(MESSAGE==6) { St[2]="You've entered the HYP window."; St[3]="The black region is a half-plane."; St[4]="This half-plane is the range for the plots."; } if((MESSAGE==43)||((MESSAGE>=4)&&(MESSAGE<=6))) { St[6]="Once the picture is plotted you can"; St[7]="rescale/recenter it by clicking on the window."; St[8]="If you click on the window the picture is scaled"; St[9]="about that point by a factor controlled by the"; St[10]="blue slider labelled 'scale'."; St[11]="The scale factor is less than 1 when the white"; St[12]="bar on this slider is to the left of center."; St[13]="The scale factor is greater than 1 when"; St[14]="the white bar on the slider is to the right"; St[15]="of center. You can scale up by a factor of 20"; St[16]="and down by a factor of 5."; } if(MESSAGE==7) { St[2]="This is the parameter slider. The objects in"; St[3]="the applet are parametrized by a number in the"; St[4]="interval [0,sqrt(125/3)). Click the slider to"; St[5]="select a parameter. Depending on the mode (as"; St[6]="controlled by the leftside button) the picture"; St[7]="is automatically replotted at the new parameter"; St[8]="value or not. The parameter value s is displayed"; St[9]="in black. The 2 lighter numbers display"; St[10]="s/sqrt(35) and s/sqrt(125/3). The parameter"; St[11]="selection is nonlinear: more of the bar is"; St[12]="dedicated to [sqrt(35),sqrt(125/3)), where the"; St[13]="conjecture was open. For computational reasons"; St[14]="any s>s0=sqrt(125/3)-.00001 is reset to s0."; } if(MESSAGE==8) { St[2]="This is the color selector. It"; St[3]="consists of 35 little squares and"; St[4]="a big rectangle. Click on a"; St[5]="little square and the big rectangle"; St[6]="will change to the color on that square."; St[7]="When you select an object to plot, it will"; St[8]="be plotted in the color shown on the big"; St[9]="rectangle. You can also use the color"; St[10]="selector in tandem with the 'modify applet'"; St[11]="button to change the colors of"; St[12]="of the text window."; } if(MESSAGE==9) { St[2]="This is the plot density selector."; St[3]="When the marker is at the left"; St[4]="the curves are drawn at low density."; St[5]="When the marker is at the right"; St[6]="the curves are drawn at high density."; St[7]="Referring to the number D shown at the"; St[8]="the right hand side of the slider:"; St[9]="the curves E1,E2 are plotted using 3xD points."; St[10]="the curves C1,C2 are plotted using 2xD points."; St[11]="All other curves are plotted using D points."; St[12]="The picture is NOT automatically replotted"; St[13]="after you change the plot density."; St[14]="On a slow computer you should keep the"; St[15]="plot density low to avoid delays."; } if(MESSAGE==10) { St[2]="This is the erase switch. Click to activate."; St[3]="The erase button is active when colored black. "; St[4]="When the switch is active, you can de-select"; St[5]="objects on the object selectors. You de-select"; St[6]="objects by clicking on them, or in some cases"; St[7]="by dragging the mouse over them."; } if(MESSAGE==11) { St[2]="This is the plot button. When you push"; St[3]="it, the selected objects are plotted in 3"; St[4]="coordinate systems: ELEV, PLAN, HYP."; St[7]="When 'plot' is pushed, the words"; St[8]="'computing, please wait' appear. Assuming"; St[9]="the mouse button has been subsequently,"; St[10]="moved, these words disappear when the."; St[11]="plot is done."; } if(MESSAGE==12) { St[2]="This is the 'truncate arcs' slider."; St[3]="This slider determines how much of"; St[4]="the selected R-arcs are plotted."; St[5]="This function is rather hard to"; St[6]="describe. If you click the 'money' button"; St[7]="then click various parts of the slider,"; St[8]="and replot, you will get the idea."; St[9]="The number printed on the slider"; St[10]="indicates the fraction that is drawn."; St[11]="The rightside button resets the value"; St[12]="to 1, so that the arcs are fully drawn."; } if(MESSAGE==13) { St[2]="This is the clear button."; St[3]="When you push this button the "; St[4]="object selectors are cleared."; } if(MESSAGE==14) { St[2]="'Show me the money' button: our proof of the"; St[3]="conjecture comes down to showing, for each"; St[4]="parameter, that a certain pair of subsets of the"; St[5]="cylinder intersect in just one point. If you push"; St[6]="this button you will see a plot of the two subsets,"; St[7]="one red and one blue. Incidentally, the phrase"; St[8]="'show me the money' means"; St[9]="'come right away to the central point'."; St[10]="You can see the plot in the HYP and PLAN"; St[11]="windows by turning these windows on. (Use the"; St[12]="blue on/off button.) The HYP2 and PLAN2"; St[13]="coords are better adapted to the picture but the"; St[14]="HYP1 and PLAN1 coords require less computation."; } if(MESSAGE==15) { St[2]="This is the part of object selector 1 "; St[3]="which selects the C-circle E0."; St[4]="This object is only plotted in HYP1 coords."; St[5]="Click on this object to select it for plotting."; St[6]="Note that there is a button for E0 also on"; St[7]="the object selector 2. This comes about"; St[8]="because E0 is naturally involved in the"; St[9]="definitions of both S1 and S2."; St[10]="If you select E0 on both selectors, the right"; St[11]="one is plotted on top of the left one"; } if(MESSAGE==16) { St[2]="This is the part of object selector 1 "; St[3]="which selects the object NS10."; } if(MESSAGE==17) { St[2]="This is the part of object selector 1 "; St[3]="which selects the object S10."; St[10]="You can select the whole object at once"; St[11]="by clicking on the S10 button."; } if(MESSAGE==18) { St[2]="This is the part of object selector 1 "; St[3]="which selects the object SS10."; } if(MESSAGE==19) { St[2]="This is the part of object selector 1 "; St[3]="which selects the C-circle C1."; St[5]="Click on this object to select it for plotting."; } if(MESSAGE==20) { St[2]="This is the part of object selector 1 "; St[3]="which selects the object NS21."; } if(MESSAGE==21) { St[2]="This is the part of object selector 1 "; St[3]="which selects the object S21."; } if(MESSAGE==22) { St[2]="This is the part of object selector 1 "; St[3]="which selects the object SS21."; } if(((MESSAGE>=16)&&(MESSAGE<=18))||((MESSAGE>=20)&&(MESSAGE<=22))) { St[5]="This object is an infinite union of arcs,"; St[6]="one per point of C1. The applet lets you"; St[7]="select 30 of these arcs. Click the mouse"; St[8]="to select the arcs individually. Drag the"; St[9]="mouse to select the arcs more rapidly."; St[10]="N stands for 'North' and S stands for 'South'"; } if((MESSAGE==17)||(MESSAGE==21)) { St[10]="We have broken this object up as"; St[11]="S(E,Q;C)=SA u. SB. For instance:"; St[12]="S10=S10A u. S10B."; St[13]="You can select all 15 arcs at once"; St[14]="by clicking on the SA and SB buttons."; } if(MESSAGE==23) { St[2]="This is the part of object selector 1 "; St[3]="which selects the C-circle E2. "; St[5]="Click on this object to select it for plotting."; } if(MESSAGE==24) { St[2]="This is the part of object selector 1 "; St[3]="which selects the C-arc Q0. "; St[4]="This object is only plotted in HYP1 coords."; St[5]="Click on this object to select it for plotting."; St[6]="Note that there is a button for Q0 also on"; St[7]="the object selector 2. This comes about"; St[8]="because Q0 is naturally involved in the"; St[9]="definitions of both S1 and S2."; St[10]="If you select Q0 on both selectors, the right"; St[11]="one is plotted on top of the left one"; } if(MESSAGE==25) { St[2]="This is the part of object selector 1 "; St[3]="which selects the C-arc Q2. "; St[5]="Click on this object to select it for plotting."; } if(MESSAGE==26) { St[2]="This is the control button which controls the"; St[3]="mode of the truncate arcs bar. In one mode"; St[4]="you need to push the plot button when you"; St[5]="want to replot the image. In the other modes"; St[6]="the picture is replotted automatically."; } if(MESSAGE==27) { St[2]="This is the control button which controls the"; St[3]="mode of the parameter selector. In one mode"; St[4]="you need to push the plot button when you"; St[5]="want to replot the image. In the other modes"; St[6]="the picture is replotted automatically"; } if(MESSAGE==28) { St[2]="This is the part of object selector 2 "; St[3]="which selects the C-circle E0. "; St[4]="This object is only plotted in HYP1 coords."; St[5]="Click on this object to select it for plotting."; St[6]="Note that there is a button for E0 also on"; St[7]="the object selector 1. This comes about"; St[8]="because E0 is naturally involved in the"; St[9]="definitions of both S1 and S2."; } if(MESSAGE==29) { St[2]="This is the part of object selector 2 "; St[3]="which selects the object NS20."; } if(MESSAGE==30) { St[2]="This is the part of object selector 2 "; St[3]="which selects the object S20."; St[10]="You can select the whole object at once"; St[11]="by clicking on the S20 button."; } if(MESSAGE==31) { St[2]="This is the part of object selector 2 "; St[3]="which selects the object SS20."; } if(MESSAGE==32) { St[2]="This is the part of object selector 2 "; St[3]="which selects the C-circle C2. "; St[5]="Click on this object to select it for plotting."; } if(MESSAGE==33) { St[2]="This is the part of object selector 2 "; St[3]="which selects the object NS21."; } if(MESSAGE==34) { St[2]="This is the part of object selector 2 "; St[3]="which selects the object S21."; St[10]="You can select the whole object at once"; St[11]="by clicking on the S21 button."; } if(MESSAGE==35) { St[2]="This is the part of object selector 2 "; St[3]="which selects the object SS21."; } if(((MESSAGE>=29)&&(MESSAGE<=31))||((MESSAGE>=33)&&(MESSAGE<=35))) { St[5]="This object is an infinite union of arcs,"; St[6]="one per point of C2. The applet lets you"; St[7]="select 30 of these arcs. Click the mouse"; St[8]="to select the arcs individually. Drag the"; St[9]="mouse to select the arcs more rapidly."; St[10]="N stands for 'North' and S stands for 'South'"; } if((MESSAGE==30)||(MESSAGE==34)) { St[10]="We have broken this object up as"; St[11]="S(E,Q;C)=SA u. SB. For instance:"; St[12]="S20=S20A u. S20B."; St[13]="You can select all 15 arcs at once"; St[14]="by clicking on the SA and SB buttons."; } if(MESSAGE==36) { St[2]="This is the part of object selector 2 "; St[3]="which selects the C-circle E1. "; St[5]="Click on this object to select it for plotting."; } if(MESSAGE==37) { St[2]="This is the part of object selector 2 "; St[3]="which selects the C-arc Q0. "; St[4]="This object is only plotted in HYP1 coords."; St[5]="Click on this object to select it for plotting."; St[6]="Note that there is a button for Q0 also on"; St[7]="the object selector 1. This comes about"; St[8]="because Q0 is naturally involved in the"; St[9]="definitions of both S1 and S2."; St[10]="If you select Q0 on both selectors, the right"; St[11]="one is plotted on top of the left one"; } if(MESSAGE==38) { St[2]="This is the part of object selector 2 "; St[3]="which selects the C-arc Q1. "; St[5]="Click on this object to select it for plotting."; } if((MESSAGE==1)||((MESSAGE>=7)&&(MESSAGE<=39))) { St[15]="Press the 'objects' and 'coords'"; St[16]="buttons for info about the objects and coords."; } if((MESSAGE>=84)&&(MESSAGE<=86)) { St[5]="Click on this object to select it for plotting."; St[15]="Press the 'objects' and 'coords'"; St[16]="buttons for info about the objects and coords."; } if((MESSAGE>=97)&&(MESSAGE<=99)) { St[5]="Click on this object to select it for plotting."; St[15]="Press the 'objects' and 'coords'"; St[16]="buttons for info about the objects and coords."; } if(MESSAGE==43) { St[2]="Click on this slider to change the scale factor."; } if(MESSAGE==44) { St[2]="This button toggles between 2 different but"; St[3]="related coordinate systems:"; St[4]="ELEV1 and ELEV2 in the ELEV window"; St[5]="PLAN1 and PLAN2 in the PLAN window"; St[6]="HYP1 and HYP2 in the HYP window"; St[7]="To learn about these coordinate systems,"; St[8]="click on the 'coords' button."; } if(MESSAGE==45) { St[2]="This button resets the scaling, translation"; St[3]="and aspect ratio factors to their"; St[4]="initial settings."; } if(MESSAGE==46) { St[2]="Click on this slider to change the"; St[3]="aspect ratio by rescaling the x-axis."; } if(MESSAGE==47) { St[2]="This button turns the plotting window on"; St[3]="and off. If you are interested in one of"; St[4]="plot windows but not the other two, you"; St[5]="can turn the other ones off, and thereby"; St[6]="get a faster plot in the window of interest."; } if(MESSAGE==50) { for(int i=1;i<=21;++i) { St[i]=""; } St[2]="COMPUTING. PLEASE WAIT..."; St[4]="It is best not to click the mouse while"; St[5]="a computation is going on."; St[6]="To test if the computation is done, move"; St[7]="the mouse around over a wide range of"; St[8]="the applet. This MESSAGE will disappear"; St[9]="(and be replaced by a different MESSAGE)"; St[10]="when the computation is done."; } if(MESSAGE==55) { St[2]="Push this button to take the tutorial"; St[3]="The tutorial explains how you use"; St[4]="the applet. After you push the button,"; St[5]="you will see the tutorial in the text window."; } if(MESSAGE==56) { St[2]="Push this button to learn about the objects"; St[3]="which the applet plots. After you push this"; St[4]="button you will see the information in the text."; St[5]="window."; } if(MESSAGE==57) { St[2]="Push this button to learn about the"; St[3]="coordinate systems in which the objects"; St[4]="are plotted. After you push the button"; St[5]="you will see the information in the text"; St[6]="window."; } if(MESSAGE==70) { St[2]="This cluster of 4 buttons controls"; St[3]="The plotting detail. When the button"; St[4]="N is activated, each tall thin rectangle"; St[5]="on the object selector stands for N arcs."; St[6]="Here N=1,2,4,8. If you are working on a"; St[7]="slow computer, it is good practice to"; St[8]="first make the plots with N=1 and only"; St[9]="increase N if the plot for N=1 is done"; St[10]="quickly. If you set N large and don't"; St[11]="check the plot in advance you could be"; St[12]="in for a long delay."; } if(MESSAGE==71) { St[2]="This button resets the 'truncate arcs' slider"; St[3]="to the rightmost position. In this position"; St[4]="the arcs are completely plotted."; } if(MESSAGE==84) { St[2]="This is the part of object selector 1 "; St[3]="Which selects the auxilliary object HQ0"; St[4]="This object is only plotted in HYP coordinates."; St[5]="HQ0 can also be selected from object selector 2."; } if(MESSAGE==85) { St[2]="This is the part of object selector 1 "; St[3]="Which selects the R-axis R1"; St[4]="This object is not plotted in ELEV coordinates."; } if(MESSAGE==86) { St[2]="This is the part of object selector 1 "; St[3]="Which selects the C-arc Q2#"; } if(MESSAGE==99) { St[2]="This is the part of object selector 2 "; St[3]="Which selects the C-arc Q1#"; } } public void mousePressed(MouseEvent e) {} public void mouseReleased(MouseEvent e) {} public void mouseEntered(MouseEvent e) { MESSAGE=0; if(ACTIVE==1) repaint(); } public void mouseExited(MouseEvent e) { MESSAGE=-1; if(ACTIVE==1) repaint(); } public void mouseClicked(MouseEvent e) { ACTIVE=1-ACTIVE; repaint(); } }