diff --git a/drawing/Button.pde b/drawing/Button.pde new file mode 100644 index 0000000..0d4acdf --- /dev/null +++ b/drawing/Button.pde @@ -0,0 +1,37 @@ +class Button extends Gui_element{ + ButtonEvent e; + int x,y,w,h; + color button_color; + boolean disable=false; + String str; + Button(int _x, int _y, int _w, int _h, color _c, String _s, ButtonEvent _e){ + x=_x;y=_y;w=_w;h=_h;button_color=_c;str=_s;e=_e; + } + void draw(){ + if(disable){ + fill(200); + }else if(mouse_over){ + fill(255,0,0); + }else { + fill(button_color); + } + noStroke(); + rect(x,y,w,h); + textSize(10); + fill(0, 0, 0); + textAlign(CENTER,CENTER); + text(str,x+w/2,y+h/2); + } + void mouseMoved(){ + mouse_over=(mouseX>=x&&mouseX<=x+w&&mouseY>=y&&mouseY<=(y+h)); + if(mouse_over)gui_current=this; + } + void mousePressed(){ + if(e!=null&&!disable) + e.onclick(); + } +} +interface ButtonEvent{ + void onclick(); +} + diff --git a/drawing/Edge.pde b/drawing/Edge.pde index 7aabc0e..61d8851 100644 --- a/drawing/Edge.pde +++ b/drawing/Edge.pde @@ -1,4 +1,4 @@ -class Edge { +class Edge extends Gui_element{ Vertex v1,v2; Edge(Vertex _v1, Vertex _v2){ v1=_v1;v2=_v2; diff --git a/drawing/Graph.pde b/drawing/Graph.pde index 0193b37..cb8a441 100644 --- a/drawing/Graph.pde +++ b/drawing/Graph.pde @@ -10,6 +10,13 @@ class Graph{ return true; } + boolean ValidGraph(){ + int min=Integer.MAX_VALUE; + for(Vertex i:V){ + if(i.E.size()<=min)min=i.E.size(); + } + return min==3; + } boolean check3edges_per_vertex(Vertex v){ if(v.E.size()<3) return true; if(v.E.size()>=3) return false; diff --git a/drawing/Gui_element.pde b/drawing/Gui_element.pde new file mode 100644 index 0000000..484c0eb --- /dev/null +++ b/drawing/Gui_element.pde @@ -0,0 +1,7 @@ +abstract class Gui_element{ + boolean mouse_over=false; + void draw(){}; + void mouseMoved(){}; + void mousePressed(){}; + void mouseDragged(){}; +} diff --git a/drawing/Vertex.pde b/drawing/Vertex.pde index 6be53a8..c9b290c 100644 --- a/drawing/Vertex.pde +++ b/drawing/Vertex.pde @@ -1,29 +1,20 @@ -class Vertex{ +class Vertex extends Gui_element{ int x,y; - boolean mouseover=false; ArrayList E=new ArrayList(); Vertex(int _x,int _y){ x=_x;y=_y; } - Vertex(int _x,int _y,boolean _mo){ - x=_x;y=_y;mouseover=_mo; - if(_mo)vertex_under_mouse=this; - } void draw(){ noStroke(); - if(mouseover){ + if(mouse_over){ fill(0,255,0); }else{ fill(255,0,0); } ellipse(x,y,Vertex_Rad*2,Vertex_Rad*2); } - void checkmouseover(){ - if(sqrt((mouseX-x)*(mouseX-x)+(mouseY-y)*(mouseY-y))<=Vertex_Rad*2){ - mouseover=true; - vertex_under_mouse=this; - }else{ - mouseover=false; - } + void mouseMoved(){ + mouse_over=(sqrt((mouseX-x)*(mouseX-x)+(mouseY-y)*(mouseY-y))<=Vertex_Rad*2); + if(mouse_over)gui_current=this; } } diff --git a/drawing/drawing.pde b/drawing/drawing.pde index 1336647..b82b80a 100644 --- a/drawing/drawing.pde +++ b/drawing/drawing.pde @@ -1,144 +1,191 @@ +import papaya.*; + final int DRAW_NORMAL=1; final int DRAW_DRAG=2; +final int DRAW_ANIMATION=3; final int Vertex_Rad=8; -// define parameters for rectangular button - int rectX1=500, rectY1=500; - int rectX2=500, rectY2=550; - int rectwidth=80; - int rectheight=40; - color rectColor; - color rectHighlight; - boolean rectover=false; - +ArrayList gui=new ArrayList(); +Gui_element gui_current=null; Vertex drag_start; -Vertex vertex_under_mouse; +Graph G=new Graph(); +Button draw_button=new Button(500, 450, 80, 40, color(150), "Tutte Draw", new TutteDrawEvent()); +float[][] orig,targ; +int animation_start_time=0; +final int animation_duration=1000; void setup() { size(600, 600); background(255); - rectColor=(150); - rectHighlight=color(255,0,0); - rectX1=500; - rectY1=500; - noStroke(); + draw_button.disable=true; + gui.add(draw_button); + gui.add(new Button(500, 500, 80, 40, color(150), "Initial Graph", new InitialGraphEvent())); + gui.add(new Button(500, 550, 80, 40, color(150), "Reset", new ResetEvent())); } -Graph G=new Graph(); int draw_state=DRAW_NORMAL; void draw() { background(255); - //Draw everything else - //Draw Vertices - for(Vertex i:G.V){ - i.draw(); + if(draw_state==DRAW_ANIMATION){ + if(millis()-animation_start_time>animation_duration){ + for(int i=0;i=y && (mouseY-y<_height) &&(mouseX-x<_width)&& mouseX>=x) - rectover=true; - else rectover=false; - - return rectover; - -} -void mouseMoved(){ - vertex_under_mouse=null; - for(Vertex i:G.V){ - i.checkmouseover(); +void mouseMoved() { + gui_current=null; + for (Gui_element i : gui) { + i.mouseMoved(); } } -void mouseDragged(){ +void mouseDragged() { mouseMoved(); - if(draw_state!=DRAW_DRAG){//start dragging - drag_start=vertex_under_mouse; - draw_state=DRAW_DRAG; + if (draw_state!=DRAW_DRAG) {//start dragging + if (gui_current!=null&&gui_current instanceof Vertex) { + drag_start=(Vertex)gui_current; + draw_state=DRAW_DRAG; + } } - } -void mousePressed(){ - if(vertex_under_mouse==null && !check_mouse_over_button(rectX1,rectY1,rectheight,rectwidth) &&!check_mouse_over_button(rectX2,rectY2,rectheight,rectwidth)){ - G.V.add(new Vertex(mouseX, mouseY,true)); +void mousePressed() { + if (gui_current==null) { + Vertex v=new Vertex(mouseX, mouseY); + G.V.add(v); + gui.add(v); + draw_button.disable=!G.ValidGraph(); + } else { + gui_current.mousePressed(); } - } -void mouseReleased(){ - if(draw_state==DRAW_DRAG){ +void mouseReleased() { + if (draw_state==DRAW_DRAG) { draw_state=DRAW_NORMAL; - if(vertex_under_mouse!=null){ - if(G.ValidNewEdge(drag_start,vertex_under_mouse)){ - G.E.add(new Edge(drag_start,vertex_under_mouse)); + if (gui_current!=null&&(gui_current instanceof Vertex)) { + if (G.ValidNewEdge(drag_start, (Vertex)gui_current)) { + Edge e=new Edge(drag_start, (Vertex)gui_current); + G.E.add(e); + gui.add(e); + draw_button.disable=!G.ValidGraph(); println("Valid"); - }else{ + } else { println("Invalid"); } } } } - -void mouse_over_BUTTON(){ - - if(check_mouse_over_button(rectX1,rectY1,rectheight,rectwidth)){ - fill(255,0,0); - }else { - fill(rectColor); +class InitialGraphEvent implements ButtonEvent { + void onclick() { + if (G.V.size()<=3) throw new RuntimeException("Requires at least 4 points"); + for (int i=0; i