// 17.06.16 crvsfparadata changed ( num of devision ) int output3(const char *var, const char *fname, int level, double out[][3]){ int nall=floor(out[0][0]+0.5), ndin, din[DsizeM][2],i,j,ctr; double tmpd[3]; FILE *fp; fp=fopen(fname,"w"); if (fp == NULL) { printf("cannot open\n"); return -1; // exit(1); } ndin=dataindexd3(level, out,din); fprintf(fp,"%s//\n",var); //17.05.29 // fprintf(fp,"%s3d//\n",var2); for(i=1; i<=ndin; i++){ fprintf(fp,"start//\n"); fprintf(fp,"["); ctr=0; for(j=din[i][0]; j<=din[i][1]; j++){ pull3(j,out,tmpd); fprintf(fp,"[ %7.5f, %7.5f, %7.5f]",tmpd[0],tmpd[1],tmpd[2]); ctr++; if(ctr==5){ fprintf(fp,"]//\n["); ctr=0; }else{ if(jInf-1){ pt2[0]=pt3[0]; pt2[1]=pt3[1]; } else{ pt2[0]=-pt3[0]*sin(PHI)+pt3[1]*cos(PHI); pt2[1]=-pt3[0]*cos(PHI)*cos(THETA)-pt3[1]*sin(PHI)*cos(THETA)+pt3[2]*sin(THETA); } } int projpara(double p3[][3], double p2[][2]){ double pt3[3], pt2[2]; int i, nall, nall2; nall=length3(p3); p2[0][0]=0; for(i=1; i<=nall; i++){ pull3(i,p3,pt3); parapt(pt3,pt2); nall2=addptd2(p2,pt2); } return nall2; } double invparapt(double ph, double fh[][2], double fk[][3],double out[3]){ int n, nfk=length3(fk), nph=length2(fh); double s0=ph-n, ak[3], bk[3], ah[2], bh[2], pk[3]; if(nfk>2){ n=trunc(ph); s0=ph-n; if(ph>nph-Eps){ out[0]=fk[nfk][0]; out[1]=fk[nfk][1]; out[2]=fk[nfk][2]; return nph; } } else{ n=1; s0=ph-1; } ak[0]=fk[n][0]; ak[1]=fk[n][1]; ak[2]=fk[n][2]; bk[0]=fk[n+1][0]; bk[1]=fk[n+1][1]; bk[2]=fk[n+1][2]; ah[0]=fh[n][0]; ah[1]=fh[n][1]; bh[0]=fh[n+1][0]; bh[1]=fh[n+1][1]; out[0]=(1-s0)*ak[0]+s0*bk[0]; out[1]=(1-s0)*ak[1]+s0*bk[1]; out[2]=(1-s0)*ak[2]+s0*bk[2]; return n+s0; } int surfcurve(short ch,int level, double crv[][2], double pdata[][3]){ double p2[2], pt[3]; int i, n, nall; n=length2(crv); pdata[0][0]=0; for(i=1; i<=n; i++){ pull2(i,crv,p2); surffun(ch,p2[0],p2[1],pt); nall=addptd3(pdata,pt); } return nall; } int xyzax3data(double x0, double x1, double y0, double y1, double z0, double z1, double out[][3]){ int nall; double pd3[10][3]; out[0][0]=0; nall=0; pd3[0][0]=2; pd3[1][0]=x0; pd3[1][1]=0; pd3[1][2]=0; pd3[2][0]=x1; pd3[2][1]=0; pd3[2][2]=0; nall=appendd3(2,1,2,pd3,out); pd3[1][0]=0; pd3[1][1]=y0; pd3[1][2]=0; pd3[2][0]=0; pd3[2][1]=y1; pd3[2][2]=0; nall=appendd3(2,1,2,pd3,out); pd3[1][0]=0; pd3[1][1]=0; pd3[1][2]=z0; pd3[2][0]=0; pd3[2][1]=0; pd3[2][2]=z1; nall=appendd3(2,1,2,pd3,out); return nall; } void evlptablepara(short ch){ int i, j; double u,v,u1,u2,v1,v2,pt1[3],pt2[3],pt2d1[2],pt2d2[2],dxu,dyu,dxv,dyv; double du=(Urng[1]-Urng[0])/Mdv, dv=(Vrng[1]-Vrng[0])/Ndv; double eps=0.00001; for (j= 0; j < Ndv+1; j++) { v=Vrng[0]+j*dv; v1=v-eps/2; v2=v+eps/2; for (i = 0; i < Mdv+1; i++) { u=Urng[0]+i*du; u1=u-eps/2; u2=u+eps/2; surffun(ch,u1,v,pt1); parapt(pt1,pt2d1); surffun(ch,u2,v,pt2); parapt(pt2,pt2d2); dxu=(pt2d2[0]-pt2d1[0])/eps; dyu=(pt2d2[1]-pt2d1[1])/eps; surffun(ch,u,v1,pt1); parapt(pt1,pt2d1); surffun(ch,u,v2,pt2); parapt(pt2,pt2d2); dxv=(pt2d2[0]-pt2d1[0])/eps; dyv=(pt2d2[1]-pt2d1[1])/eps; Zval[j][i]=dxu*dyv-dxv*dyu; } } for (i = 0; i < Mdv+1; i++) { Xval[i]=Urng[0]+i*du; } for (j= 0; j < Ndv+1; j++) { Yval[j]=Vrng[0]+j*dv; } }; double evlpfun(short ch, double u, double v){ double u1,u2,v1,v2,pt1[3],pt2[3],pt2d1[2],pt2d2[2],dxu,dyu,dxv,dyv; double du=(Urng[1]-Urng[0])/Mdv, dv=(Vrng[1]-Vrng[0])/Ndv; double eps=0.00001; u1=u-eps/2; u2=u+eps/2; if(u1Urng[1]){u2=Urng[1];} surffun(ch,u1,v,pt1); parapt(pt1,pt2d1); surffun(ch,u2,v,pt2); parapt(pt2,pt2d2); dxu=(pt2d2[0]-pt2d1[0])/(u2-u1); dyu=(pt2d2[1]-pt2d1[1])/(u2-u1); v1=v-eps/2; v2=v+eps/2; if(v1Vrng[1]){v2=Vrng[1];} surffun(ch,u,v1,pt1); parapt(pt1,pt2d1); surffun(ch,u,v2,pt2); parapt(pt2,pt2d2); dxv=(pt2d2[0]-pt2d1[0])/(v2-v1); dyv=(pt2d2[1]-pt2d1[1])/(v2-v1); return dxu*dyv-dxv*dyu; }; int envelopedata(short ch, double out[][2]){ int i, j, k, ctrq=0,ctr, nall; double uval1,uval2,vval1,vval2,eval11,eval12,eval21,eval22; double pl[5][2], vl[5], ql[11][2], out2[DsizeM][2]; double du=(Urng[1]-Urng[0])/Mdv; double dv=(Vrng[1]-Vrng[0])/Mdv; ctr=0; for (j = 0; j < Ndv; j++) { vval1=Vrng[0]+j*dv; vval2=Vrng[0]+(j+1)*dv; uval1=Urng[0]; eval11=evlpfun(ch,uval1,vval1); eval12=evlpfun(ch,uval1,vval2); for (i = 0; i < Mdv; i++) { uval2=Urng[0]+(i+1)*du; eval21=evlpfun(ch,uval2,vval1); eval22=evlpfun(ch,uval2,vval2); pl[0][0]=uval1; pl[0][1]=vval1; vl[0]=eval11; pl[1][0]=uval2; pl[1][1]=vval1; vl[1]=eval21; pl[2][0]=uval2; pl[2][1]=vval2; vl[2]=eval22; pl[3][0]=uval1; pl[3][1]=vval2; vl[3]=eval12; pl[4][0]=uval1; pl[4][1]=vval1; vl[4]=eval11; ctrq=0; for (k = 0; k < 4; k++) { if(fabs(vl[k])<=Eps){ ql[ctrq][0]=pl[k][0]; ql[ctrq][1]=pl[k][1]; ctrq++; } else if(vl[k]>Eps){ if(vl[k+1]< -Eps){ ql[ctrq][0]=1/(vl[k]-vl[k+1])*(-vl[k+1]*pl[k][0]+vl[k]*pl[k+1][0]); ql[ctrq][1]=1/(vl[k]-vl[k+1])*(-vl[k+1]*pl[k][1]+vl[k]*pl[k+1][1]); ctrq++; } } else{ if(vl[k+1]>Eps){ ql[ctrq][0]=1/(-vl[k]+vl[k+1])*(vl[k+1]*pl[k][0]-vl[k]*pl[k+1][0]); ql[ctrq][1]=1/(-vl[k]+vl[k+1])*(vl[k+1]*pl[k][1]-vl[k]*pl[k+1][1]); ctrq++; } } } uval1=uval2; eval11=eval21; eval12=eval22; if(ctrq==2){ if(ctr>0){ ctr++; out[ctr][0]=Inf; out[ctr][1]=2; // 2 <- 0 ? } ctr++; out[ctr][0]=ql[0][0]; out[ctr][1]=ql[0][1]; ctr++; out[ctr][0]=ql[1][0]; out[ctr][1]=ql[1][1]; } } } out[0][0]=ctr; if(ctr>0){ nall=connectseg(out, Eps, out2); out[0][0]=0; nall=appendd2(2,1,nall,out2,out); } return nall; } /* int implicitplot(double out[][2]){ int i, j, k, ctrq=0,ctr, nall; double pl[5][2], vl[5], ql[11][2], out2[DsizeM][2]; ctr=0; for (j = 0; j < Ndv; j++) { for (i = 0; i < Mdv; i++) { pl[0][0]=Xval[i]; pl[0][1]=Yval[j]; vl[0]=Zval[j][i]; pl[1][0]=Xval[i+1]; pl[1][1]=Yval[j]; vl[1]=Zval[j][i+1]; pl[2][0]=Xval[i+1]; pl[2][1]=Yval[j+1]; vl[2]=Zval[j+1][i+1]; pl[3][0]=Xval[i]; pl[3][1]=Yval[j+1]; vl[3]=Zval[j+1][i]; pl[4][0]=Xval[i]; pl[4][1]=Yval[j]; vl[4]=Zval[j][i]; ctrq=0; for (k = 0; k < 4; k++) { if(fabs(vl[k])<=Eps){ ql[ctrq][0]=pl[k][0]; ql[ctrq][1]=pl[k][1]; ctrq++; } else if(vl[k]>Eps){ if(vl[k+1]< -Eps){ ql[ctrq][0]=1/(vl[k]-vl[k+1])*(-vl[k+1]*pl[k][0]+vl[k]*pl[k+1][0]); ql[ctrq][1]=1/(vl[k]-vl[k+1])*(-vl[k+1]*pl[k][1]+vl[k]*pl[k+1][1]); ctrq++; } } else{ if(vl[k+1]>Eps){ ql[ctrq][0]=1/(-vl[k]+vl[k+1])*(vl[k+1]*pl[k][0]-vl[k]*pl[k+1][0]); ql[ctrq][1]=1/(-vl[k]+vl[k+1])*(vl[k+1]*pl[k][1]-vl[k]*pl[k+1][1]); ctrq++; } } } if(ctrq==2){ if(ctr>0){ ctr++; out[ctr][0]=Inf; out[ctr][1]=2; // 2 <- 0 ? } ctr++; out[ctr][0]=ql[0][0]; out[ctr][1]=ql[0][1]; ctr++; out[ctr][0]=ql[1][0]; out[ctr][1]=ql[1][1]; } } } out[0][0]=ctr; if(ctr>0){ nall=connectseg(out, Eps, out2); out[0][0]=0; nall=appendd2(2,1,nall,out2,out); } return nall; } */ int cuspsplitpara(short ch,double pdata[][2], double outkL[][3]){ int i, j, ng, n, nd, ndd, ndrop, is, ncusp=0, ncusppt,st, en, npk,nph, cflg; int cusp[DsizeM], cuspflg; int ntmp,ntmp1,ntmp2, ntmpnum, noutkL=0, noutk=0, nout=0; int din[DsizeM][2], dind[DsizeM][2], drop[DsizeL], tmpnum[DsizeM]; double eps=pow(10.0,-6.0); double vtmp, vtmp1,kaku,cva, ps[2], pe[2],v1[2],v2[2]; double tmp[2],tmp1[2],tmp2[2],pt3d[3],pt2d[2],q3d[3],q2d[2]; double ptk[DsizeM][3],pth[DsizeM][2], outk[DsizeM][3]; double ptxy[DsizeM][2],tmp3d[DsizeM][3]; double tmp3d1[DsizeM][3],tmp3d2[DsizeM][3],tmp2d[DsizeM][2]; outkL[0][0]=0; cusp[0]=0; Cuspsplitpt[0][0]=0; nd=dataindexd2(0,pdata,din); for(ng=1; ng<=nd; ng++){ ptk[0][0]=0; pth[0][0]=0; st=din[ng][0]; en=din[ng][1]; ptxy[0][0]=0; n=appendd2(0,st,en,pdata,ptxy); npk=0; nph=0; for(i=1; i<=en-st+1; i++){ pull2(st+i-1,pdata,tmp); surffun(ch,tmp[0],tmp[1],pt3d); parapt(pt3d,pt2d); if(i==1){ npk=addptd3(ptk,pt3d); nph=addptd2(pth,pt2d); } else{ pull2(nph,pth,tmp1); if(dist(2,tmp1,pt2d)>eps){ npk=addptd3(ptk,pt3d); nph=addptd2(pth,pt2d); } } } if(nph==0){ npk=0; return 0; }; pull2(1,pth,ps); pull2(nph,pth,pe); cflg=0; if(dist(2,ps,pe)90){ cuspflg=1; break; } pull2(j,pth,q2d); if(dist(2,pt2d,q2d)>Eps1){ break; } v1[0]=q2d[0]-pth[j-1][0]; v1[1]=q2d[1]-pth[j-1][1]; v2[0]=pth[j+1][0]-q2d[0]; v2[1]=pth[j+1][1]-q2d[1]; vtmp=v1[0]*v2[0]+v1[1]*v2[1]; tmp[0]=0; tmp[1]=0; vtmp=vtmp/(dist(2,v1,tmp)*dist(2,v2,tmp)); vtmp=acos(vtmp)*180/M_PI; if(v1[0]*v2[1]-v1[1]*v2[0]<0){ vtmp=-vtmp; } kaku=kaku+vtmp; } if(cuspflg==1){ ntmp=trunc((i+j)*0.5); i=j; if(cusp[0]==0){ ncusp=appendi1(cusp,ntmp); } else{ ncusp=appendi1(cusp,ntmp); } } } } if(cflg==0){ ncusp=prependi1(1,cusp); ncusp=appendi1(cusp,nph); } else if(ncusp==0){ ncusp=prependi1(1,cusp); ncusp=appendi1(cusp,nph); } else if(cusp[1]==1){ ncusp=appendi1(cusp,nph); } else{ ntmp=cusp[1]; ntmp1=nph; tmp2d[0][0]=0; n=appendd2(0,ntmp,ntmp1,pth,tmp2d); n=appendd2(0,2,ntmp,pth,tmp2d); pth[0][0]=0; nph=appendd2(0,1,n,tmp2d,pth); tmp3d[0][0]=0; n=appendd3(0,ntmp,ntmp1,ptk,tmp3d); n=appendd3(0,2,ntmp,ptk,tmp3d); ptk[0][0]=0; npk=appendd3(0,1,n,tmp3d,ptk); for(i=1; i<=cusp[0]; i++){ cusp[i]=cusp[i]-ntmp+1; } ncusp=appendi1(cusp,nph); } if(ncusp==2){ pull2(nph,pth,tmp); if(npk>=2){ ncusppt=addptd2(Cuspsplitpt,tmp); noutkL=appendd3(2,1,npk,ptk,outkL); } continue; } outk[0][0]=0; is=1; for(i=1; i<=ncusp-1; i++){ ntmp1=cusp[is]; ntmp2=cusp[i+1]; pull2(ntmp1,pth,tmp1); pull2(ntmp2,pth,tmp2); if(dist(2,tmp1,tmp2)>Eps1){ tmp3d[0][0]=0; n=appendd3(0,ntmp1,ntmp2,ptk,tmp3d); noutk=appendd3(2,1,n,tmp3d,outk); ncusppt=addptd2(Cuspsplitpt,tmp2); is=i+1; } } noutkL=appendd3(2,1,noutk,outk,outkL); } n=projpara(outkL,tmp2d); ndrop=dropnumlistcrv(tmp2d,Eps1*0.5,drop); nd=dataindexd3(2,outkL,din); ndd=dataindexi1(drop,dind); tmp3d2[0][0]=0; ntmp2=0; for(i=1; i<=nd; i++){ tmp3d[0][0]=0; ntmp=0; ntmp=appendd3(0,din[i][0],din[i][1],outkL,tmp3d); tmpnum[0]=0; ntmpnum=0; for(j=dind[i][0]; j<=dind[i][1]; j++){ ntmpnum=appendi1(tmpnum,drop[j]); } tmp3d1[0][0]=0; ntmp1=0; for(j=1; j<=ntmpnum; j++){ pt3d[0]=tmp3d[tmpnum[j]][0]; pt3d[1]=tmp3d[tmpnum[j]][1]; pt3d[2]=tmp3d[tmpnum[j]][2]; ntmp1=addptd3(tmp3d1,pt3d); } if(ntmp1>0){ ntmp2=appendd3(2,1,ntmp1,tmp3d1,tmp3d2); } } outkL[0][0]=0; noutkL=0; noutkL=appendd3(0,1,ntmp2,tmp3d2,outkL); return noutkL; } int makexybdy(short ch,double ehL[][2]){ int i, nehL, ntmpd2; double ptd3[3],ptd2[2],tmpd2[DsizeM][2],du,dv; ehL[0][0]=0; nehL=0; du=(Urng[1]-Urng[0])/Mdv; dv=(Vrng[1]-Vrng[0])/Ndv; if(DrawE==1){ tmpd2[0][0]=0; ntmpd2=0; for(i=0; i<=Ndv; i++){ surffun(ch,Urng[1],Vrng[0]+i*dv,ptd3); ntmpd2=push2(ptd3[0],ptd3[1],tmpd2); } nehL=appendd2(2,1,ntmpd2,tmpd2,ehL); } if(DrawN==1){ tmpd2[0][0]=0; ntmpd2=0; for(i=0; i<=Mdv; i++){ surffun(ch,Urng[0]+i*du,Vrng[1],ptd3); ntmpd2=push2(ptd3[0],ptd3[1],tmpd2); } nehL=appendd2(2,1,ntmpd2,tmpd2,ehL); } if(DrawW==1){ tmpd2[0][0]=0; ntmpd2=0; for(i=0; i<=Ndv; i++){ surffun(ch,Urng[0],Vrng[0]+i*dv,ptd3); ntmpd2=push2(ptd3[0],ptd3[1],tmpd2); } nehL=appendd2(2,1,ntmpd2,tmpd2,ehL); } if(DrawS==1){ tmpd2[0][0]=0; ntmpd2=0; for(i=0; i<=Mdv; i++){ surffun(ch,Urng[0]+i*du,Vrng[0],ptd3); ntmpd2=push2(ptd3[0],ptd3[1],tmpd2); } nehL=appendd2(2,1,ntmpd2,tmpd2,ehL); } return nehL; } void partitionseg(double fig[][2],double gL[][2], int ns, double parL[]){ int ii,jj,kk,n,din[DsizeM][2],din2[DsizeM][2]; double eps0=pow(10,-5.0),tmpd4[4], tmpd6[6],tmp,tmp2; double p[2], q[2], pd3[3], ans[4], tmp1d1[DsizeM], tmp2d1[DsizeM]; double other[DsizeM], g[DsizeM][2], kouL[DsizeS][4],kouL6[DsizeS][6]; if(ns>1){ dataindexd1(Otherpartition,din); other[0]=0; for(ii=din[ns][0]; ii<=din[ns][1]; ii++){ appendd1(other,Otherpartition[ii]); } }else{ other[0]=0; } parL[0]=0; appendd1(parL,1); appendd1(parL,length2(fig)); if(length1(other)>0){ for(ii=1; ii<=length1(other); ii++){ appendd1(parL,other[ii]); } } dataindexd2(2,gL,din); for(n=ns; n<=din[0][0]; n++){ g[0][0]=0; appendd2(2,din[n][0],din[n][1],gL,g); intersectcurvesPp(fig,g,20,kouL6); kouL[0][0]=0; for(ii=1;ii<=length6(kouL6);ii++){ pull6(ii,kouL6,tmpd6); push4(tmpd6[0],tmpd6[1],tmpd6[2],tmpd6[3],kouL); } tmp1d1[0]=0;tmp2d1[0]=0; for(jj=1;jj<=length4(kouL);jj++){ pull4(jj,kouL,tmpd4); tmp=tmpd4[2]; if((tmp>1+Eps)&&(tmp1+Eps)&&(tmp0)&&(n>ns)&&(length1(tmp2d1)>0)){ dataindexd1(Otherpartition,din); tmp1d1[0]=0; for(ii=1;ii<=length2i(din);ii++){ if(ii==n){ for(kk=1;kk<=length1(tmp2d1);kk++){ appendd1(tmp1d1,tmp2d1[kk]); } } for(jj=din[ii][0]; jj<=din[ii][1];jj++){ appendd1(tmp1d1,Otherpartition[jj]); } if(iiEps1){ appendd1(parL,tmp); tmp2=tmp; } } } double funpthiddenQ(short ch,double u, double v, double pa[3]){ double Vec[3]={sin(THETA)*cos(PHI),sin(THETA)*sin(PHI),cos(THETA)}; double eps0=pow(10,-4.0)*(XMAX-XMIN)/10, pt[3], out; surffun(ch,u, v, pt); if((fabs(Vec[1])>eps0)||(fabs(Vec[0])>eps0)){ out=(Vec[1]*(pt[0]-pa[0])-Vec[0]*(pt[1]-pa[1])); } else{ out=pt[0]-pa[0]; } return out; } void makevaltable(double pta[3]){ double eps0=pow(10,-6.0), u, v, du, dv, p[3]; int i, j, nx=0, ny=0; ; du=(Urng[1]-Urng[0])/Mdv; dv=(Vrng[1]-Vrng[0])/Ndv; for(j=0; j<=Ndv; j++){ v=Vrng[0]+j*dv; for(i=0; i<=Mdv; i++){ u=Urng[0]+i*du; Zval[j][i]=funpthiddenQ(Ch,u, v, pta); } } for(i=0; i<=Mdv; i++){ Xval[i]=Urng[0]+i*du; } for(j=0; j<=Ndv; j++){ Yval[j]=Vrng[0]+j*dv; } } int pthiddenQ(short ch,double pta[3], int uveq, double eps[2]){ int i, j, k, out, nqL, nsL, nptL, flg, nxt; double Vec[3]={sin(THETA)*cos(PHI),sin(THETA)*sin(PHI),cos(THETA)}; double eps0, epspt, vec1[3], po[3]={0,0,0}, tmpd1, tmp1d1, tmp2d1, m1, m2; double tmp3d1, tmp4d1, tmp5d1, tmp6d1, tmpd3[3], v1, v2, v3; double tmpd2[2], p1[2], p2[2], ptuv[2], puv1[2], puv2[2]; double p1d3[3], p2d3[3], ptd3[3]; double ptL[DsizeM][6], sL[DsizeM][7], qL[DsizeM][2], pL[5][2], vL[5]; // Out=1 : hidden // SL : List of segments near PtA+Vec eps0=pow(10,-4.0)*(XMAX-XMIN)/10.0; epspt=eps[0]*(XMAX-XMIN)/10.0; out=0; po[0]=0; po[1]=0; po[2]=0; tmpd1=1/dist(3,Vec,po); vec1[0]=tmpd1*Vec[0]; vec1[1]=tmpd1*Vec[1]; vec1[2]=tmpd1*Vec[2]; nptL=0; makevaltable(pta); nsL=0; for(j=0; j<=Ndv-1; j++){ for(i=0; i<=Mdv-1; i++){ pL[0][0]=Xval[i]; pL[0][1]=Yval[j]; vL[0]=Zval[j][i]; pL[1][0]=Xval[i+1]; pL[1][1]=Yval[j]; vL[1]=Zval[j][i+1]; pL[2][0]=Xval[i+1]; pL[2][1]=Yval[j+1]; vL[2]=Zval[j+1][i+1]; pL[3][0]=Xval[i]; pL[3][1]=Yval[j+1]; vL[3]=Zval[j+1][i]; pL[4][0]=Xval[i]; pL[4][1]=Yval[j]; vL[4]=Zval[j][i]; qL[0][0]=0; nqL=0; for(k=0; k<=3; k++){ p1[0]=pL[k][0]; p1[1]=pL[k][1]; p2[0]=pL[k+1][0]; p2[1]=pL[k+1][1]; m1=vL[k]; m2=vL[k+1]; if((m1>=eps0)&&(m2>=eps0)){ continue; } if((m1<=-eps0)&&(m2<=-eps0)){ continue; } if(fabs(m1)-eps0){ if(tmp5d1<-eps0){ nsL++; sL[nsL][0]=p1d3[0]; sL[nsL][1]=p1d3[1]; sL[nsL][2]=p1d3[2]; sL[nsL][3]=p2d3[0]; sL[nsL][4]=p2d3[1]; sL[nsL][5]=p2d3[2]; sL[nsL][6]=-1; } else{ nsL++; sL[nsL][0]=p1d3[0]; sL[nsL][1]=p1d3[1]; sL[nsL][2]=p1d3[2]; sL[nsL][3]=p2d3[0]; sL[nsL][4]=p2d3[1]; sL[nsL][5]=p2d3[2]; sL[nsL][6]=1; } } } v1=vec1[0]; v2=vec1[1]; v3=vec1[2]; if(fabs(v1)>eps0){ m1=pta[2]+v3/v1*(p1d3[0]-pta[0])-p1d3[2]; m2=pta[2]+v3/v1*(p2d3[0]-pta[0])-p2d3[2]; } else if(fabs(v2)>eps0){ m1=pta[2]+v3/v2*(p1d3[1]-pta[1])-p1d3[2]; m2=pta[2]+v3/v2*(p2d3[1]-pta[1])-p2d3[2]; } else{ m1=pta[1]-p1d3[1]; m2=pta[1]-p2d3[1]; } if(m1*m2>=0){ if(((m1>eps0)&&(m2>eps0))||((m1<-eps0)&&(m2<-eps0))){ continue; } if(fabs(m1)<=eps0){ ptd3[0]=p1d3[0]; ptd3[1]=p1d3[1]; ptd3[2]=p1d3[2]; ptuv[0]=puv1[0]; ptuv[1]=puv1[1]; } else{ ptd3[0]=p2d3[0]; ptd3[1]=p2d3[1]; ptd3[2]=p2d3[2]; ptuv[0]=puv2[0]; ptuv[1]=puv2[1]; } } else{ ptd3[0]=1/(m1-m2)*(-m2*p1d3[0]+m1*p2d3[0]); ptd3[1]=1/(m1-m2)*(-m2*p1d3[1]+m1*p2d3[1]); ptd3[2]=1/(m1-m2)*(-m2*p1d3[2]+m1*p2d3[2]); ptuv[0]=1/(m1-m2)*(-m2*puv1[0]+m1*puv2[1]); } tmpd3[0]=ptd3[0]-pta[0]; tmpd3[1]=ptd3[1]-pta[1]; tmpd3[2]=ptd3[2]-pta[2]; tmp1d1=dotprod(3,tmpd3,vec1); tmp2d1=fabs(tmp1d1); tmpd3[0]=p1d3[0]-p2d3[0]; tmpd3[1]=p1d3[1]-p2d3[1]; tmpd3[2]=p1d3[2]-p2d3[2]; tmp3d1=dotprod(3,tmpd3,vec1); tmp4d1=dist(3,p1d3,p2d3); tmp6d1=tmp3d1/tmp4d1; if(tmp1d1>eps0){ if(fabs(tmp6d1)>0.75){ nptL++; ptL[nptL][0]=ptd3[0]; ptL[nptL][1]=ptd3[1]; ptL[nptL][2]=ptd3[2]; ptL[nptL][3]=p2d3[0]; ptL[nptL][4]=p2d3[1]; ptL[nptL][5]=p2d3[2]; continue; } if(tmp2d1>epspt){ return 1; } if(tmp2d1<2*epspt){ continue; } } } } } if(nptL==0){ return 0; } for(i=1; i<=nsL; i++){ p2d3[0]=sL[i][3]; p2d3[1]=sL[i][4]; p2d3[2]=sL[i][5]; flg=0; for(j=1; j<=nsL; j++){ p1d3[0]=sL[j][0]; p1d3[1]=sL[j][1]; p1d3[2]=sL[j][2]; if(dist(3,p1d3,p2d3)0)){ sL[i][6]=-2; } } for(i=1; i<=nptL; i++){ p2d3[0]=ptL[i][3]; p2d3[1]=ptL[i][4]; p2d3[2]=ptL[i][5]; flg=0; for(j=1; j<=nsL; j++){ p1d3[0]=sL[j][0]; p1d3[1]=sL[j][1]; p1d3[2]=sL[j][2]; if(dist(3,p1d3,p2d3)epspt/5){ return 1; } else{ continue; } } nxt=sL[j][6]; while(nxt>0){ ptd3[0]=sL[nxt][3]; ptd3[1]=sL[nxt][4]; ptd3[2]=sL[nxt][5]; nxt=sL[nxt][6]; } if(nxt==-2){ return 1; } else{ out=0; } } return out; } int nohiddenpara2(double paL[], double fk[][3], int uveq, double figkL[][3]){ double eps0=pow(10,-5.0), s, p1[2], p2[2], q[2],tmpd1, tmpd2[2], epstmp[2]; double fh[DsizeM][2], pta[3], ptap[2], vec[3]; double figL[DsizeM][2], tmpmd2[DsizeM][2], tmpmd3[DsizeM][3]; double tmp1d2[2], tmp2d2[2], tmp3d2[2], tmpd3[3],tmpd4[4]; double pd2[2], qd2[2], pd3[3], qd3[3], sp, sq, tp, tq, dtmp, dtmp1, dtmp2; int ncusp=floor(Cusppt[0][0]+0.5), seL[DsizeM], npaL=floor(paL[0]+0.5); int i, n, nfh, nfk, nfigL, nfigkL, nhidden, cspflg, nseL=0, ntmp, flg, tmpi1[DsizeM]; nfk=length3(fk); nfh=projpara(fk, fh); pull2(1,fh,p1); pull2(nfh,fh,p2); cspflg=1; for(i=1; i<=ncusp; i++){ pull2(i, Cusppt, tmpd2); if(dist(2,tmpd2,p1)0){ if(dist(2,pd2,qd2)>Eps1){ nearestptpt(pd2,fh,tmpd4); dtmp1=tmpd4[2]; nearestptpt(qd2,fh,tmpd4); dtmp2=tmpd4[2]; ntmp=partcrv(dtmp1,dtmp2,fh,tmpmd2); nfigL=appendd2(2,1,ntmp,tmpmd2,figL); tp=invparapt(sp,fh,fk,tmpd3); tq=invparapt(sq,fh,fk,tmpd3); ntmp=partcrv3(tp,tq,fk,tmpmd3); nfigkL=appendd3(2,1,ntmp, tmpmd3, figkL); } else{ nfigL=appendd2(2,1,nfh, fh, figL); nfigkL=appendd3(2,1,nfk,fk,figkL); } } tmpi1[0]=0; ntmp=0; for(i=1; i<=npaL-1; i++){ if(memberi(i,seL)==0){ ntmp=appendi1(tmpi1,i); } } copyi(0,ntmp,tmpi1,seL); seL[0]=ntmp; nseL=ntmp; Hiddendata[0][0]=0; nhidden=0; for(i=1; i<=nseL; i++){ dtmp=paL[seL[i]]; pointoncurve(dtmp,fh,Eps,tmp1d2); dtmp=paL[seL[i]+1]; pointoncurve(dtmp,fh,Eps, tmp2d2); if(i==1){ copyd(0,1,tmp1d2,pd2); sp=paL[seL[i]]; copyd(0,1,tmp2d2,qd2); sq=paL[seL[i]+1]; } else{ if(memberi(seL[i]-1,seL)==1){ copyd(0,1,tmp2d2,qd2); sq=paL[seL[i]+1]; } else{ tp=invparapt(sp,fh,fk,tmpd3); tq=invparapt(sq,fh,fk,tmpd3); ntmp=partcrv3(tp,tq,fk,tmpmd3); nhidden=appendd3(2,1,ntmp,tmpmd3,Hiddendata); copyd(0,1,tmp1d2,pd2); sp=paL[seL[i]]; copyd(0,1,tmp2d2,qd2); sq=paL[seL[i]+1]; } } } if(nseL>0){ if(dist(2,pd2,qd2)>Eps1){ tp=invparapt(sp,fh,fk,tmpd3); tq=invparapt(sq,fh,fk,tmpd3); ntmp=partcrv3(tp,tq,fk,tmpmd3); nhidden=appendd3(2,1,ntmp,tmpmd3,Hiddendata); } else{ nhidden=appendd3(2,1,nfk,fk,Hiddendata); } } return nfigkL; } int borderparadata(short ch,double fkL[][3], double fsL[][3]){ double ekL[DsizeL][3], fall[DsizeL][2], fbdxy[DsizeL][2]; double tmpd3[DsizeM][3], tmpd2[DsizeM][2], p[2], p3[3]; double figkL[DsizeM][3], du, dv; int i, j, nall, nekL, nfsL, nfkL=length3(fkL), nfall, nfbdxy; int ndin, din[DsizeS][2], ndin2,din2[DsizeM][2]; int ntmp, ntmpd3,ntmpd2, npar=0, nfigkL; double par[DsizeM]; du=(Urng[1]-Urng[0])/Mdv; dv=(Vrng[1]-Vrng[0])/Ndv; fsL[0][0]=0; ekL[0][0]=0; nekL=0; if(DrawE==1){ tmpd2[0][0]=0; nall=0; for(j=0; j<=Ndv; j++){ nall=add2(tmpd2, Urng[1], Vrng[0]+j*dv); } nall=surfcurve(ch,2, tmpd2,tmpd3); nekL=appendd3(2,1,nall,tmpd3,ekL); } if(DrawN==1){ tmpd2[0][0]=0; nall=0; for(j=0; j<=Mdv; j++){ nall=add2(tmpd2, Urng[0]+j*du, Vrng[1]); } nall=surfcurve(ch,2, tmpd2,tmpd3); nekL=appendd3(2,1,nall,tmpd3,ekL); } if(DrawW==1){ tmpd2[0][0]=0; nall=0; for(j=0; j<=Ndv; j++){ nall=add2(tmpd2, Urng[0], Vrng[0]+j*dv); } nall=surfcurve(ch,2, tmpd2,tmpd3); nekL=appendd3(2,1,nall,tmpd3,ekL); } if(DrawS==1){ tmpd2[0][0]=0; nall=0; for(j=0; j<=Mdv; j++){ nall=add2(tmpd2, Urng[0]+j*du, Vrng[0]); } nall=surfcurve(ch,2, tmpd2,tmpd3); nekL=appendd3(2,1,nall,tmpd3,ekL); } if(nekL>0){ nfkL=appendd3(2,1,nekL,ekL,fkL); } nfall=projpara(fkL,fall); nfbdxy=makexybdy(ch,fbdxy); ndin=dataindexd2(2,fall,din); Borderpt[0][0]=0; Otherpartition[0]=0; for(i=1; i<=ndin-1; i++){ Otherpartition[i]=Inf; Otherpartition[0]++; } Borderhiddendata[0][0]=0; ndin2=dataindexd3(2,fkL,din2); for(i=1; i<= ndin2; i++){ tmpd3[0][0]=0; ntmpd3=appendd3(0,din2[i][0],din2[i][1],fkL,tmpd3); ntmpd2=projpara(tmpd3,tmpd2); partitionseg(tmpd2,fall, 1,par); if(length1(par)>2){ ntmp=npar-1; tmpd2[0][0]=0; ntmpd2=0; for(j=2; j<=ntmp; j++){ pull2(j,Partitionpt,p); ntmpd2=addptd2(tmpd2, p); } ntmp=appendd2(0, 1,ntmpd2,tmpd2,Borderpt); } tmpd3[0][0]=0; for(j=din2[i][0]; j<=din2[i][1]; j++){ pull3(j,fkL,p3); ntmpd3=addptd3(tmpd3,p3); } nfigkL=nohiddenpara2(par,tmpd3,1, figkL); if(nfigkL>0){ nfsL=appendd3(2,1,nfigkL,figkL, fsL); } ntmp=length3(Hiddendata); if(ntmp>0){ appendd3(2,1,ntmp,Hiddendata,Borderhiddendata); } } return nfsL; } int dropnumlistcrv3(double qd[][3], double eps1, int out[]){ int i,j,k,nout,nall=length3(qd), nd, se, en, npd, nptL; int din[DsizeM][2],ptL[DsizeL]; double eps=pow(10.0,-6.0), pd[DsizeL][3], p[3], tmp2d[3]; out[0]=0; nout=0; nd=dataindexd3(2,qd,din); for(j=1; j<=nd; j++){ se=din[j][0]; en=din[j][1]; pd[0][0]=0; npd=0; npd=appendd3(0,se,en,qd,pd); ptL[0]=0; nptL=0; nptL=appendi1(ptL,1); pull3(1,pd,p); for(k=2; k<=npd-1; k++){ pull3(k,pd,tmp2d); if(dist(3,p,tmp2d)>eps1){ nptL=appendi1(ptL,k); pull3(k,pd,p); } } pull3(npd-1,pd,p); pull3(npd,pd,tmp2d); if(dist(3,p,tmp2d)>eps){ // eps -> eps1 ? nptL=appendi1(ptL,npd); } // if(nptL==1){ptL[0]=0; nptL=0;}//180318db if(nout>0){ nout=appendi1(out,Infint); } for(i=1; i<=nptL; i++){ nout=appendi1(out,ptL[i]); } } out[0]=nout; return nout; } int sfbdparadata(short ch,double outd3[][3]){ double pdatad3[DsizeL][3]; double pts[DsizeL][2],out3md[DsizeL][2],eps; double tmpmd[DsizeL][2],tmp1md[DsizeL][2],tmp2md[DsizeL][2],tmp3md[DsizeL][2]; double tmpd[2],tmp1d[2],tmpd3[3],tmp1d3[3],tmp2d3[3],tmp2md3[DsizeL][3]; int din[DsizeS][2],nlist[DsizeL]; int ii,jj,kk,n,nall,flg; envelopedata(ch, tmp3md); out3md[0][0]=0; pts[0][0]=0; dataindexd2(2,tmp3md,din); for(jj=1;jj<=length2i(din);jj++){ tmp1md[0][0]=0; tmp2md3[0][0]=0; for(kk=din[jj][0];kk<=din[jj][1];kk++){ pull2(kk,tmp3md,tmpd); addptd2(tmp1md,tmpd); surffun(ch,tmpd[0],tmpd[1],tmpd3); addptd3(tmp2md3,tmpd3); } dropnumlistcrv3(tmp2md3,Eps1,nlist); if(nlist[0]==1){ pull2(nlist[1],tmp1md,tmpd); addptd2(pts,tmpd); }else{ tmpmd[0][0]=0; for(kk=1;kk<=nlist[0];kk++){ pull2(nlist[kk],tmp1md,tmpd); addptd2(tmpmd,tmpd); } if(length2(tmpmd)>0){ appendd2(2,1,length2(tmpmd),tmpmd,out3md); } } } tmp3md[0][0]=0; appendd2(2,1,length2(pts),pts,tmp3md); pts[0][0]=0; for(ii=1;ii<=length2(tmp3md);ii++){ pull2(ii,tmp3md,tmpd); surffun(ch,tmpd[0],tmpd[1],tmp1d3); flg=0; for(jj=1;jj<=length2(pts);jj++){ pull2(jj,pts,tmpd); surffun(ch,tmpd[0],tmpd[1],tmp2d3); if(dist(3,tmp1d3,tmp2d3)dist(3,tmp1d3,tmpd3)){ eps=dist(3,tmp1d3,tmpd3); } } pull2(1,tmp2md,tmpd); surffun(ch,tmpd[0],tmpd[1],tmpd3); if(dist(3,tmp1d3,tmpd3)eps0)||(fabs(vec[0])>eps0)){ Zval[j][i]=(vec[1]*(pt[0]-pa[0])-vec[0]*(pt[1]-pa[1])); } else{ Zval[j][i]=pt[0]-pa[0]; } } } for(i=0; i<=Mdv; i++){ Xval[i]=Urng[0]+i*du; } for(j=0; j<=Ndv; j++){ Yval[j]=Vrng[0]+j*dv; } } int meetpoints(short ch,double pta[3], double ptb[3], double eps, double ptL[][3]){ double eps0=pow(10,-4.0), vec[3], out[DsizeM], pL[5][2], vL[5]; double qL[DsizeM][2], p1d2[2], p2d2[2], tmpd2[2], puv1d2[2], puv2d2[2]; double m1,m2, p1d3[3], p2d3[3], v1, v2, v3, ptd3[3], ptuvd2[2], tmp1d1; double po[3]={0,0,0}, tmpmd1[DsizeM], tmp1d3[3]; int nout, nptL, ntmp, nqL, i, j, k; vec[0]=ptb[0]-pta[0]; vec[1]=ptb[1]-pta[1]; vec[2]=ptb[2]-pta[2]; out[0]=0; nout=0; ptL[0][0]=0; nptL=0; makevaltablemeet(Ch,pta,vec,eps0); for(j=0; j<=Ndv-2; j++){ for(i=0; i<=Mdv-2; i++){ pL[0][0]=Xval[i]; pL[0][1]=Yval[j]; vL[0]=Zval[j][i]; pL[1][0]=Xval[i+1]; pL[1][1]=Yval[j]; vL[1]=Zval[j][i+1]; pL[2][0]=Xval[i+1]; pL[2][1]=Yval[j+1]; vL[2]=Zval[j+1][i+1]; pL[3][0]=Xval[i]; pL[3][1]=Yval[j+1]; vL[3]=Zval[j+1][i]; pL[4][0]=Xval[i]; pL[4][1]=Yval[j]; vL[4]=Zval[j][i]; qL[0][0]=0; nqL=0; for(k=0; k<=3; k++){ pull2(k,pL,p1d2); pull2(k+1,pL,p2d2); m1=vL[k]; m2=vL[k+1]; if((m1>=eps0)&&(m2>=eps0)){ continue; } if((m1<=-eps0)&&(m2<=-eps0)){ continue; } if(fabs(m1)eps0){ m1=pta[2]+v3/v1*(p1d3[0]-pta[0])-p1d3[2]; m2=pta[2]+v3/v1*(p2d3[0]-pta[0])-p2d3[2]; } else if(fabs(v2)>eps0){ m1=pta[2]+v3/v2*(p1d3[1]-pta[1])-p1d3[2]; m2=pta[2]+v3/v2*(p2d3[1]-pta[1])-p2d3[2]; } else{ m1=pta[1]-p1d3[1]; m2=pta[1]-p2d3[1]; } if(m1*m2>=-eps0){ if(((m1>eps0)&&(m2>eps0)) || ((m1<-eps0)&&(m2<-eps0))){ continue; } if(fabs(m1)<=eps0){ copyd(0,2,p1d3,ptd3); copyd(0,1,puv1d2,ptuvd2); } else{ copyd(0,2,p2d3,ptd3); copyd(0,1,puv2d2,ptuvd2); } } else{ ptd3[0]=1/(m1-m2)*(-m2*p1d3[0]+m1*p2d3[0]); ptd3[1]=1/(m1-m2)*(-m2*p1d3[1]+m1*p2d3[1]); ptd3[2]=1/(m1-m2)*(-m2*p1d3[2]+m1*p2d3[2]); } tmp1d3[0]=ptd3[0]-pta[0]; tmp1d3[1]=ptd3[1]-pta[1]; tmp1d3[2]=ptd3[2]-pta[2]; tmp1d1=dotprod(3,tmp1d3,vec); tmp1d1=tmp1d1/pow(dist(3,vec,po),2.0); if((tmp1d1>-eps0)&&(tmp1d1<1+eps0)){ nout=appendd1(out,tmp1d1); } } } } if(nout>>0){ simplesort(out); tmpmd1[1]=out[1]; ntmp=1; for(i=2; i<=nout; i++){ tmp1d3[0]=(out[i]-tmpmd1[ntmp])*vec[0]; tmp1d3[1]=(out[i]-tmpmd1[ntmp])*vec[1]; tmp1d3[2]=(out[i]-tmpmd1[ntmp])*vec[2]; tmp1d1=dist(3,tmp1d3,po); if(tmp1d1>eps){ ntmp=appendd1(tmpmd1,out[i]); } } nout=ntmp; copyd(0,ntmp,tmpmd1,out); for(i=1; i<=nout; i++){ tmp1d3[0]=pta[0]+out[i]*vec[0]; tmp1d3[1]=pta[1]+out[i]*vec[1]; tmp1d3[2]=pta[2]+out[i]*vec[2]; nptL=addptd3(ptL,tmp1d3); } } return nptL; } int crvsfparadata(double fkL[][3], double fbdkL[][3], int sepflg, double out[][3]){ double fbdy[DsizeL][2], fk[DsizeM][3],fkp[DsizeM][3], outh[DsizeL][3]; double fh[DsizeM][2], parL[DsizeM], tmpmd3[DsizeM][3]; double ptL[DsizeM][3], tmpd2[2], tmpd3[3], tmp1d1, tmp2d1, dt; double po[2]={0,0}, epsd2[2]={Eps1,1}, pa[3], pb[3]; int nbor=length3(Borderhiddendata), nfkL,nfbdkL, nfbdy, nfk, nall; int ncshidden, npar, ndin, din[DsizeM][2], ndin2,din2[DsizeS][2]; int nn, i, j, k, n, nptL, nout; nfkL=length3(fkL); nfbdy=projpara(fbdkL,fbdy); out[0][0]=0; outh[0][0]=0; ndin=dataindexd3(2,fkL,din); for(nn=1; nn<=ndin; nn++){ fkp[0][0]=0; nfk=appendd3(0,din[nn][0],din[nn][1],fkL,fkp); n=fmax(1,floor((fmax(Mdv,Ndv)+1)/(nfk-1)+0.5)); //17.06.16 dt=1.0/n; fk[0][0]=0; for(i=1; i=0){ for(i=1; i<=nfk-1; i++){ pull3(i,fk,pa); pull3(i+1,fk,pb); nptL=meetpoints(Ch,pa,pb, Eps2,ptL); for(j=1; j<=nptL; j++){ pull3(j,ptL,tmpd3); parapt(tmpd3,tmpd2); tmp1d1=paramoncurve(tmpd2,i,fh); tmp2d1=Inf; for(k=1; k<=npar; k++){ tmp2d1=fmin(tmp2d1,fabs(parL[k]-tmp1d1)); } tmpd3[0]=pb[0]-pa[0]; tmpd3[1]=pb[1]-pa[1]; tmpd3[2]=pb[2]-pa[2]; if(tmp2d1*dist(3,tmpd3,po)>Eps1){ npar=appendd1(parL,tmp1d1); } } simplesort(parL); } } nohiddenpara2(parL,fk,1, tmpmd3); appendd3(2,1,length3(tmpmd3),tmpmd3,out); appendd3(2,1, length3(Hiddendata),Hiddendata,outh); } push3(Inf,3,0,out); //17.06.17 nout=appendd3(0,1,length3(outh),outh,out); push3(Inf,3,0,out); //17.06.17 return nout; } int wireparadata(double bdyk[][3], double udv[], double vdv[], int num, double fsL[][3]){ double fbdy[DsizeL][2], udiv[DsizeM], vdiv[DsizeM], fbdxy[DsizeM][2]; double fs[DsizeL][3], u, v, d, pdata[DsizeM][3], fkL[DsizeM][3]; double fsLh[DsizeLL][3]; double tmpmd2[DsizeM][2], fk[DsizeM][3], par[DsizeM], p[2]; int nfbdy, nd, i, j, k, n, nu, nv, nfbdxy, nfsL, npdata, nfkL, nfk, npar,ntmp; int nwire, ndin, din[DsizeM][2], nfs, ndin2, din2[DsizeM][2]; nfbdy=projpara(bdyk, fbdy); Wirept[0][0]=0; udiv[0]=0; nu=0; vdiv[0]=0; nv=0; n=floor(udv[0]+0.5); if(n==-1){ nd=floor(udv[1]+0.5); d=(Urng[1]-Urng[0])/(nd+1); for(i=1; i<=nd; i++){ u=Urng[0]+i*d; nu=appendd1(udiv,u); } } else{ for(i=1; i<=n; i++){ nu=appendd1(udiv,udv[i]); } } n=floor(vdv[0]+0.5); if(n==-1){ nd=floor(vdv[1]+0.5); d=(Vrng[1]-Vrng[0])/(nd+1); for(i=1; i<=nd; i++){ v=Vrng[0]+i*d; nv=appendd1(vdiv,v); } } else{ for(i=1; i<=n; i++){ nv=appendd1(vdiv,vdv[i]); } } nfbdxy=makexybdy(Ch,fbdxy); Wirept[0][0]=0; fsL[0][0]=0; nfsL=0; fsLh[0][0]=0; for(i=1; i<=nu; i++){ u=udiv[i]; d=(Vrng[1]-Vrng[0])/(num*Ndv); tmpmd2[0][0]=0; ntmp=0; for(j=1;j<=(num*Ndv)+1; j++){ v=Vrng[0]+(j-1)*d; p[0]=u; p[1]=v; ntmp=addptd2(tmpmd2,p); } nfkL=cuspsplitpara(Ch,tmpmd2, fkL); ndin=dataindexd3(2,fkL,din); for(j=1; j<=ndin; j++){ fk[0][0]=0; nfk=appendd3(0, din[j][0], din[j][1], fkL,fk); ntmp=projpara(fk,tmpmd2); partitionseg(tmpmd2, fbdy, 1, par); ntmp=length2(Partitionpt); if(ntmp>2){ for(k=2; k<=ntmp; k++){ pull2(k, Partitionpt, p); nwire=addptd3(Wirept,p); } } nfs=nohiddenpara2(par,fk,1, fs); n=length3(Hiddendata); ntmp=appendd3(2,1,n, Hiddendata,fsLh); nfsL=appendd3(2,1,nfs,fs,fsL); } } for(i=1; i<= nv; i++){ v=vdiv[i]; d=(Urng[1]-Urng[0])/(num*Mdv); tmpmd2[0][0]=0; ntmp=0; for(j=1;j<=(num*Mdv)+1; j++){ u=Urng[0]+(j-1)*d; p[0]=u; p[1]=v; ntmp=addptd2(tmpmd2,p); } nfkL=cuspsplitpara(Ch,tmpmd2, fkL); ndin=dataindexd3(2,fkL,din); for(j=1; j<=ndin; j++){ fk[0][0]=0; nfk=appendd3(0, din[j][0], din[j][1], fkL,fk); ntmp=projpara(fk,tmpmd2); partitionseg(tmpmd2, fbdy, 1, par); ntmp=length2(Partitionpt); if(ntmp>2){ for(k=2; k<=ntmp; k++){ pull2(k, Partitionpt, p); nwire=addptd3(Wirept,p); } } nohiddenpara2(par,fk,1, fs); appendd3(2,1,length3(Hiddendata), Hiddendata,fsLh); appendd3(2,1,length3(fs),fs,fsL); } } push3(Inf,3,0,fsL); nfsL=appendd3(0,1,length3(fsLh),fsLh,fsL); push3(Inf,3,0,fsL); return nfsL; } /* double cutfun(int ch, double u, double v){ double p[3],val ; surffun(ch,u,v,p); val=p[0]+p[1]-0.5; return val; } */ void makevaltablecut(int chcut){ double eps0=pow(10,-6.0), u, v, du, dv; int i, j, nx=0, ny=0; ; du=(Urng[1]-Urng[0])/Mdv; dv=(Vrng[1]-Vrng[0])/Ndv; for(j=0; j<=Ndv; j++){ v=Vrng[0]+j*dv; for(i=0; i<=Mdv; i++){ u=Urng[0]+i*du; Zval[j][i]=cutfun(Ch,chcut, u,v); } } for(i=0; i<=Mdv; i++){ Xval[i]=Urng[0]+i*du; } for(j=0; j<=Ndv; j++){ Yval[j]=Vrng[0]+j*dv; } } int sfcutdata(int ch, double ekL[][3]){ double cutuvL[DsizeL][2], out1[DsizeM][2], out2[DsizeM][3], pt[3]; int i, j, nall, ndin, din[DsizeM][2], nekL,nout1,nout2; // makevaltablecut(ch); //180320 // nall=implicitplot(cutuvL); //180320 ekL[0][0]=0; nekL=0; ndin=dataindexd2(2,cutuvL,din); for(i=1; i<=ndin; i++){ out1[0][0]=0; nout1=appendd2(2,din[i][0],din[i][1],cutuvL,out1); out2[0][0]=0; for(j=1; j<=nout1; j++){ surffun(ch,out1[j][0], out1[j][1], pt); nout2=addptd3(out2,pt); } nekL=appendd3(2,1,nout2,out2,ekL); } return nekL; } int crv3onsfparadata(double fk[][3], double fbdyd3[][3], double out[][3]){ double fbdy[DsizeL][2], fh[DsizeL][2], tmpmd2[DsizeL][2], par[DsizeM]; int n, nall, nfbdy, nfbdxy, npar, nout; out[0][0]=0; nfbdy=projpara(fbdyd3,fbdy); // nall=ospline3(2,fk,2,fk1); projpara(fk,fh); partitionseg(fh,fbdy, 1, par); nohiddenpara2(par,fk, 1,out); push3(Inf,3,0,out); nall=appendd3(0,1,length3(Hiddendata),Hiddendata,out); push3(Inf,3,0,out); //17.06.16 return nall; } int projcoordcurve(double curve[][3], double out[][3]){ double SP=sin(PHI), CP=cos(PHI), ST=sin(THETA), CT=cos(THETA); double pt[3], xz, yz, zz; int i, n, nall; out[0][0]=0; n=length3(curve); for(i=1; i<=n; i++){ pull3(i, curve, pt); if(pt[0]>Inf-1){ xz=pt[0]; yz=pt[1]; zz=pt[2]; } else{ xz=-pt[0]*SP+pt[1]*CP; yz=-pt[0]*CP*CT-pt[1]*SP*CT+pt[2]*ST; zz=pt[0]*CP*ST+pt[1]*SP*ST+pt[2]*CT; } nall=push3(xz,yz,zz,out); } return nall; } int kukannozoku(double jokyo[2], double kukanL[][2], double res[][2]){ double t1, t2, tmpd2[2], ku[2]; int i, j, ii, nn, flg, nres; nn=length2(kukanL); t1=jokyo[0]; t2=jokyo[1]; pull2(1,kukanL,tmpd2); t1=fmax(t1,tmpd2[0]); pull2(nn,kukanL,tmpd2); t2=fmin(t2,tmpd2[1]); res[0][0]=0; nres=0; flg=0; for(ii=1; ii<=nn; ii++){ pull2(ii,kukanL,ku); if(flg==0){ if(ku[1]t2+Eps){ tmpd2[0]=t2; tmpd2[1]=ku[1]; nres=addptd2(res,tmpd2); } } } else if(flg==1){ if(ku[1]0){ koc[0][0]=0; nkoc=0; pull2(1,plt2d,pta); pull2(length2(plt2d),plt2d,ptb); for(j=1; j<=nkoc2; j++){ pt[0]=koc2[j][0]; pt[1]=koc2[j][1]; nearestptpt(pt, plt2d, tmpd4); koc2[j][3]=tmpd4[2]; pt[0]=tmpd4[0]; pt[1]=tmpd4[1]; nearestptpt(pt, obj2d, tmpd4); koc2[j][0]=tmpd4[0]; koc2[j][1]=tmpd4[1]; koc2[j][2]=tmpd4[2]; ds[j]=tmpd4[3]; } pull4(1,koc2,tmp1d4); dmin=ds[1]; for(j=2; j<=nkoc2; j++){ if(fabs(koc2[j][2]-tmp1d4[2])<4){ if(ds[j]0.9*length2(plt2d))){ continue; } pull4(j,koc2,tmpd4); nkoc=addptd4(koc,tmpd4); } } */ for(jj=1; jj<=nkoc; jj++){ pt[0]=koc[jj][0]; pt[1]=koc[jj][1]; pta[0]=plt2d[1][0]; pta[1]=plt2d[1][1]; ptb[0]=plt2d[length2(plt2d)][0]; ptb[1]=plt2d[length2(plt2d)][1]; if((dist(2,pt,pta)0.7*length2(plt2d))){ continue; } nn1=floor(koc[jj][2]); nn2=koc[jj][3]; pta[0]=objp[nn1][0]; pta[1]=objp[nn1][1]; za=objp[nn1][2]; ptb[0]=objp[nn1+1][0]; ptb[1]=objp[nn1+1][1]; zb=objp[nn1+1][2]; if(dist(2,pta,ptb)pow(Eps,2.0)){ pts1[0][0]=0; pointoncurve(nn1,obj2d,Eps,tmp1d2); addptd2(pts1,tmp1d2); pointoncurve(nn1+1,obj2d,Eps,tmp1d2); addptd2(pts1,tmp1d2); tmp1d2[0]=pts1[2][0]-pts1[1][0]; tmp1d2[1]=pts1[2][1]-pts1[1][1]; tmp2d2[0]=ptb[0]-pta[0]; tmp2d2[1]=ptb[1]-pta[1]; tmp3d1=dotprod(2,tmp1d2,tmp2d2); origin[0]=0; origin[1]=0; tmp3d1=tmp3d1/dist(2,tmp1d2,origin)/dist(2,tmp2d2,origin); tmpd1=1-0.5*pow(tmp3d1,2.0); r0=0.075*r00; nclipL=push5(pt[0],pt[1], nn1,t1,r0/tmpd1, clipL); } } } } kukanL[0][0]=0; te=length3(obj); push2(1.0,te, kukanL); for(ii=1; ii<=nclipL; ii++){ pt[0]=clipL[ii][0]; pt[1]=clipL[ii][1]; nn=clipL[ii][2]; tt=nn+clipL[ii][3]; rr=clipL[ii][4]; flg=0; for(jj=nn; jj>=1; jj--){ pointoncurve(jj,obj2d,Eps,ptq); if(dist(2,pt,ptq)Eps){ pointoncurve(t2,obj2d,Eps,tmp1d2); addptd2(ptL2,tmp1d2); invparapt(t2, obj2d, obj, tmpd3); addptd3(ptL,tmpd3); } if(length2(ptL2)>1){ appendd2(2,1,length2(ptL2),ptL2,allres2); appendd3(2,1,length3(ptL),ptL,allres); } } } return length3(allres); } /* void writesfbd(const char *var, const char *fname, const char *fnameh,double sf[][3]){ sfbdparadata(sf); output3(var, "", fname,2,sf); output3(var, "h", fnameh,2,Borderhiddendata); } void writecrv(const char *var, const char *fname, const char *fnameh, double crv[][3],double sf[][3]){ crvsfparadata(crv, sf, 1,Crvdata); output3(var, "", fname,2,Crvdata); output3(var, "h", fnameh,2,Crvsfhiddendata); } void writewire(const char *var, const char *fname, const char *fnameh, double sf[][3], int num, double udv[], double vdv[]){ wireparadata(sf, num, udv,vdv, Wiredata); output3(var, "", fname,2,Wiredata); output3(var, "h", fnameh,2,Hiddenwiredata); } void writesfcut(const char *var, const char *fname, const char *fnameh, double crv[][3], double sf[][3]){ sfcutdata(crv); crv3onsfparadata(crv, sf, Crvonsfdata); output3(var, "", fname,2,Crvonsfdata); output3(var, "h", fnameh,2,Crv3onsfhiddendata); } void writecrvonsf(const char *var, const char *fname, const char *fnameh, double crv[][3],double sf[][3]){ crv3onsfparadata(crv, sf, Crvonsfdata); output3(var, "", fname,2,Crvonsfdata); output3(var, "h", fnameh,2,Crv3onsfhiddendata); } */