Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
added face detection
  • Loading branch information
tao committed Dec 2, 2014
1 parent 34524a8 commit c4e7bb7
Show file tree
Hide file tree
Showing 2 changed files with 89 additions and 23 deletions.
1 change: 1 addition & 0 deletions 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);
Expand Down
111 changes: 88 additions & 23 deletions drawing/drawing.pde
Expand Up @@ -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_element> gui=new ArrayList();
Gui_element gui_current=null;
Vertex drag_start;
Expand All @@ -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()));
Expand Down Expand Up @@ -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();
}
Expand All @@ -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");
Expand All @@ -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();
}
}
}
Expand All @@ -128,6 +131,22 @@ class TutteDrawEvent implements ButtonEvent {
void onclick() {
int l=G.V.size();

ArrayList<Vertex> 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<l;++i){
Expand All @@ -142,50 +161,96 @@ class TutteDrawEvent implements ButtonEvent {
}
}
}
//print(" ",L[i][j]);
}
//println();
}

float[][] L1=new float[3][3];
float[][] L2=new float[l-3][l-3];
float[][] B=new float[l-3][3];
for(int i=0;i<3;++i){
for(int j=0;j<3;++j){
int n=face.size()+1;
float[][] L1=new float[n][n];
float[][] L2=new float[l-n][l-n];
float[][] B=new float[l-n][n];
for(int i=0;i<n;++i){
for(int j=0;j<n;++j){
L1[i][j]=L[i][j];
}
}
for(int i=0;i<l-3;++i){
for(int j=0;j<l-3;++j){
L2[i][j]=L[i+3][j+3];
for(int i=0;i<l-n;++i){
for(int j=0;j<l-n;++j){
L2[i][j]=L[i+n][j+n];
}
}
for(int i=0;i<l-3;++i){
for(int j=0;j<3;++j){
B[i][j]=L[i+3][j];
for(int i=0;i<l-n;++i){
for(int j=0;j<n;++j){
B[i][j]=L[i+n][j];
}
}

float[][] P1=new float[][]{{10,10},{590,10},{300,590}};
float[][] P1=new float[n][2];
for(int i=0;i<n;++i){
P1[i][0]=sin(i*PI*2/n)*(Height/2-Margin)+Width/2;
P1[i][1]=Height/2-cos(i*PI*2/n)*(Height/2-Margin);
println(P1[i][0], " " ,P1[i][1]);
}
Mat.print(L2,2);
float[][] invL2= Mat.inverse(L2);
float[][] nagP2=Mat.multiply(Mat.multiply(invL2,B),P1);
orig=new float[l][2];
targ=new float[l][2];
for(int i=0;i<3;++i){
for(int i=0;i<n;++i){
orig[i][0]=G.V.get(i).x;
orig[i][1]=G.V.get(i).y;
targ[i][0]=(int)P1[i][0];
targ[i][1]=(int)P1[i][1];
}
for(int i=3;i<l;++i){
for(int i=n;i<l;++i){
orig[i][0]=G.V.get(i).x;
orig[i][1]=G.V.get(i).y;
targ[i][0]=(int)-nagP2[i-3][0];
targ[i][1]=(int)-nagP2[i-3][1];
targ[i][0]=(int)-nagP2[i-n][0];
targ[i][1]=(int)-nagP2[i-n][1];
}
animation_start_time=millis();
draw_state=DRAW_ANIMATION;
}
ArrayList<Vertex> 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<Vertex> rt=FindFaceDFSID(vs,nvc,n-1);
if(rt!=null){
rt.add(nvc);
return rt;
}
e.searched=false;
}
}
}
return null;
}
ArrayList<Vertex> 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;
}
}


0 comments on commit c4e7bb7

Please sign in to comment.