import java.awt.*; public class catmuller extends BufferedApplet { int w = 0, h; int selected=1; Cubic xspline[]=new Cubic[13]; Cubic yspline[]=new Cubic[13]; double GX[] = {130,120,110,100,110,120,130,140,150,160,150,140,130,120,110,120}; double GY[]= {100,110,120,130,140,150,160,150,140,130,120,110,100,110,120,130}; double min; double distance=0; public void init(){ w = bounds().width; h = bounds().height; } public void render(Graphics g) { for(int i=0;i<11;i++){ double xcoords[]= {GX[i],GX[i+1],GX[i+2],GX[i+3]}; double ycoords[]= {GY[i],GY[i+1],GY[i+2],GY[i+3]}; xspline[i]=new Cubic(Cubic.CATMULL_ROM,xcoords); yspline[i]=new Cubic(Cubic.CATMULL_ROM, ycoords); } // DRAW THE SPLINE g.setColor(Color.white); g.fillRect(0,0,w,h); g.setColor(Color.black); g.drawOval((int)GX[selected]-5,(int)GY[selected]-5,10,10); for(int i=0;i<11;i++){ for (double t = 0 ; t < 1 ; t+=.01) { int y = (int)(yspline[i].eval(t)); int x=(int)(xspline[i].eval(t)); int y2 = (int)(yspline[i].eval(t+.01)); int x2=(int)(xspline[i].eval(t+.01)); int tcoord=(int)(t*100); /* g.setColor(Color.red); g.drawLine(tcoord+100*i,x,tcoord+100*i+1,x); g.setColor(Color.blue); g.drawLine(tcoord+100*i,y,tcoord+100*i+1,y); */ g.drawOval((int)GX[i]-2,(int)GY[i]-2,4,4); g.setColor(Color.black); g.drawLine(x,y,x2,y2); } } } // RESPOND TO USER INPUT public boolean mouseUp(Event e, int x, int y) { min=100; for(int d=1;d<13;d++){ distance=Math.sqrt((x-GX[d])*(x-GX[d]) + (y-GY[d])*(x-GX[d])); if (distance<20 && distance<=min){ min=distance; selected=d; } } return true; } public boolean mouseDrag(Event e, int x, int y) { GX[selected]=x; GY[selected]=y; damage=true; return true; } }