import java.awt.Color; import java.awt.Graphics; import java.awt.event.MouseEvent; public class DBCanvas extends DoubleBuffer { // colors private Color highl, line, point, curve, bg, text; private MyPoint[] ver; // kontrolne body private MyPoint s, f; private int selected = -1, drag = -1; // index vybrateho kontrolneho bodu private int i = 2, max = 20; // pocet kontrolnych bodov (zaciname od dva kvoli fantomovym bodom a uzavretej krivke), velkost pola private float delta,s1,s2,s3,s4; // beta-splain prmenne public float beta1,beta2; public boolean joined, fantom, lines, points; public DBCanvas(int w, int h){ super(w,h); ver = new MyPoint[max]; s = new MyPoint(-1,-1); ver[0] = new MyPoint(-1,-1); f = new MyPoint(-1,-1); joined = false; fantom = false; lines = false; points = false; // farby highl = new Color(246, 255, 195); line = new Color(196,196,196); curve = new Color(24,186,00); bg = new Color(255,255,255); text = new Color(70,70,70); point = new Color(120,120,120); // beta hodnoty beta1 = 1; beta2 = 0; } public void delete_curve(){ max = 20; i = 2; ver = new MyPoint[20]; } private void beta_splain(Graphics g){ g.setColor(curve); delta=2*beta1*beta1*beta1 + 4*beta1*beta1 + 4*beta1 + beta2 + 2; int jMin, jMax; if(!joined){ // fantomove vrcholy ver[1] = new MyPoint(ver[2].X+((ver[2].X-ver[3].X)/(beta1*beta1*beta1)), ver[2].Y+((ver[2].Y-ver[3].Y)/(beta1*beta1*beta1))); ver[i] = new MyPoint(((beta1*beta1*beta1)*(ver[i-1].X-ver[i-2].X))+ver[i-1].X, ((beta1*beta1*beta1)*(ver[i-1].Y-ver[i-2].Y))+ver[i-1].Y); jMin =3; jMax = i; } else { ver[0] = new MyPoint(ver[i-2]); ver[1] = new MyPoint(ver[i-1]); ver[i] = new MyPoint(ver[2]); ver[i+1] = new MyPoint(ver[3]); jMin =2; jMax = i+1; } s.setXY(-1, -1); for (int j=jMin;j= max-1){ max += 10; MyPoint[] pom = new MyPoint[max]; for(int j=0;j((x-ver[j].X)*(x-ver[j].X)+(y-ver[j].Y)*(y-ver[j].Y))) return j; return -1; } private void addVertex(int x, int y){ checkArray(); ver[i] = new MyPoint(x,y); i++; } private void deleteVertex(int index){ if(ver[index] != null){ ver[index] = null; } tidyUpVertex(); this.i--; } private void tidyUpVertex(){ for(int j=0;j3 && fantom){ jMin = 1; jMax = i+1; } for(int j=jMin;j1 && j11?8:0), 16); g.drawString("V"+(j-2), Math.round(ver[j].X)+7, Math.round(ver[j].Y)+12); } } } if(i>3){ beta_splain(g); } if(fantom && i>3){ g.setColor(highl); g.fillRect(Math.round(ver[i].X)+5, Math.round(ver[i].Y), 75, 16); g.fillRect(Math.round(ver[1].X)+5, Math.round(ver[1].Y), 62, 16); g.setColor(text); g.drawRect(Math.round(ver[i].X)+5, Math.round(ver[i].Y), 75, 16); g.drawRect(Math.round(ver[1].X)+5, Math.round(ver[1].Y), 62, 16); g.drawString("fantom V-1", Math.round(ver[1].X)+7, Math.round(ver[1].Y)+12); g.drawString("fantom V"+(i-2), Math.round(ver[i].X)+7, Math.round(ver[i].Y)+12); } if((selected > 0) && (selected < i) && (ver[selected]!= null)){ g.setColor(highl); g.fillOval((int)ver[selected].X-2, (int)ver[selected].Y-2, 5, 5); }else if((drag > 0) && (drag < i) && (ver[drag]!= null)){ g.setColor(highl); g.fillOval(Math.round(ver[drag].X)-2, Math.round(ver[drag].Y-2), 5, 5); g.fillRect(Math.round(ver[drag].X)+5, Math.round(ver[drag].Y), 75, 16); g.setColor(text); g.drawRect(Math.round(ver[drag].X)+5, Math.round(ver[drag].Y), 75, 16); g.drawString("drag to move", Math.round(ver[drag].X)+7, Math.round(ver[drag].Y)+12); } } @Override public void onMouseDown(MouseEvent e){ int x = e.getX(), y = e.getY(); // if((x>0) && (x0) && (y= 0) && (ver[selected]!= null)){ ver[selected].X = x;//>0?(x0?(y0) && (x0) && (y= 0) && (e.getButton() == MouseEvent.BUTTON3)) deleteVertex(selected); if(e.getButton() == MouseEvent.BUTTON2) points = !points; selected = -1; repaint(); } @Override public void onMouseMove(MouseEvent e){ drag = select(e.getX(),e.getY(),10); repaint(); } }