import java.awt.*; public class K_Driven{ final double PARAM=0.05; int error=0; double ww,hh; double mindis=1000.0; double minspeed=1000.0; int numberofpoint=0; int numberofextreme=0; int firstnumofp=0; Vertex Head; Vertex Tail; double scale=100.0; double kmin = 0.1; double kmax = 0.1; double Level = 0.1; double High = 50.0; double Low = 30.0; double Low2 = 5.0; Double checker; public K_Driven() { this.listinitialize(); } public K_Driven(int ww,int hh) { this.listinitialize(); } public void listinitialize() { double nx,ny; System.gc(); numberofpoint=0; mindis=1000.0; minspeed=1000.0; numberofextreme=0; kmin = 0.1; kmax = 0.1; checker = new Double(0.0); firstnumofp=0; Head = new Vertex(); Tail = new Vertex(); Init(Head,Tail); } public double setkmin(double dkm){ kmin = dkm; return 0.0; } public void setnumext(int dnx){ numberofextreme = dnx; } public double getkmin(){ return kmin; } private boolean NearV(Vertex v1,Vertex v2){ /* float v1x,v1y,v2x,v2y; v1x = ((float)(v1.x)); v1y = ((float)(v1.y)); v2x = ((float)(v2.x)); v2y = ((float)(v2.y)); */ int v1x,v1y,v2x,v2y; v1x = ((int)((double)(scale*v1.x))); v1y = ((int)((double)(scale*v1.y))); v2x = ((int)((double)(scale*v2.x))); v2y = ((int)((double)(scale*v2.y))); if((v1x==v2x)&&(v1y==v2y)){ return true; }else{ return false; } } private int repamameter(int minpoints){ double dumx,dumy; Vertex dummy; Vertex now = Head; while(next(now)!=Tail){ now = next(now); if(next(now)==Tail)break; if(next(now).extreme!=1){ DeleteN(now); numberofpoint--; } if(next(now)==Tail)break; } if(next(now)==Tail){ if(next(Head).extreme!=1){ dummy = next(next(Head)); Head.next = dummy; dummy.back = Head; numberofpoint--; } } return 0; } public int UpdateforKn1(){ UpdateProperty(); double dx,dy,speed; double epcilon; Vertex now = next(Head); epcilon = ((mindis)/(firstnumofp)); now = Head; DoubleVector grad = new DoubleVector(0.0,0.0);; while(next(now)!=Tail){ now = next(now); speed = now.k; dx = now.x +epcilon*(speed*now.normal.x); dy = now.y +epcilon*(speed*now.normal.y); now.time = new DoubleVector(now.x,now.y); now.x = dx; now.y = dy; if(checker.isNaN(now.x)||checker.isNaN(now.y)){ System.out.println("now.x = "+now.x+" now.y = "+now.y); return 2; } } int backt=0; while(backt!=numberofpoint){ if(numberofpoint<=11){ return 1; } backt = numberofpoint; reparameterization(); if(numberofpoint<=11){ return 1; } } if(numberofpoint>8){ if(numberofpoint<=11)return 1; return 0; }else{ return 1; } } public int UpdateforKn2(double constvC,double constvD){ UpdateProperty(); double dx,dy,speed; double epcilon; dx = 0.0; dy = 0.0; speed = 0.0; Vertex now = next(Head); /* if(mindis<0.001){ epcilon = (0.001/(firstnumofp)); }else{ epcilon = ((mindis)/(firstnumofp)); } */ epcilon = ((mindis)/(firstnumofp)); double nsize=0.0; now = Head; DoubleVector grad = new DoubleVector(0.0,0.0);; while(next(now)!=Tail){ now = next(now); speed = constvC + constvD*now.k; dx = now.x + epcilon*(speed*now.normal.x); dy = now.y + epcilon*(speed*now.normal.y); now.time = new DoubleVector(now.x,now.y); now.x = dx; now.y = dy; if(checker.isNaN(now.x)||checker.isNaN(now.y)){ System.out.println("now.x = "+now.x+" now.y = "+now.y); return 2; } } int backt=0; while(backt!=numberofpoint){ if(numberofpoint<=11){ return 1; } backt = numberofpoint; reparameterization(); if(numberofpoint<=11){ return 1; } } if(numberofpoint>8){ if(numberofpoint<=11)return 1; return 0; }else{ return 1; } } private void changeextreme(Vertex now){ if(next(next(now))==Tail){ if(now.k3){ eliminate(); return 0; }else{ return 1; } } private double G(Vertex now) { return ((now.dis2 - now.dis1)/(5.0*(now.dis2 + now.dis1))); } private void UpdateProperty(){ Vertex now = next(Head); now.dis1 = Distance(now,back(Tail)); mindis = now.dis1; now.dis2 = Distance(now,next(now)); if(now.dis2 dn3 && dn2> dn1){ now.extreme = 3; }else{ now.extreme = 0; } }else{ if(dn2< dn3 && dn2< dn1){ now.extreme = 2; }else if(dn2> dn3 && dn2> dn1){ now.extreme = 4; }else{ now.extreme = 0; } } } private void settypeChi(Vertex backn2,Vertex backn,Vertex now, Vertex nextn,Vertex nextn2){ double dn1,dn2,dn3,dn4,dn5,disave,d1; dn1 = backn2.k; dn2 = backn.k; dn3 = now.k; dn4 = nextn.k; dn5 = nextn2.k; disave = (backn2.dis2 + backn.dis2 + now.dis2 + nextn.dis2)/4.0; d1 = (-dn5+8.0*dn4-8.0*dn2+dn1)/(12.0*disave); /* // if((dn3<0.0)&&(dn2= (High/scale)){ dumx = ((now.x + (now.next).x)/2.0); dumy = ((now.y + (now.next).y)/2.0); dumk = ((2.0*now.k*(now.next).k)/(now.k+(now.next).k)); Vertex inpoint = new Vertex(dumx,dumy); inpoint.k = dumk; Insert(now,inpoint); numberofpoint++; now = next(now); } } } public DoubleVector getRoundLaplace(Vertex backn,Vertex now,Vertex nextn){ double dx,dy; dx = (((nextn.mid.x - now.mid.x)/now.dis2) + ((now.mid.x - backn.mid.x)/now.dis1) - ((nextn.mid.x - backn.mid.x)/(now.dis1+now.dis2))); dy = (((nextn.mid.y - now.mid.y)/now.dis2) + ((now.mid.y - backn.mid.y)/now.dis1) - ((nextn.mid.y - backn.mid.y)/(now.dis1+now.dis2))); return new DoubleVector(dx,dy); } public DoubleVector getLaplace(Vertex backn,Vertex now,Vertex nextn){ DoubleVector v1 = Normalize(new DoubleVector((-now.x + backn.x), (-now.y + backn.y))); DoubleVector v2 = Normalize(new DoubleVector((-now.x + nextn.x), (-now.y + nextn.y))); return new DoubleVector((v1.x+v2.x),(v1.y+v2.y)); } private double VertexSize(Vertex dv){ return Math.sqrt((dv.x*dv.x+dv.y*dv.y)); } private double VectorSize(DoubleVector dv){ return Math.sqrt((dv.x*dv.x+dv.y*dv.y)); } private void eliminate() { double dumx,dumy; Vertex dummy; Vertex now = next(Head); now.mid = new DoubleVector((back(Tail).x + next(now).x)/2.0, (back(Tail).y + next(now).y)/2.0); while(next(next(now))!=Tail){ now = next(now); now.mid = new DoubleVector((back(now).x + next(now).x)/2.0, (back(now).y + next(now).y)/2.0); } now = next(now); now.mid = new DoubleVector((back(now).x + next(Head).x)/2.0, (back(now).y + next(Head).y)/2.0); now = Head; while(next(now)!=Tail){ now = next(now); if(now.dis1<= (Low/scale)||(now.dis2<=(Low/scale))){ now.x = now.mid.x; now.y = now.mid.y; } } } private void eliminate222() { double dumx,dumy; Vertex dummy; Vertex now = Head; while(next(now)!=Tail){ now = next(now); if(next(now)==Tail)break; if(Distance(next(now),now)<= (Low/scale)){ //DeleteN(now); if(next(next(now))!=Tail){ next(now).x = (now.x + next(next(now)).x)/2.0; next(now).y = (now.y + next(next(now)).y)/2.0; }else{ next(now).x = (now.x + next(Head).x)/2.0; next(now).y = (now.y + next(Head).y)/2.0; } //numberofpoint--; } if(next(now)==Tail)break; } if(next(now)==Tail){ if(Distance(now,next(Head))<= (Low/scale)){ /* dummy = next(Head); Head.next = dummy; dummy.back = Head; numberofpoint--; */ next(Head).x = (now.x + next(next(Head)).x)/2.0; next(Head).y = (now.y + next(next(Head)).y)/2.0; } } } }