From c4e7bb765fd23981a47241e1c70a87f2b06db90f Mon Sep 17 00:00:00 2001 From: Tao Gong Date: Tue, 2 Dec 2014 17:01:00 -0500 Subject: [PATCH] added face detection --- drawing/Edge.pde | 1 + drawing/drawing.pde | 111 +++++++++++++++++++++++++++++++++++--------- 2 files changed, 89 insertions(+), 23 deletions(-) diff --git a/drawing/Edge.pde b/drawing/Edge.pde index 61d8851..14b1675 100644 --- a/drawing/Edge.pde +++ b/drawing/Edge.pde @@ -1,5 +1,6 @@ class Edge extends Gui_element{ Vertex v1,v2; + boolean searched=false; Edge(Vertex _v1, Vertex _v2){ v1=_v1;v2=_v2; v1.E.add(this); diff --git a/drawing/drawing.pde b/drawing/drawing.pde index b82b80a..6f862ef 100644 --- a/drawing/drawing.pde +++ b/drawing/drawing.pde @@ -5,6 +5,9 @@ final int DRAW_NORMAL=1; final int DRAW_DRAG=2; final int DRAW_ANIMATION=3; final int Vertex_Rad=8; +final int Width=600; +final int Height=600; +final int Margin=10; ArrayList gui=new ArrayList(); Gui_element gui_current=null; Vertex drag_start; @@ -16,7 +19,7 @@ final int animation_duration=1000; void setup() { size(600, 600); background(255); - draw_button.disable=true; + draw_button.disable=false; 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())); @@ -72,7 +75,7 @@ void mousePressed() { Vertex v=new Vertex(mouseX, mouseY); G.V.add(v); gui.add(v); - draw_button.disable=!G.ValidGraph(); + //draw_button.disable=!G.ValidGraph(); } else { gui_current.mousePressed(); } @@ -86,7 +89,7 @@ void mouseReleased() { Edge e=new Edge(drag_start, (Vertex)gui_current); G.E.add(e); gui.add(e); - draw_button.disable=!G.ValidGraph(); + //draw_button.disable=!G.ValidGraph(); println("Valid"); } else { println("Invalid"); @@ -111,7 +114,7 @@ class InitialGraphEvent implements ButtonEvent { gui.add(e); } }while (G.check3edges_per_vertex (G.V.get (i))); - draw_button.disable=!G.ValidGraph(); + //draw_button.disable=!G.ValidGraph(); } } } @@ -128,6 +131,22 @@ class TutteDrawEvent implements ButtonEvent { void onclick() { int l=G.V.size(); + ArrayList face=FindFace(); + print("0"); + for(Vertex v:face){ + print(" -",G.V.indexOf(v)); + } + println(); + int a=0; + for(Vertex v:face){ + ++a; + int b=G.V.indexOf(v); + if(a!=b){ + Vertex t=G.V.get(a); + G.V.set(a,G.V.get(b)); + G.V.set(b,t); + } + } //Matrix L float[][] L=new float[l][l]; for(int i=0;i FindFaceDFSID(Vertex vs,Vertex vc,int n){//Vsource, Vcurrent, depth + if(n==1){//edge of the search + for(Edge e:vc.E){ + if(!e.searched){ + if((e.v1==vc&&e.v2==vs)||(e.v1==vs&&e.v2==vc)){//find loop + println("found!"); + return new ArrayList(); + } + } + } + return null; + }else{ + for(Edge e:vc.E){ + if(!e.searched){ + e.searched=true; + Vertex nvc; + if(e.v1==vc){ + nvc=e.v2; + }else{ + nvc=e.v1; + } + ArrayList rt=FindFaceDFSID(vs,nvc,n-1); + if(rt!=null){ + rt.add(nvc); + return rt; + } + e.searched=false; + } + } + } + return null; + } + ArrayList FindFace(){ + for(Edge e:G.E){ + e.searched=false; + } + for(int i=3;i<=G.E.size();++i){ + ArrayList rt=FindFaceDFSID(G.V.get(0), G.V.get(0), i); + if(rt!=null)return rt; + } + return null; + } }