/* part of DragSphere applet, copyright 1996,1998 John M Sullivan */ import java.awt.*; import java.lang.*; import java.text.NumberFormat; public class DragPanel extends Panel { Tform world , camera, incr; Point base, arwdir; double zoom = 2.4, arrowlen = .5; Image sph_img; String errmsg; Image back; Graphics bg; Dimension bsize = size(); int mode = 0; boolean busy = false; Color oct_col = new Color(.4f,.0f,.2f), arw_col = new Color(.7f,.5f,.0f), tri_col = new Color(.0f,.4f,.6f), sav_col = new Color(.1f,.1f,.2f); NumberFormat degfmt; Vect octa, arrow, tri, svarw; Point triverts[] = new Point[3]; int ntri; double lastx, lasty; DragPanel(Image s) { sph_img = s; } public void init() { Vect polyh = Poly.oct; polyh.tosphere(); octa=polyh.chop(20); octa.tosphere(); degfmt = NumberFormat.getNumberInstance(); degfmt.setMaximumFractionDigits(1); degfmt.setMinimumFractionDigits(1); reset(); } public String degs( double radians ) { return degfmt.format( radians * 180.0/Math.PI ); } public static String pad( String s, int wantlength ) { if(s.length() < wantlength) { return " ".substring(0, wantlength - s.length()) + s; } else { return s; } } public void save_arrow() { svarw = arrow; } public void reset() { world = Tform.xrot(.2).compose(Tform.yrot(.4)); base = new Point(0.,0.,1.); arwdir = new Point(arrowlen,0.,0.); movearrow(base); ntri = 0; svarw = null; repaint(); } public void setmode(int m) { mode = (m>=0 && m<=2)? m : 0; } void addtri(Point p) { if (++ntri > 3) ntri=1; changetri(p); } void changetri(Point p) { if (ntri==0) return; // should never get here triverts[ntri-1] = p; Path t = new Path(ntri); for (int i = 0; i 1) { r = Math.sqrt(r); x /= r; y /= r; r = 1; } z = Math.sqrt(1-r); return world.transpose().apply(new Point(x,y,z)); } void movebase(Point p) { p = p.scalar_mult(1/Math.sqrt(p.dot(p))); if (base.dot(p) < .1) { movebase(base.sum(p)); movebase(p); } else { movearrow(p); base = p; } } void movearrow(Point p) { Point side; double lambda = - arwdir.dot(p) / (1 + base.dot(p)); arwdir = arwdir.sum((base.sum(p)).scalar_mult(lambda)); /* arwdir = arwdir.scalar_mult(arrowlen/Math.sqrt(arwdir.dot(arwdir)));*/ side = p.cross(arwdir).scalar_mult(.2); Point tip = p.sum(arwdir); Path p1 = new Path(p.sum(arwdir.scalar_mult(.7)).sum(side), tip, p.sum(arwdir.scalar_mult(.7)).sum(side.neg())); Path p2 = new Path(p,tip); Path p3 = new Path(p.sum(side),p.sum(side.neg())); arrow = new Vect(p1, new Vect(p2, new Vect(p3))); } public void setcamera() { double s = size().width/zoom; camera = Tform.trans(size().width/2,size().height/2,0). compose(Tform.scale(s,s,1)). compose(Tform.scale(1,-1,1)); //compose(Tform.perspective(prsp)); } public void dopaint(Graphics g) { Tform t1 = camera.compose(world); g.setColor(Color.white); g.fillRect(0,0,size().width,size().height); g.setColor(oct_col); t1.apply(octa).paint_back(g,0); g.setColor(tri_col); if (ntri > 0) t1.apply(tri).paint_back(g,0); g.setColor(sav_col); if (svarw!=null) t1.apply(svarw).paint_back(g,0); g.setColor(arw_col); t1.apply(arrow).paint_back(g,0); int sphsize = (int)(size().width/zoom); g.drawImage(sph_img,size().width/2-sphsize,size().height/2-sphsize, 2*sphsize,2*sphsize,this); g.setColor(oct_col); t1.apply(octa).paint_front(g,0); g.setColor(tri_col); if (ntri > 0) t1.apply(tri).paint_front(g,0); g.setColor(sav_col); if (svarw!=null) t1.apply(svarw).paint_front(g,0); g.setColor(arw_col); t1.apply(arrow).paint_front(g,0); double ang[] = tri_angles(); if(ang != null) { g.setColor(tri_col); g.drawString( pad(degs(ang[0]),6) + " + " + pad(degs(ang[1]),6) + " + " + pad(degs(ang[2]),6) + " = 180 + " + degs( ang[0]+ang[1]+ang[2] - Math.PI ), 5, size().height - 5 ); } } private synchronized void done() { busy = false; notifyAll(); } }