Zappa Posted October 17, 2013 Posted October 17, 2013 (edited) import java.applet.*; import java.awt.*; import java.awt.event.*; public class Bezier extends Applet implements MouseListener, MouseMotionListener, Runnable { double[] [] point = new double [5] [2]; int dragged; Thread t; Graphics b; Image offscreen; int mode; public void init () { mode = 3; dragged = -1; for (int i = 0 ; i < point.length ; i++) { point [i] [0] = (int) (Math.random () * 800); point [i] [1] = (int) (Math.random () * 600); } setFocusable (true); addMouseListener (this); addMouseMotionListener (this); t = new Thread (this); t.start (); offscreen = createImage (800, 600); b = offscreen.getGraphics (); } // init method public void update (Graphics g) { paint (g); } public void run () { while (true) { repaint (); try { t.sleep (10); } catch (InterruptedException e) { } } } public void paint (Graphics g) { b.setColor (Color.white); //clears the buffer b.fillRect (0, 0, 800, 600); b.setColor (Color.red); b.fillRect (0, 0, 100, 30); b.setColor (Color.black); switch (mode) { case 1: b.drawString ("Adding nodes", 10, 20); break; case 2: b.drawString ("Deleting nodes", 10, 20); break; case 3: b.drawString ("Moving nodes", 10, 20); break; } for (int i = 0 ; i < point.length ; i++) { b.fillOval ((int) (point [i] [0] - 10), (int) (point [i] [1] - 10), 20, 20); } b.setColor (Color.blue); for (int i = 0 ; i < point.length - 1 ; i++) { b.drawLine ((int) (point [i] [0]), (int) (point [i] [1]), (int) (point [i + 1] [0]), (int) (point [i + 1] [1])); } double[] current = new double [2]; b.setColor (Color.green); for (double t = 0 ; t <= 1 ; t += 0.0005) { current = Bez (t, point); b.fillOval ((int) current [0] - 2, (int) current [1] - 2, 4, 4); } g.drawImage (offscreen, 0, 0, this); } // paint method public double[] Bez (double t, double[] [] point) { if (point.length == 1 /*|| t < 0 || t > 1*/) { double[] New = new double [2]; New [0] = point [0] [0]; New [1] = point [0] [1]; return New; } double[] [] New = new double [point.length - 1] [2]; for (int i = 0 ; i < New.length ; i++) { New [i] [0] = ((1 - t) * point [i] [0]) + (t * point [i + 1] [0]); New [i] [1] = ((1 - t) * point [i] [1]) + (t * point [i + 1] [1]); } return Bez (t, New); } public void mouseClicked (MouseEvent e) { } public void mouseMoved (MouseEvent e) { } public void mouseReleased (MouseEvent e) { dragged = -1; } public void mouseEntered (MouseEvent e) { } public void mouseExited (MouseEvent e) { } public void mousePressed (MouseEvent e) { if (e.getX () >= 0 && e.getX () <= 100 && e.getY () >= 0 && e.getY () <= 30) { // red button was clicked switch (mode) { case 1: mode = 2; break; case 2: mode = 3; break; case 3: mode = 1; break; } // switch (mode) } // if (e.getX () >= 0 && e.getX () <= 100 && e.getY () >= 0 && e.getY () <= 30) // mode: 1=add; 2=delete; 3=move else if (mode == 1) { dragged = -1; double[] [] temp = point; point = new double [temp.length + 1] [2]; for (int i = 0 ; i < temp.length ; i++) { point [i] [0] = temp [i] [0]; point [i] [1] = temp [i] [1]; } // for (int i = 0 ; i < temp.length ; i++) point [point.length - 1] [0] = e.getX (); point [point.length - 1] [1] = e.getY (); } // if (mode == 1) else if (mode == 2) { dragged = -1; for (int i = 0 ; i < point.length ; i++) { if (Dist ((double) e.getX (), (double) e.getY (), point [i] [0], point [i] [1]) <= 10) { // delete this index for (int j = i ; j < point.length - 1 ; j++) { point [j] [0] = point [j + 1] [0]; point [j] [1] = point [j + 1] [1]; } // for (int j = i ; j < point.length ; j++) double[] [] temp = point; point = new double [temp.length - 1] [2]; for (int j = 0 ; j < point.length ; j++) { point [j] [0] = temp [j] [0]; point [j] [1] = temp [j] [1]; } // for (int j = 0 ; j < point.length ; j++) } // if (Dist ((double) e.getX (), (double) e.getY (), point [i] [0], point [i] [1]) <= 10) } // for (int i = 0 ; i <= point.length ; i++) } // else if (mode == 2) else if (mode == 3) { for (int i = 0 ; i <= point.length ; i++) { try { if (Dist ((double) e.getX (), (double) e.getY (), point [i] [0], point [i] [1]) <= 10) { dragged = i; } // if (Dist ((double) e.getX (), (double) e.getY (), point [i] [0], point [i] [1]) <= 10) } // try catch (Exception ex) { } // catch (Exception ex) } // for (int i = 0 ; i <= point.length ; i++) } } public double Dist (double x1, double y1, double x2, double y2) { return Math.pow (Math.pow (x2 - x1, 2) + Math.pow (y2 - y1, 2), 0.5); } public void mouseDragged (MouseEvent e) { if (dragged != -1) { point [dragged] [0] = e.getX (); point [dragged] [1] = e.getY (); } } } Edited October 19, 2013 by Zappa