static Obj COMPLEX_ROOTS (Obj self, Obj coeffs) { Obj result; Int i, numroots, degree = LEN_PLIST(coeffs)-1; xcomplex op[degree+1], zero[degree]; if (degree < 1) return Fail; for (i = 0; i <= degree; i++) { __real__(op)[degree-i] = VAL_FLOAT(ELM_PLIST(ELM_PLIST(coeffs,i+1),1)); __imag__(op)[degree-i] = VAL_FLOAT(ELM_PLIST(ELM_PLIST(coeffs,i+1),2)); if (isnan(__real__(op)[degree-i]) || isnan(__imag__(op)[degree-i])) return Fail; } #ifdef DEBUG_COMPLEX_ROOTS fprintf(stderr,"coeffs"); for (i = 0; i <= degree; i++) fprintf(stderr," %g+I*%g",(double)opr[i],(double)opi[i]); /* __asm__ __volatile__ ("int3"); */ fprintf(stderr,"\n"); #endif numroots = cpoly (degree, op, zero); if (numroots == -1) return Fail; #ifdef DEBUG_COMPLEX_ROOTS fprintf(stderr,"roots"); for (i = 0; i < numroots; i++) fprintf(stderr," %g+I*%g",__real__(zero)[i],__imag__(zero)[i]); fprintf(stderr,"\n"); #endif result = ALLOC_PLIST(numroots); for (i = 1; i <= numroots; i++) { Obj t = ALLOC_PLIST(2); set_elm_plist(t,1, NEW_FLOAT(__real__(zero)[i-1])); set_elm_plist(t,2, NEW_FLOAT(__imag__(zero)[i-1])); set_elm_plist(result,i, t); } return result; }
CL::Polygon Clipping::getClipperPolygon(const Poly &poly) { CL::Polygon cpoly(poly.vertices.size()); for(size_t i=0; i<poly.vertices.size();i++){ Vector2d P1; // if (reverse) P1 = poly.getVertexCircular(-i); // have to reverse from/to clipper // else // P1 = poly.getVertexCircular(i); cpoly[i]=(ClipperPoint(P1)); } // doesn't work...: // cerr<< "poly is hole? "<< hole; // cerr<< " -- orient=" <<ClipperLib::Orientation(cpoly) << endl; // if (ClipperLib::Orientation(cpoly) == hole) // std::reverse(cpoly.begin(),cpoly.end()); return cpoly; }
/* driver to test cpoly */ int main() { int fail; double p[50],pi[50],zr[50],zi[50]; int i; printf("Example 1. polynomial with zeros 1,2,...,10.\n"); p[0]=1L; p[1]=-55L; p[2]=1320L; p[3]=-18150L; p[4]=157773L; p[5]=-902055L; p[6] = 3416930L; p[7]=-8409500L; p[8]=12753576L; p[9]=-10628640L; p[10]=3628800L; for (i=0;i<11;i++) pi[i]=0; prtc(11,p,pi); fail = cpoly(p,pi,10,zr,zi); if(fail) printf("cpoly has failed on this example\n"); prtz (10,zr,zi); printf("Example 2. zeros on imaginary axis degree 3.\n"); p[0]=1; p[1]=0; p[2]=-10001.0001L; p[3]=0; pi[0]=0; pi[1]=-10001.0001L; pi[2]=0; pi[3]=1; prtc(4,p,pi); fail = cpoly(p,pi,3,zr,zi); if (fail) printf("cpoly has failed on this example\n"); prtz(3,zr,zi); printf("Example 3. zeros at 1+i,1/2*(1+i)....1/(2**-9)*(1+i)\n"); p[0]=1.0; p[1]=-1.998046875L; p[2]=0.0; p[3]=.7567065954208374L; p[4]=-.2002119533717632L; p[5]=1.271507365163416e-2L; p[6]=0; p[7]=-1.154642632172909e-5L; p[8]=1.584803612786345e-7L; p[9]=-4.652065399568528e-10L; p[10]=0; pi[0]=0; pi[1]=p[1]; pi[2]=2.658859252929688L; pi[3]=-7.567065954208374e-1L; pi[4]=0; pi[5]=p[5]; pi[6]=-7.820779428584501e-4L; pi[7]=-p[7]; pi[8]=0; pi[9]=p[9]; pi[10]=9.094947017729282e-13L; prtc(11,p,pi); fail = cpoly(p,pi,10,zr,zi); if (fail) printf("cpoly has failed on this example\n"); prtz(10,zr,zi); printf("Example 4. multiple zeros\n"); p[0]=1L; p[1]=-10L; p[2]=3L; p[3]=284L; p[4]=-1293L; p[5]=2374L; p[6]=-1587L; p[7]=-920L; p[8]=2204L; p[9]=-1344L; p[10]=288L; pi[0]=0; pi[1]=-10L; pi[2]=100L; pi[3]=-334L; pi[4]=200L; pi[5]=1394L; pi[6] =-3836L; pi[7]=4334L; pi[8]=-2352L; pi[9]=504L; pi[10]=0; prtc(11,p,pi); fail = cpoly(p,pi,10,zr,zi); if (fail) printf("cpoly has failed on this example\n"); prtz(10,zr,zi); printf("Example 5. 12 zeros evenly distributed on a circle of radius 1. centered at 0+2i.\n"); p[0]=1L; p[1]=0; p[2]=-264L; p[3]=0; p[4]=7920L; p[5]=0; p[6]=-59136L; p[7]=0; p[8]=126720L; p[9]=0; p[10]=-67584L; p[11]=0; p[12]=4095L; pi[0]=0; pi[1]=-24L; pi[2]=0; pi[3]=1760L; pi[4]=0; pi[5]=-25344L; pi[6]=0; pi[7]=101376L; pi[8]=0; pi[9]=-112640L; pi[10]=0; pi[11]=24576L; pi[12]=0; prtc(13,p,pi); fail = cpoly(p,pi,12,zr,zi); if(fail) printf("cpoly has failed on this example\n"); prtz(12,zr,zi); return 0; }