import java.awt.*; public class catmullpatch extends BufferedApplet { int w = 0, h = 0; int selected=1; int aa,bb,cc; Cubic spline; Cubic spline2; Cubic spline3; double GX[][] = {{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}; double GX2[][]={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}; double GX3[][]={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}; double min; double tension=0.5; double distance=0; double time=1; boolean bounceflag; double snapped[][]=new double[4][4]; public void init(){ w = bounds().width; h = bounds().height; } public void render(Graphics g) { time+=1; for (int a=0;a<4;a++){ for (int b=0;b<4;b++){ if (snapped[a][b]!=0){ GX[a][b]+=(10/(time-snapped[a][b]))*10*Math.sin(time-snapped[a][b]); if (time-snapped[a][b]>50){ snapped[a][b]=0; } } } } spline=new Cubic(GX,tension); for (int a=0;a<4;a++){ for (int b=0;b<3;b++){ GX2[a][b]=GX[a][b+1]; } } spline2=new Cubic(GX2,tension); for (int a=0;a<4;a++){ for (int b=1;b<4;b++){ GX3[a][b]=GX[a][b-1]; } } spline3=new Cubic(GX3,tension); g.setColor(Color.white); g.fillRect(0,0,w,h); g.setColor(Color.blue); g.drawLine(150,150,150,250); g.drawLine(150,150,250,150); g.drawLine(250,150,250,250); g.drawLine(150,250,250,250); g.drawLine(200,200,200,300); g.drawLine(200,200,300,200); g.drawLine(300,200,300,300); g.drawLine(200,300,300,300); g.drawLine(150,150,200,200); g.drawLine(250,150,300,200); g.drawLine(150,250,200,300); g.drawLine(250,250,300,300); g.setColor(Color.black); for (double u = 0 ; u < 1 ; u+=.1) { for (double v = 0 ; v < 1 ; v+=.03) { int y = (int)(spline.eval(u,v)); int y2 = (int)(spline.eval(u,v+.01)); g.drawLine((int)(v*100+u*50)+150,(int)(y+u*50)+150,(int)(v*100+1+u*50)+150,(int)(y2+u*50)+150); } } for (double u = 0 ; u < 1 ; u+=.03) { for (double v = 0 ; v < 1 ; v+=.1) { int y = (int)(spline.eval(u,v)); int y2 = (int)(spline.eval(u+.01,v)); g.drawLine((int)(v*100+u*50)+150,(int)(y+u*50)+150,(int)(v*100+1+u*50)+150,(int)(y2+u*50)+150); } } for (double u = 0 ; u < 1 ; u+=.1) { for (double v = 0 ; v < 1 ; v+=.03) { int y = (int)(spline2.eval(u,v)); int y2 = (int)(spline2.eval(u,v+.01)); g.drawLine((int)(v*100+u*50)+250,(int)(y+u*50)+150,(int)(v*100+1+u*50)+250,(int)(y2+u*50)+150); } } for (double u = 0 ; u < 1 ; u+=.03) { for (double v = 0 ; v < 1 ; v+=.1) { int y = (int)(spline2.eval(u,v)); int y2 = (int)(spline2.eval(u+.01,v)); g.drawLine((int)(v*100+u*50)+250,(int)(y+u*50)+150,(int)(v*100+1+u*50)+250,(int)(y2+u*50)+150); } } for (double u = 0 ; u < 1 ; u+=.1) { for (double v = 0 ; v < 1 ; v+=.03) { int y = (int)(spline3.eval(u,v)); int y2 = (int)(spline3.eval(u,v+.01)); g.drawLine((int)(v*100+u*50)+50,(int)(y+u*50)+150,(int)(v*100+1+u*50)+50,(int)(y2+u*50)+150); } } for (double u = 0 ; u < 1 ; u+=.03) { for (double v = 0 ; v < 1 ; v+=.1) { int y = (int)(spline3.eval(u,v)); int y2 = (int)(spline3.eval(u+.01,v)); g.drawLine((int)(v*100+u*50)+50,(int)(y+u*50)+150,(int)(v*100+1+u*50)+50,(int)(y2+u*50)+150); } } g.setColor(Color.red); for(int a=0;a<4;a++){ for (int b=0;b<4;b++){ g.drawOval(a*100+b*50 -5,b*50+(int)GX[b][a] +100-5,10,10); } } } public boolean keyUp(Event e, int key) { switch (key) { case '1': aa=0; bb=0; cc=1; break; case '2': aa=0; bb=1; cc=1; break; case '3': aa=0; bb=2; cc=1; break; case '4': aa=0; bb=3; cc=1; break; case 'q': aa=1; bb=0; cc=1; break; case 'w': aa=1; bb=1; cc=1; break; case 'e': aa=1; bb=2; cc=1; break; case 'r': aa=1; bb=3; cc=1; break; case 'a': aa=2; bb=0; cc=1; break; case 's': aa=2; bb=1; cc=1; break; case 'd': aa=2; bb=2; cc=1; break; case 'f': aa=2; bb=3; cc=1; break; case 'z': aa=3; bb=0; cc=1; break; case 'x': aa=3; bb=1; cc=1; break; case 'c': aa=3; bb=2; cc=1; break; case 'v': aa=3; bb=3; cc=1; break; case '!': aa=0; bb=0; cc=-1; break; case '@': aa=0; bb=1; cc=-1; break; case '#': aa=0; bb=2; cc=-1; break; case '$': aa=0; bb=3; cc=-1; break; case 'Q': aa=1; bb=0; cc=-1; break; case 'W': aa=1; bb=1; cc=-1; break; case 'E': aa=1; bb=2; cc=-1; break; case 'R': aa=1; bb=3; cc=-1; break; case 'A': aa=2; bb=0; cc=-1; break; case 'S': aa=2; bb=1; cc=-1; break; case 'D': aa=2; bb=2; cc=-1; break; case 'F': aa=2; bb=3; cc=-1; break; case 'Z': aa=3; bb=0; cc=-1; break; case 'X': aa=3; bb=1; cc=-1; break; case 'C': aa=3; bb=2; cc=-1; break; case 'V': aa=3; bb=3; cc=-1; break; case '[': tension-=.25; cc=-2; break; case ']': tension+=.25; cc=-2; break; } if (cc!=-2 && snapped[aa][bb]==0){ GX[aa][bb]+=20*cc; GX[aa][bb]-=110; snapped[aa][bb]=time; } damage=true; return true; } public boolean mouseUp(Event e, int x, int y) { return true; } public boolean mouseDrag(Event e, int x, int y) { damage=true; return true; } }