int length2(double gdata[][2]); int length3(double gdata[][3]); int length4(double gdata[][4]); int length5(double gdata[][5]); int length2i(int gdata[][2]); void copyd(int from, int upto, double q[], double p[]); void copyi(int from, int upto, int q[], int p[]); int addptd2(double gdata[][2], double pt[2]); int addptd3(double gdata[][3], double pt[3]); int addptd4(double gdata[][4], double pt[4]); int addptd5(double gdata[][5], double pt[5]); int add2(double gdata[][2], double x, double y); int add3(double gdata[][3], double x, double y, double z); int push2(double x, double y, double ptL[][2]); int push3(double x, double y, double z, double ptL[][3]); int push4(double x, double y, double z, double w, double ptL[][4]); int push5(double x, double y, double z, double w, double u, double ptL[][5]); void pull2(int num, double ptL[][2],double pt[2]); void pull3(int num, double ptL[][3],double pt[3]); void pull4(int num, double ptL[][4],double pt[4]); void pull5(int num, double ptL[][5],double pt[5]); int appendd2(int level, int from,int upto, double gdata[][2],double mat[][2]); int appendd3(int level, int from,int upto, double gdata[][3],double mat[][3]); int prependd2(int from,int upto, double gdata[][2],double mat[][2]); int appendd1(double numvec[], double num); int appendi1(int numvec[],int num); int prependi1(int num, int numvec[]); int removei2(int nrmv,int mat[][2]); int dataindexi1(int out[],int din[][2]); int dataindexd1(double out[],int din[][2]); int dataindexd2(int level,double out[][2],int din[][2]); int dataindexd3(int level, double out[][3],int din[][2]); int dataindexd4(int level, double out[][4],int din[][2]); void dispmatd1(int from, int upto, double mat[]); void dispmatd2(int from, int upto, double mat[][2]); void dispmatd3(int from, int upto, double mat[][3]); void dispmatd4(int from, int upto, double mat[][4]); void dispmatd5(int from, int upto, double mat[][5]); void dispmatd6(int from, int upto, double mat[][6]); void dispmati2(int from, int upto, int mat[][2]); void dispmati1(int from, int upto, int mat[]); int readdata3(const char *fname, double out[][3]); int readdata2(const char *fname, double out[][2]); int output2(const char *var, const char *fname, int level, double out[][2]); void simplesort(double number[]); int memberi(int a, int list[]); double dotprod(int dim, double p[], double q[]); double dist(int dim, double p[], double q[]); void pointoncurve(double t, double gdata[][2], double eps, double pt[]); int partcrv(double a,double b,double pkL[][2], double pL[][2]); int partcrv3(double a,double b,double pkL[][3], double pL[][3]); int connectseg(double pdata[][2], double eps, double out[][2]); void koutenseg(double a[2], double b[2], double c[2], double d[2], double eps, double eps2, double out[4]); double paramoncurve(double p[2], int n, double ptL[][2]); void nearestptpt(double pa[2], double pL[][2], double ans[4]); int intersectselfPp(double data1[][2],double eps,double eps1s,double kL[][4]); int intersectcrvsPp(double data1[][2], double data2[][2], double eps,double eps1s, double kL[][4]); int dropnumlistcrv(double qd[][2], double eps1, int out[]); int increasept2(double ptL[][2], int nn, double out[][2]); int increasept3(double ptL[][3], int nn, double out[][3]); void bezierpt(double t, double p0[2], double p3[2], double p1[2], double p2[2], double ptout[2]); int bezier(double ptL[][2], double ctrL[][4], int num, double out[][2]); int ospline(int level, double ptL[][2], int num, double out[][2]); void bezierpt3(double t, double p0[3], double p3[3], double p1[3], double p2[3], double ptout[3]); int bezier3(double ptL[][3], double ctrL[][6], int num, double out[][3]); int ospline3(int level, double ptL[][3], int num, double out[][3]); const double Inf=99999; const int Infint=30000; int length2(double gdata[][2]){ return floor(gdata[0][0]+0.5); } int length3(double gdata[][3]){ return floor(gdata[0][0]+0.5); } int length4(double gdata[][4]){ return floor(gdata[0][0]+0.5); } int length5(double gdata[][5]){ return floor(gdata[0][0]+0.5); } int length2i(int gdata[][2]){ return gdata[0][0]; } void copyd(int from, int upto, double q[], double p[]){ int i; for(i=from; i<=upto; i++){ p[i]=q[i]; } } void copyi(int from, int upto, int q[], int p[]){ int i; for(i=from; i<=upto; i++){ p[i]=q[i]; } } int push2(double x, double y, double ptL[][2]){ int nall=length2(ptL); nall++; ptL[nall][0]=x; ptL[nall][1]=y; ptL[0][0]=nall; return nall; } int push3(double x, double y, double z, double ptL[][3]){ int nall=length3(ptL); nall++; ptL[nall][0]=x; ptL[nall][1]=y; ptL[nall][2]=z; ptL[0][0]=nall; return nall; } int push4(double x, double y, double z, double w, double ptL[][4]){ int nall=length4(ptL); nall++; ptL[nall][0]=x; ptL[nall][1]=y; ptL[nall][2]=z; ptL[nall][3]=w; ptL[0][0]=nall; return nall; } int push5(double x, double y, double z, double w, double u, double ptL[][5]){ int nall=length5(ptL); nall++; ptL[nall][0]=x; ptL[nall][1]=y; ptL[nall][2]=z; ptL[nall][3]=w; ptL[nall][4]=u; ptL[0][0]=nall; return nall; } void pull3(int num, double ptL[][3],double pt[3]){ pt[0]=ptL[num][0]; pt[1]=ptL[num][1]; pt[2]=ptL[num][2]; } void pull2(int num, double ptL[][2],double pt[2]){ pt[0]=ptL[num][0]; pt[1]=ptL[num][1]; } void pull4(int num, double ptL[][4],double pt[4]){ pt[0]=ptL[num][0]; pt[1]=ptL[num][1]; pt[2]=ptL[num][2]; pt[3]=ptL[num][3]; } void pull5(int num, double ptL[][5],double pt[5]){ pt[0]=ptL[num][0]; pt[1]=ptL[num][1]; pt[2]=ptL[num][2]; pt[3]=ptL[num][3]; pt[4]=ptL[num][4]; } int add2(double gdata[][2], double x, double y){ int nall; nall=push2(x, y, gdata); return nall; } int add3(double gdata[][3], double x, double y, double z){ int nall; nall=push3(x, y, z,gdata); return nall; } int addptd3(double gdata[][3], double pt[3]){ int nall; nall=push3(pt[0],pt[1],pt[2],gdata); return nall; } int addptd2(double gdata[][2], double pt[2]){ int nall; nall=push2(pt[0],pt[1],gdata); return nall; } int addptd4(double gdata[][4], double pt[4]){ int nall; nall=push4(pt[0],pt[1],pt[2],pt[3],gdata); return nall; } int addptd5(double gdata[][5], double pt[5]){ int nall; nall=push5(pt[0],pt[1],pt[2],pt[3],pt[4],gdata); return nall; } int appendd2(int level, int from,int upto, double gdata[][2],double mat[][2]){ int j, np, nall=length2(mat); np=upto-from+1; if(np<0){np=0;} if(np>0){ if(level>0){ if(nall>0){ nall=add2(mat,Inf, level); } } for(j=1; j<=np; j++){ mat[nall+j][0]=gdata[from+j-1][0]; mat[nall+j][1]=gdata[from+j-1][1]; } } mat[0][0]=nall+np; return nall+np; } int appendd3(int level, int from,int upto, double gdata[][3],double mat[][3]){ int j, np, nall=length3(mat); np=upto-from+1; if(np<0){np=0;} if(np>0){ if(level>0){ if(nall>0){ nall=add3(mat,Inf, level, 0); } } for(j=1; j<=np; j++){ mat[nall+j][0]=gdata[from+j-1][0]; mat[nall+j][1]=gdata[from+j-1][1]; mat[nall+j][2]=gdata[from+j-1][2]; } } mat[0][0]=nall+np; return nall+np; } int prependd2(int from,int upto, double gdata[][2],double mat[][2]){ int j,np, nall=length2(mat); if(from<=upto){ np=upto-from+1; for(j=nall; j>=1; j--){ mat[np+j][0]=mat[j][0]; mat[np+j][1]=mat[j][1]; } for(j=1; j<=np; j++){ mat[j][0]=gdata[from+j-1][0]; mat[j][1]=gdata[from+j-1][1]; } }else{ np=from-upto+1; for(j=nall; j>=1; j--){ mat[np+j][0]=mat[j][0]; mat[np+j][1]=mat[j][1]; } for(j=1; j<=np; j++){ mat[nall+j][0]=gdata[from-j+1][0]; mat[nall+j][1]=gdata[from-j+1][1]; } } mat[0][0]=nall+np; return nall+np; } int appendd1(double numvec[], double num){ int n; n=floor(numvec[0]+0.5); numvec[n+1]=num; numvec[0]=n+1; return n+1; } int appendi1(int numvec[],int num){ int n; n=numvec[0]; numvec[n+1]=num; numvec[0]=n+1; return n+1; } int prependi1(int num, int numvec[]){ int i,n; n=numvec[0]; for(i=n; i>=1; i--){ numvec[i+1]=numvec[i]; } numvec[1]=num; numvec[0]=n+1; return n+1; } int removei2(int nrmv,int mat[][2]){ int j,nall=mat[0][0]; if(nall>0){ for(j=nrmv; j<=nall-1; j++){ mat[j][0]=mat[j+1][0]; mat[j][1]=mat[j+1][1]; } mat[0][0]=nall-1; return nall-1; } else{ mat[0][0]=0; return 0; } } int dataindexd1(double out[],int din[][2]){ int n1=1, j, ctr=0, nall=floor(out[0]+0.5); if(nall==0){ din[0][0]=0; return 0; } for(j=1; j<=nall; j++){ if(out[j]>Inf-1){ ctr++; din[ctr][0]=n1; din[ctr][1]=j-1; n1=j+1; } } ctr++; din[ctr][0]=n1; din[ctr][1]=nall; din[0][0]=ctr; return ctr; } int dataindexd2(int level,double out[][2],int din[][2]){ int n1=1, j, ctr=0, nall=length2(out); if(nall==0){ din[0][0]=0; return 0; } for(j=1; j<=nall; j++){ if(out[j][0]>Inf-1){ if((level==0) || (out[j][1]==level)){ ctr++; din[ctr][0]=n1; din[ctr][1]=j-1; n1=j+1; } } } ctr++; din[ctr][0]=n1; din[ctr][1]=nall; din[0][0]=ctr; return ctr; } int dataindexd3(int level, double out[][3],int din[][2]){ int n1=1, j, ctr=0, nall=length3(out); if(nall==0){ din[0][0]=0; return 0; } for(j=1; j<=nall; j++){ if(out[j][0]>Inf-1){ if((level==0) || (out[j][1]==level)){ ctr++; din[ctr][0]=n1; din[ctr][1]=j-1; n1=j+1; } } } ctr++; din[ctr][0]=n1; din[ctr][1]=nall; din[0][0]=ctr; return ctr; } int dataindexd4(int level, double out[][4],int din[][2]){ int n1=1, j, ctr=0, nall=length4(out); if(nall==0){ din[0][0]=0; return 0; } for(j=1; j<=nall; j++){ if(out[j][0]>Inf-1){ if((level==0) || (out[j][1]==level)){ ctr++; din[ctr][0]=n1; din[ctr][1]=j-1; n1=j+1; } } } ctr++; din[ctr][0]=n1; din[ctr][1]=nall; din[0][0]=ctr; return ctr; } int dataindexi1(int out[],int din[][2]){ int n1=1, j, ctr=0, nall=out[0], ninfp=0; if(nall==0){ din[0][0]=0; din[0][1]=-1; return 0; } for(j=1; j<=nall; j++){ if(out[j]==Infint){ ctr++; if(j==ninfp+1){ din[ctr][0]=0; din[ctr][1]=-1; } else{ din[ctr][0]=n1; din[ctr][1]=j-1; } ninfp=j; n1=j+1; } } ctr++; if(out[nall]==Infint){ din[ctr][0]=0; din[ctr][1]=0; } else{ din[ctr][0]=n1; din[ctr][1]=nall; } din[0][0]=ctr; return ctr; } void dispmatd1(int from, int upto, double mat[]){ int i; for(i=from; i number[j]) { tmp = number[i]; number[i] = number[j]; number[j] = tmp; } } } } int memberi(int a, int list[]){ int i, n=list[0]; for(i=1; i<=n; i++){ if(a==list[i]){ return 1; } } return 0; } double dotprod(int dim, double p[], double q[]){ double ans; ans=p[0]*q[0]+p[1]*q[1]; if(dim>2){ ans=ans+p[2]*q[2]; } return ans; } double dist(int dim, double p[], double q[]){ double tmp; tmp=pow(q[0]-p[0],2)+pow(q[1]-p[1],2); if(dim>2){ tmp=tmp+pow(q[2]-p[2],2); } return sqrt(tmp); } void pointoncurve(double t, double gdata[][2], double eps, double pt[]){ double pa[2],pb[2], s; int n, nall; n=floor(t+eps); s=fmax(t-n,0); nall=length2(gdata); if(n>=nall){ pull2(nall,gdata,pt); // pt[0]=gdata[nall][0]; pt[1]=gdata[nall][1]; } else{ pull2(n,gdata,pa); pull2(n+1,gdata,pb); pt[0]=(1-s)*pa[0]+s*pb[0]; pt[1]=(1-s)*pa[1]+s*pb[1]; } } int partcrv(double a,double b,double pkL[][2], double pL[][2]){ int i, is, ie, nall; double eps=pow(10,-3.2); is=ceil(a); ie=floor(b); nall=0; if(aie+eps){ nall++; pL[nall][0]=(1-b+ie)*pkL[ie][0]+(b-ie)*pkL[ie+1][0]; pL[nall][1]=(1-b+ie)*pkL[ie][1]+(b-ie)*pkL[ie+1][1]; } pL[0][0]=nall; return nall; } int partcrv3(double a,double b,double pkL[][3], double pL[][3]){ int i, is, ie, nall; double eps=pow(10,-3.2); is=ceil(a); ie=floor(b); nall=0; if(aie+eps){ nall++; pL[nall][0]=(1-b+ie)*pkL[ie][0]+(b-ie)*pkL[ie+1][0]; pL[nall][1]=(1-b+ie)*pkL[ie][1]+(b-ie)*pkL[ie+1][1]; pL[nall][2]=(1-b+ie)*pkL[ie][2]+(b-ie)*pkL[ie+1][2]; } pL[0][0]=nall; return nall; } int connectseg(double pdata[][2], double eps, double out[][2]){ int din[DsizeM][2], nd, nq, i, j, flg, st, en, ntmp; int nall=length2(pdata), nout=0; double qd[DsizeM][2], ah[2], ao[2], p[2], q[2], tmp[2]; out[0][0]=0; nd=dataindexd2(0,pdata,din); qd[0][0]=0; nq=appendd2(0,din[1][0],din[1][1],pdata,qd); nd=removei2(1,din); while(nd>0){ pull2(1,qd,ah); pull2(nq,qd,ao); flg=0; for(j=1; j<=nd; j++){ st=din[j][0]; en=din[j][1]; pull2(st,pdata,p); pull2(en,pdata,q); if(dist(2,p,ao)0){ nout=appendd2(2,1,nq,qd,out); } return nout; } void koutenseg(double a[2], double b[2], double c[2], double d[2], double eps, double eps2, double out[4]){ double v[2], epss,eps0=Eps, sv2, p1, p2, q1,q2,m1, m2, M1, M2, t; double tmp1d2[2], tmp2d1, p[2], q[2]; v[0]=b[0]-a[0]; v[1]=b[1]-a[1]; sv2=pow(v[0],2.0)+pow(v[1],2.0); if(sv2M1)){ out[0]=Inf; return; } if((fmax(p2,q2)M2)){ out[0]=Inf; return; } if(p2*q2<0){ t=p1-(q1-p1)/(q2-p2)*p2; if((t>m1)&& (t-eps0) && (t<1+eps0)){ tmp1d2[0]=a[0]+t*v[0]; tmp1d2[1]=a[1]+t*v[1]; tmp2d1=fmin(fmax(t,0),1); out[0]=tmp1d2[0]; out[1]=tmp1d2[1]; out[2]=tmp2d1; out[3]=0; } else{ tmp1d2[0]=a[0]+t*v[0]; tmp1d2[1]=a[1]+t*v[1]; tmp2d1=fmin(fmax(t,0),1); out[0]=tmp1d2[0]; out[1]=tmp1d2[1]; out[2]=tmp2d1; out[3]=1; } return; } if((p1M1)||(p2M2)){ if((q1M1)||(q2M2)){ out[0]=Inf; return; } t=fmin(fmax(q1,0),1); tmp1d2[0]=a[0]+t*v[0]; tmp1d2[1]=a[1]+t*v[1]; out[0]=tmp1d2[0]; out[1]=tmp1d2[1]; out[2]=t; out[3]=1; return; } t=fmin(fmax(p1,0),1); tmp1d2[0]=a[0]+t*v[0]; tmp1d2[1]=a[1]+t*v[1]; out[0]=tmp1d2[0]; out[1]=tmp1d2[1]; out[2]=t; out[3]=1; return; } if((p1>-eps0)&&(p1<1+eps0)&&(p2>-eps0)&&(p2-eps0)&&(q1<1+eps0)&&(q2>-eps0)&&(q2M1)||(p2M2)){ if((q1M1)||(q2M2)){ out[0]=Inf; return; } t=fmin(fmax(q1,0),1); tmp1d2[0]=a[0]+t*v[0]; tmp1d2[1]=a[1]+t*v[1]; out[0]=tmp1d2[0]; out[1]=tmp1d2[1]; out[2]=t; out[3]=1; return; } if((q1M1)||(q2M2)){ t=fmin(fmax(p1,0),1); tmp1d2[0]=a[0]+t*v[0]; tmp1d2[1]=a[1]+t*v[1]; out[0]=tmp1d2[0]; out[1]=tmp1d2[1]; out[2]=t; out[3]=1; return; } if(fabs(p2)1+eps0){ p[0]=b1; p[1]=b2; } else{ p[0]=a1+t*v1; p[1]=a2+t*v2; } s=dist(2,p,pa); if(seps2){ nall=push4(kL0[i][0],kL0[i][1],kL0[i][2],kL0[i][3],kL); p[0]=kL0[i][0]; p[1]=kL0[i][1]; ds=kL0[i][4]; continue; } if(kL0[i][4]0){ pull5(1,kL1,tmpd5); p[0]=tmpd5[0]; p[1]=tmpd5[1]; t=tmpd5[2]; i=floor(tmpd5[3]+Eps); j=floor(tmpd5[4]+Eps); tmpd4[0]=p[0]; tmpd4[1]=p[1]; tmpd4[2]=i+t; tmpd4[3]=j; nkL=addptd4(kL,tmpd4); } for(n=2; n<=nkL1; n++){ pull5(n,kL1,tmpd5); p[0]=tmpd5[0]; p[1]=tmpd5[1]; flg=0; for(k=1; k<=nkL; k++){ pull4(k,kL,tmpd4); tmp1d2[0]=tmpd4[0]; tmp1d2[1]=tmpd4[1]; if(pow(dist(2,p,tmp1d2),2.0)eps1){ nptL=appendi1(ptL,k); pull2(k,pd,p); } } pull2(npd-1,pd,p); pull2(npd,pd,tmp2d); if(dist(2,p,tmp2d)>eps){ // eps -> eps1 ? nptL=appendi1(ptL,npd); } if(nptL==1){ptL[0]=0; nptL=0;} if(nout>0){ nout=appendi1(out,Infint); } for(i=1; i<=nptL; i++){ nout=appendi1(out,ptL[i]); } } out[0]=nout; return nout; } int increasept2(double ptL[][2], int nn, double out[][2]){ int ii, jj, npt, nall; double tmpd2[2]; npt=length2(ptL); out[0][0]=0; for(ii=1; ii<=npt-1; ii++){ for(jj=0; jjInf-1){ for(i=0; i<2; i++){ p2[i]=p3[i]; } flg3=0; } for(i=0; i<2; i++){ p4[i]=(1-t)*p0[i]+t*p1[i]; } for(i=0; i<2; i++){ p5[i]=(1-t)*p1[i]+t*p2[i]; } for(i=0; i<2; i++){ p6[i]=(1-t)*p2[i]+t*p3[i]; } for(i=0; i<2; i++){ p7[i]=(1-t)*p4[i]+t*p5[i]; } if(flg3==0){ for(i=0; i<2; i++){ pout[i]=p7[i]; } } else{ for(i=0; i<2; i++){ p8[i]=(1-t)*p5[i]+t*p6[i]; } for(i=0; i<2; i++){ pout[i]=(1-t)*p7[i]+t*p8[i]; } } } int bezier(double ptL[][2], double ctrL[][4], int num, double out[][2]){ double p0[2], p3[2], p1[2], p2[2], pt[2], dt=1.0/num; int i, j, n, nall; out[0][0]=0; nall=0; nall=appendd2(0,1,1,ptL,out); n=length2(ptL); for(i=1; i<=n-1; i++){ pull2(i,ptL, p0); pull2(i+1,ptL, p3); p1[0]=ctrL[i][0]; p1[1]=ctrL[i][1]; p2[0]=ctrL[i][2]; p2[1]=ctrL[i][3]; for(j=1; j<=num; j++){ bezierpt(j*dt,p0,p3,p1,p2,pt); nall=push2(pt[0],pt[1], out); } } return nall; } int ospline(int level, double ptL[][2], int num, double out[][2]){ double ctrlist[DsizeM][4], eps0=pow(10,-6.0), tmp, cc; double p[2], q[2], p0[2], p3[2], p1[2], p2[2], pQ[2], pR[2]; double ptlist[DsizeM][2], tmpmd2[DsizeM][2]; int nd, i, j, npt, nall, nctr, flg, ndin, closed, din[DsizeM][2], ntmp; out[0][0]=0; if(num==1){ npt=length2(ptL); for(i=0; i<=npt; i++){ out[i][0]=ptL[i][0]; out[i][1]=ptL[i][1]; } nall=length2(out); return nall; } ndin=dataindexd2(level,ptL,din); for(nd=1; nd<=ndin; nd++){ ptlist[0][0]=0; npt=appendd2(0,din[nd][0],din[nd][1],ptL,ptlist); if(npt==2){ appendd2(2, 1,npt,ptlist,out); continue; } closed=0; pull2(1,ptlist,p); pull2(npt,ptlist,q); if(dist(2,p,q)2){ ntmp=bezier(ptlist,ctrlist,num, tmpmd2); nall=appendd2(2,1,ntmp,tmpmd2,out); } } return nall; } void bezierpt3(double t, double p0[], double p3[], double p1[], double p2[], double pout[]){ double p4[3], p5[3], p6[3], p7[3], p8[3]; int i, flg3=1; if(p2[0]>Inf-1){ for(i=0; i<3; i++){ p2[i]=p3[i]; } flg3=0; } for(i=0; i<3; i++){ p4[i]=(1-t)*p0[i]+t*p1[i]; } for(i=0; i<3; i++){ p5[i]=(1-t)*p1[i]+t*p2[i]; } for(i=0; i<3; i++){ p6[i]=(1-t)*p2[i]+t*p3[i]; } for(i=0; i<3; i++){ p7[i]=(1-t)*p4[i]+t*p5[i]; } if(flg3==0){ for(i=0; i<3; i++){ pout[i]=p7[i]; } } else{ for(i=0; i<3; i++){ p8[i]=(1-t)*p5[i]+t*p6[i]; } for(i=0; i<3; i++){ pout[i]=(1-t)*p7[i]+t*p8[i]; } } } int bezier3(double ptL[][3], double ctrL[][6], int num, double out[][3]){ double p0[3], p3[3], p1[3], p2[3], pt[3], dt=1.0/num; int i, j, n, nall; out[0][0]=0; nall=0; nall=appendd3(0,1,1,ptL,out); n=length3(ptL); for(i=1; i<=n-1; i++){ pull3(i,ptL, p0); pull3(i+1,ptL, p3); p1[0]=ctrL[i][0]; p1[1]=ctrL[i][1]; p1[2]=ctrL[i][2]; p2[0]=ctrL[i][3]; p2[1]=ctrL[i][4]; p2[2]=ctrL[i][5]; for(j=1; j<=num; j++){ bezierpt3(j*dt,p0,p3,p1,p2,pt); nall=push3(pt[0],pt[1],pt[2], out); } } return nall; } int ospline3(int level, double ptL[][3], int num, double out[][3]){ double ctrlist[DsizeM][6], eps0=pow(10,-6.0), tmp, cc; double p[3], q[3], p0[3], p3[3], p1[3], p2[3], pQ[3], pR[3]; double ptlist[DsizeM][3], tmpmd2[DsizeM][3]; int nd, i, j, n, npt, nall, nctr, closed, flg, ndin, din[DsizeM][2], ntmp; out[0][0]=0; nall=0; if(num==1){ npt=length3(ptL); for(i=0; i<=npt; i++){ out[i][0]=ptL[i][0]; out[i][1]=ptL[i][1]; out[i][2]=ptL[i][2]; } nall=length3(out); return nall; } ndin=dataindexd3(2,ptL,din); for(nd=1; nd<=ndin; nd++){ ptlist[0][0]=0; npt=din[nd][1]-din[nd][0]; if(npt<=3){ n=appendd3(0, din[nd][0], din[nd][0], ptL, ptlist); for(i=1; i<=npt-1; i++){ pull3(din[nd][0]+i,ptL,p); pull3(din[nd][0]+i+1,ptL,q); for(j=1; j<=num; j++){ p1[0]=p[0]+1.0*j/num*(q[0]-p[0]); p1[1]=p[1]+1.0*j/num*(q[1]-p[1]); p1[2]=p[2]+1.0*j/num*(q[2]-p[2]); n=addptd3(ptlist,p1); } } nall=appendd3(2, 1,n,ptlist,out); continue; } appendd3(0,din[nd][0],din[nd][1],ptL,ptlist); closed=0; pull3(1,ptlist,p); pull3(npt,ptlist,q); if(dist(3,p,q)2){ ntmp=bezier3(ptlist,ctrlist,num, tmpmd2); nall=appendd3(2,1,ntmp,tmpmd2,out); } } return nall; }