import std.stdio; import std.math; struct CoordXY { double x, y; static CoordXY opCall(double _x, double _y) { CoordXY result; result.x=_x; result.y=_y; return result; } public double dist(CoordXY other) { double dx=x-other.x; double dy=y-other.y; return sqrt(dx*dx+dy*dy); } } CoordXY[] init() { CoordXY[] result=new CoordXY[23]; result[0]=CoordXY(360758, 638456); result[1]=CoordXY(360790, 638261); result[2]=CoordXY(360788, 638260); result[3]=CoordXY(360613, 638259); result[4]=CoordXY(360563, 638258); result[5]=CoordXY(360546, 638258); result[6]=CoordXY(360509, 638258); result[7]=CoordXY(360477, 638257); result[8]=CoordXY(360476, 638257); result[9]=CoordXY(360473, 638276); result[10]=CoordXY(360471, 638288); result[11]=CoordXY(360470, 638295); result[12]=CoordXY(360469, 638306); result[13]=CoordXY(360468, 638330); result[14]=CoordXY(360593, 638361); result[15]=CoordXY(360618, 638367); result[16]=CoordXY(360652, 638380); result[17]=CoordXY(360677, 638392); result[18]=CoordXY(360720, 638414); result[19]=CoordXY(360738, 638432); result[20]=CoordXY(360745, 638448); result[21]=CoordXY(360752, 638453); result[22]=CoordXY(360758, 638456); return result; } CoordXY[] init2() { CoordXY[] result=new CoordXY[4]; result[0]=CoordXY(360618, 638367); result[1]=CoordXY(360629, 638371); result[2]=CoordXY(360640, 638375); result[3]=CoordXY(360652, 638380); return result; } bool within(CoordXY a, CoordXY b, double maxDist) { double dx=a.x-b.x; double dy=a.y-b.y; if ((dx*dx+dy*dy) < maxDist*maxDist) return true; return false; } const double searchDist=5; double distFuncSegs(CoordXY[] pts, int previdx, int nextidx, CoordXY[] posib) { foreach(CoordXY p; pts) writefln(p.x, " ", p.y); int ptsnumsegs=pts.length-1; int[double] splitsh; int activeptssegs=0; double ptslength=0; for (int i=(previdx+1)%ptsnumsegs; i!=nextidx && (i!=0 || ptsnumsegs!=nextidx); i=(i+1)%ptsnumsegs) { ptslength+=pts[i].dist(pts[i+1]); activeptssegs++; } double[] ptsupto=new double[activeptssegs]; splitsh[0]=1; double lensofar=0; int pos=0; for (int i=(previdx+1)%ptsnumsegs; i!=nextidx && (i!=0 || ptsnumsegs!=nextidx); i=(i+1)%ptsnumsegs) { lensofar+=pts[i].dist(pts[i+1]) / ptslength; if (lensofar>1) lensofar=1; ptsupto[pos++]=lensofar; splitsh[lensofar]=1; } double posiblength=0; for (int i=1; i1) lensofar=1; posibupto[pos++]=lensofar; splitsh[lensofar]=1; } double[] splits=new double[splitsh.length]; pos=0; foreach (double d, int dummy; splitsh) splits[pos++]=d; splits.sort; ptsupto[ptsupto.length-1]=1; posibupto[posibupto.length-1]=1; double lastptsupto=0; int ptsuptopos=0; double thisptsupto=ptsupto[0]; double lastposibupto=0; int posibuptopos=0; double thisposibupto=posibupto[0]; double result=0; for (int a=1; a1) prevval=1; if (val>1) val=1; while (val>thisptsupto) { lastptsupto=thisptsupto; if (++ptsuptoposthisposibupto) { lastposibupto=thisposibupto; if (++posibuptopos