// 180430
// crv2sfparadata,wireparadata added
// output3h,output3 chanded
// 180426 readdataC,writedataC changed
// 180420 newly rewrited
// 170616 crvsfparadata changed ( num of devision )
int output3(short head, const char *wa,const char *var, const char *fname,double out[][3]){
int din[DsizeS][2],i,j,ctr;
double tmpd[3];
FILE *fp;
fp=fopen(fname,wa);
if (fp == NULL) {
printf("cannot open\n");
return -1;
}
dataindexd3(2, out,din);
if(head==1){
fprintf(fp,"%s//\n",var);
}
for(i=1; i<=length2i(din); 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;
if(j<din[i][1]){
fprintf(fp,"[");
}
}else{
if(j<din[i][1]){
fprintf(fp,",");
}else{
fprintf(fp,"]//\n");
}
}
}
fprintf(fp,"end//\n");
}
fclose(fp);
return 0;
}
int output3h(const char *wa,const char *var, const char *varh, const char *fname, double out[][3]){
// 17.06.09
double out1[DsizeLL][3], tmpd[3];
int din1[DsizeM][2],din2[DsizeM][2], i, j,ctr;
FILE *fp;
fp=fopen(fname,wa);
if (fp == NULL) {
printf("cannot open\n");
return -1;
}
dataindexd3(3,out,din1);
out1[0][0]=0;
appendd3(0, din1[1][0],din1[1][1],out,out1);
dataindexd3(2, out1,din2);
fprintf(fp,"%s//\n",var);
for(i=1; i<=length2i(din2); i++){
fprintf(fp,"start//\n");
fprintf(fp,"[");
ctr=0;
for(j=din2[i][0]; j<=din2[i][1]; j++){
pull3(j,out1,tmpd);
fprintf(fp,"[ %7.5f, %7.5f, %7.5f]",tmpd[0],tmpd[1],tmpd[2]);
ctr++;
if(ctr==5){
if(j<din2[i][1]){
fprintf(fp,"]//\n[");
ctr=0;
}
}else{
if(j<din2[i][1]){
fprintf(fp,",");
}
}
}
fprintf(fp,"]//\n");
fprintf(fp,"end//\n");
}
out1[0][0]=0;
fprintf(fp,"%s//\n",varh); //17.06.16from
if(din1[0][0]>1){ //180613from
appendd3(0, din1[2][0],din1[2][1],out,out1);
}//180613to
dataindexd3(2, out1,din2);
for(i=1; i<=length2i(din2); i++){
fprintf(fp,"start//\n");
fprintf(fp,"[");
ctr=0; //181105
for(j=din2[i][0]; j<=din2[i][1]; j++){
pull3(j,out1,tmpd);
fprintf(fp,"[ %7.5f, %7.5f, %7.5f]",tmpd[0],tmpd[1],tmpd[2]);
ctr++;
if(ctr==5){
if(j<din2[i][1]){
fprintf(fp,"]//\n[");
ctr=0;
}
}else{
if(j<din2[i][1]){
fprintf(fp,",");
}
}
}
fprintf(fp,"]//\n");
fprintf(fp,"end//\n");
}
// fprintf(fp,"//\n"); //180531
fclose(fp);
return 0;
}
void outputend(const char *fname){
FILE *fp;
fp=fopen(fname,"a");
fprintf(fp,"//\n");
fclose(fp);
}
int writedataC(const char *fname, double out[][3]){
int i, nall;
FILE *fp;
nall=length3(out);
fp=fopen(fname,"w");
for(i=1; i<=nall; i++){
fprintf(fp,"%7.5f %7.5f %7.5f %6s",out[i][0],out[i][1],out[i][2],"-99999");
if(i<nall){
fprintf(fp,"\n");
};
}
fclose(fp);
return nall;
}
int readdataC(const char *fname, double data[][3]){
int i, j, ndata=0;
double tmpd4[4];
FILE *fp;
fp=fopen(fname,"r");
if(fp==NULL){
printf("file not found\n");
return 1;
}
data[0][0]=0;
while( ! feof(fp) && ndata<DsizeL){
for(j=0;j<=3;j++){
fscanf(fp,"%lf",&tmpd4[j]);
}
push3(tmpd4[0],tmpd4[1],tmpd4[2],data);
}
fclose(fp);
return length3(data);
}
void parapt(double pt3[3],double pt2[2]){
if(fabs(pt3[0])>Inf-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);
}
}
double zparapt(double p[3]){
double x=p[0], y=p[1], z=p[2], out;
out=x*cos(PHI)*sin(THETA)+y*sin(PHI)*sin(THETA)+z*cos(THETA);
return out;
}
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;
}
void surfcurve(short ch,double crv[][2], double pdata[][3]){
double pd2[2], pt[3];
int i;
pdata[0][0]=0;
for(i=1; i<=length2(crv); i++){
pull2(i,crv,pd2);
surffun(ch,pd2[0],pd2[1],pt);
addptd3(pdata,pt);
}
}
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(u1<Urng[0]){u1=Urng[0];}
if(u2>Urng[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(v1<Vrng[0]){v1=Vrng[0];}
if(v2>Vrng[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])/Ndv; //180427
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 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)<Eps1){cflg=1;}
ncusp=0; cusp[0]=0;
cva=cos(10*M_PI/180);
for(i=1; i<=nph-1; i++){
if(nph==2){break;}
pull2(i,pth,tmp);
tmp[0]=pth[i][0]; tmp[1]=pth[i][1];
if(i==1){
if(cflg==0){continue;}
pull2(nph-1,pth,tmp1);
}
else{
pull2(i-1,pth,tmp1);
}
pull2(i+1,pth,tmp2);
v1[0]=tmp[0]-tmp1[0]; v1[1]=tmp[1]-tmp1[1];
v2[0]=tmp2[0]-tmp[0]; v2[1]=tmp2[1]-tmp[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));
cuspflg=0;
if(vtmp<cva){
pt2d[0]=pth[i][0]; pt2d[1]=pth[i][1];
kaku=acos(vtmp)*180/M_PI;
if(v1[0]*v2[1]-v1[1]*v2[0]<0){
kaku=-kaku;
}
cuspflg=0;
for(j=i+1; j<=nph-1; j++){
if(fabs(kaku)>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(ntmp,cusp);
}
else{
ncusp=appendi1(ntmp,cusp);
}
}
}
}
if(cflg==0){
ncusp=prependi1(1,cusp);
ncusp=appendi1(nph,cusp);
}
else if(ncusp==0){
ncusp=prependi1(1,cusp);
ncusp=appendi1(nph,cusp);
}
else if(cusp[1]==1){
ncusp=appendi1(nph,cusp);
}
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(nph,cusp);
}
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(drop[j],tmpnum);
}
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];
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>0){
dataindexd1(Otherpartition,din);
other[0]=0;
for(ii=din[ns][0]; ii<=din[ns][1]; ii++){
appendd1(Otherpartition[ii],other);
}
}else{
other[0]=0;
}
parL[0]=0;
appendd1(1,parL);
appendd1(length2(fig),parL);
if(length1(other)>0){
for(ii=1; ii<=length1(other); ii++){
appendd1(other[ii],parL);
}
}
dataindexd2(2,gL,din);
for(n=fmax(ns,1); 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)&&(tmp<length2(fig)-Eps)){
appendd1(tmp,tmp1d1);
}
tmp=tmpd4[3];
if((tmp>1+Eps)&&(tmp<length2(g)-Eps)){
appendd1(tmp,tmp2d1);
}
}
for(jj=1;jj<=length1(tmp1d1);jj++){
appendd1(tmp1d1[jj],parL);
}
if((ns>0)&&(n>ns)&&(length1(tmp2d1)>0)){
dataindexd1(Otherpartition,din);
tmp1d1[0]=0;
for(jj=din[n][0];jj<=din[n][1];jj++){
appendd1(Otherpartition[jj],tmp1d1);
}
replacelistd1(n,Otherpartition,tmp2d1);
}
}
simplesort(parL);
tmp1d1[0]=0;
for(ii=1;ii<=length1(parL);ii++){
appendd1(parL[ii],tmp1d1);
}
parL[0]=0;
tmp2=-1;
for(jj=1;jj<=length1(tmp1d1);jj++){
tmp=tmp1d1[jj];
if(fabs(tmp-tmp2)>Eps1){
appendd1(tmp,parL);
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;
}
int pthiddenQ(short ch,double pta[3], int uveq,double out[4]){
int i, j, k;
double Vec[3]={sin(THETA)*cos(PHI),sin(THETA)*sin(PHI),cos(THETA)};
double v1,v2,v3;
double du=(Urng[1]-Urng[0])/Mdv, dv=(Vrng[1]-Vrng[0])/Ndv;
double uval1,uval2,vval1,vval2,eval11,eval12,eval21,eval22;
double pl[5][2], vl[5], ql[11][2],p1[2],p2[2],m1,m2;
double ptuv[2], puv1[2], puv2[2],p1d3[3], p2d3[3], ptd3[3];
double tmpd1, tmpd2[2],tmpd3[3],tmp1d3[3];
// Out=1 : hidden
// SL : List of segments near PtA+Vec
out[3]=-Inf;
for(j=0; j<=Ndv-1; j++){
vval1=Vrng[0]+j*dv;
vval2=Vrng[0]+(j+1)*dv;
uval1=Urng[0];
eval11=funpthiddenQ(ch,uval1,vval1,pta);
eval12=funpthiddenQ(ch,uval1,vval2,pta);
for(i=0; i<=Mdv-1; i++){
uval2=Urng[0]+(i+1)*du;
eval21=funpthiddenQ(ch,uval2,vval1,pta);
eval22=funpthiddenQ(ch,uval2,vval2,pta);
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;
ql[0][0]=0;
for(k=0; k<=3; k++){
pull2(k,pl,p1);
pull2(k+1,pl,p2);
m1=vl[k]; m2=vl[k+1];
if(fabs(m1)<Eps){
addptd2(ql, p1);
continue;
}
if(fabs(m2)<Eps){
continue;
}
if((m1>0)&&(m2>0)){
continue;
}
if((m1< 0)&&(m2< 0)){
continue;
}
tmpd2[0]=1/(m1-m2)*(-m2*p1[0]+m1*p2[0]);
tmpd2[1]=1/(m1-m2)*(-m2*p1[1]+m1*p2[1]);
addptd2(ql, tmpd2);
}
uval1=uval2;
eval11=eval21;
eval12=eval22;
if(length2(ql)==2){
puv1[0]=ql[1][0]; puv1[1]=ql[1][1];
puv2[0]=ql[2][0]; puv2[1]=ql[2][1];
surffun(ch,puv1[0],puv1[1],p1d3);
surffun(ch,puv2[0],puv2[1],p2d3);
v1=Vec[0]; v2=Vec[1]; v3=Vec[2];
if(fabs(v1)>Eps){
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)>Eps){
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[2];
}
if(m1*m2>= 0){
if(((m1>0) && (m2>0)) || ((m1< 0) && (m2< 0))){
continue;
}
if(m1==0){
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[0]);
ptuv[1]=1/(m1-m2)*(-m2*puv1[1]+m1*puv2[1]);
}
tmpd3[0]=ptd3[0]-pta[0];
tmpd3[1]=ptd3[1]-pta[1];
tmpd3[2]=ptd3[2]-pta[2];
crossprod(3,tmpd3,Vec, tmp1d3);
if(norm(3,tmp1d3)<Eps1){
tmpd1=zparapt(ptd3)-zparapt(pta)-Eps2;
if(tmpd1>0){
copyd(0,2,ptd3,out); out[3]=tmpd1;
return 1;
}else{
if(tmpd1>out[3]){
copyd(0,2,ptd3,out); out[3]=tmpd1;
}
}
}
}
}
}
return 0;
}
int nohiddenpara2(short ch,double par[], double fk[][3], int uveq, double figkL[][3]){
double eps0=pow(10,-4.0), s, p1[2], p2[2], q[2],tmpd1, tmpd2[2],tmp1,tmp2;
double paL[DsizeM], 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 flg;
int ncusp=floor(Cusppt[0][0]+0.5), seL[DsizeM];
int i,j,n, nfh, nfk, cspflg,tmpi1[DsizeM];
vec[0]=sin(THETA)*cos(PHI);
vec[1]=sin(THETA)*sin(PHI);
vec[2]=cos(THETA);
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)<eps0){
if(cspflg==1){
cspflg=2;
}
else if(cspflg==3){
cspflg=6;
}
continue;
}
if(dist(2,tmpd2,p2)<eps0){
if(cspflg==1){
cspflg=3;
}
else if(cspflg==2){
cspflg=6;
}
continue;
}
}
paL[0]=0;
tmp2=-1;
for(j=1;j<=length1(par)-1;j++){
tmp1=par[j];
if(fabs(tmp1-tmp2)>Eps){
add1(paL,tmp1);
tmp2=tmp1;
}
}
tmp1=paL[length1(paL)];
tmp2=par[length1(par)];
if(fabs(tmp1-tmp2)<Eps){
paL[length1(paL)]=tmp2;
}else{
add1(paL,tmp2);
}
seL[0]=0;
for(n=1; n<=length1(paL)-1; n++){
s=(paL[n]+paL[n+1])/2.0;
invparapt(s,fh,fk, pta);
parapt(pta,ptap);
flg=pthiddenQ(ch,pta, uveq, tmpd4);
if(flg==0){ //180518
appendi1(n,seL);
}
}
figL[0][0]=0;figkL[0][0]=0;
for(i=1; i<=seL[0]; i++){
sp=paL[seL[i]]; //180616from
sq=paL[seL[i]+1];
pointoncurve(sp, fh, Eps, pd2);
pointoncurve(sq, fh, Eps, qd2);
if(dist(2,pd2,qd2)>Eps1){
nearestptpt(pd2,fh,tmpd4);
dtmp1=tmpd4[2];
nearestptpt(qd2,fh,tmpd4);
dtmp2=tmpd4[2];
partcrv(dtmp1,dtmp2,fh,tmpmd2);
appendd2(2,1,length2(tmpmd2),tmpmd2,figL);
tp=invparapt(sp,fh,fk,tmpd3);
tq=invparapt(sq,fh,fk,tmpd3);
partcrv3(tp,tq,fk,tmpmd3);
appendd3(2,1,length3(tmpmd3), tmpmd3, figkL);
}//180616to
else{//180705from
if(fabs(sp-sq)>1){
appendd2(2,1,length2(fh),fh,figL);
appendd3(2,1,length3(fk),fk,figkL);
}
}//180705to
}
tmpi1[0]=0;
for(i=1; i<=length1(paL)-1; i++){
if(memberi(i,seL)==0){
appendi1(i,tmpi1);
}
}
copyi(0,tmpi1[0],tmpi1,seL);
seL[0]=tmpi1[0];
Hiddendata[0][0]=0;
for(i=1; i<=seL[0]; 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);
partcrv3(tp,tq,fk,tmpmd3);
appendd3(2,1,length3(tmpmd3),tmpmd3,Hiddendata);
copyd(0,1,tmp1d2,pd2);
sp=paL[seL[i]];
copyd(0,1,tmp2d2,qd2);
sq=paL[seL[i]+1];
}
}
}
if(seL[0]>0){
if(dist(2,pd2,qd2)>Eps1){
tp=invparapt(sp,fh,fk,tmpd3);
tq=invparapt(sq,fh,fk,tmpd3);
partcrv3(tp,tq,fk,tmpmd3);
appendd3(2,1,length3(tmpmd3),tmpmd3,Hiddendata);
}
else{
appendd3(2,1,length3(fk),fk,Hiddendata);
}
}
return length3(figkL);
}
void 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;
int din[DsizeS][2],din2[DsizeM][2];
int ntmp, ntmpd3,ntmpd2;
double par[DsizeM];
du=(Urng[1]-Urng[0])/Mdv;
dv=(Vrng[1]-Vrng[0])/Ndv;
fsL[0][0]=0;
ekL[0][0]=0;;
if(DrawE==1){
tmpd2[0][0]=0;;
for(j=0; j<=Ndv; j++){
add2(tmpd2, Urng[1], Vrng[0]+j*dv);
}
surfcurve(ch,tmpd2,tmpd3);
appendd3(2,1,length3(tmpd3),tmpd3,ekL);
}
if(DrawN==1){
tmpd2[0][0]=0;
for(j=0; j<=Mdv; j++){
add2(tmpd2, Urng[0]+j*du, Vrng[1]);
}
surfcurve(ch,tmpd2,tmpd3);
appendd3(2,1,length3(tmpd3),tmpd3,ekL);
}
if(DrawW==1){
tmpd2[0][0]=0;
for(j=0; j<=Ndv; j++){
add2(tmpd2, Urng[0], Vrng[0]+j*dv);
}
surfcurve(ch,tmpd2,tmpd3);
appendd3(2,1,length3(tmpd3),tmpd3,ekL);
}
if(DrawS==1){
tmpd2[0][0]=0;
for(j=0; j<=Mdv; j++){
add2(tmpd2, Urng[0]+j*du, Vrng[0]);
}
surfcurve(ch,tmpd2,tmpd3);
appendd3(2,1,length3(tmpd3),tmpd3,ekL);
}
if(length3(ekL)>0){
appendd3(2,1,length3(ekL),ekL,fkL);
}
projpara(fkL,fall);
makexybdy(ch,fbdxy);
dataindexd2(2,fall,din);
Borderpt[0][0]=0;
Otherpartition[0]=0;
for(i=1; i<=length2i(din)-1; i++){
Otherpartition[i]=Inf; Otherpartition[0]++;
}
Borderhiddendata[0][0]=0;
dataindexd3(2,fkL,din2);
for(i=1; i<= length2i(din2); i++){
tmpd3[0][0]=0;
appendd3(0,din2[i][0],din2[i][1],fkL,tmpd3);
projpara(tmpd3,tmpd2);
partitionseg(tmpd2,fall,0,par);
/*
if(length1(par)>2){
ntmp=length1(par)-1;
tmpd2[0][0]=0;
for(j=2; j<=ntmp; j++){
pull2(j,Partitionpt,p);
addptd2(tmpd2, p);
}
appendd2(0, 1,length2(tmpd2),tmpd2,Borderpt);
}
*/
tmpd3[0][0]=0;
appendd3(0,din2[i][0],din2[i][1],fkL,tmpd3);
// for(j=din2[i][0]; j<=din2[i][1]; j++){
// pull3(j,fkL,p3);
// addptd3(tmpd3,p3);
// }
nohiddenpara2(ch,par,tmpd3,1, figkL);
if(length3(figkL)>0){
appendd3(2,1,length3(figkL),figkL, fsL);
}
ntmp=length3(Hiddendata);
if(ntmp>0){
appendd3(2,1,ntmp,Hiddendata,Borderhiddendata);
}
}
}
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(1,ptL);
pull3(1,pd,p);
for(k=2; k<=npd-1; k++){
pull3(k,pd,tmp2d);
if(dist(3,p,tmp2d)>eps1){
nptL=appendi1(k,ptL);
pull3(k,pd,p);
}
}
pull3(npd-1,pd,p);
pull3(npd,pd,tmp2d);
if(dist(3,p,tmp2d)>eps){ // eps -> eps1 ?
nptL=appendi1(npd,ptL);
}
if(nout>0){
nout=appendi1(Infint,out);
}
for(i=1; i<=nptL; i++){
nout=appendi1(ptL[i],out);
}
}
out[0]=nout;
return nout;
}
void 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, out3md); //180517from
tmp3md[0][0]=0;
pts[0][0]=0;
dataindexd2(2,out3md,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,out3md,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,tmp3md);
}
}
}
out3md[0][0]=0;
appendd2(0,1,length2(tmp3md),tmp3md,out3md);
tmp3md[0][0]=0;
appendd2(0,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)<Eps1){
flg=1; break;
}
}
if(flg==0){
pull2(ii,tmp3md,tmpd);
addptd2(pts,tmpd);
}
}
for(ii=1;ii<=length2(pts);ii++){
pull2(ii,pts,tmpd);
surffun(ch,tmpd[0],tmpd[1],tmp1d3);
dataindexd2(2,out3md,din);
for(jj=1;jj<=length2i(din);jj++){
tmp2md[0][0]=0;
appendd2(0,din[jj][0],din[jj][1],out3md,tmp2md);
eps=1;
for(kk=1;kk<=length2(tmp2md)-1;kk++){
pull2(kk,tmp2md,tmpd);
surffun(ch,tmpd[0],tmpd[1],tmp1d3);
pull2(kk+1,tmp2md,tmpd);
surffun(ch,tmpd[0],tmpd[1],tmpd3);
if(eps>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)<eps+Eps){
prependd2(ii,ii,pts,tmp2md);
replacelistd2(2,jj,out3md,tmp2md);
dataindexd2(2,out3md,din);//180517
continue;
}
pull2(length2(tmp2md),tmp2md,tmpd);
surffun(ch,tmpd[0],tmpd[1],tmpd3);
if(dist(3,tmp1d3,tmpd3)<eps+Eps){
appendd2(0,ii,ii,pts,tmp2md);
replacelistd2(2,jj,out3md,tmp2md);
dataindexd2(2,out3md,din);//180517
continue;
}
}
}
nall=cuspsplitpara(ch,out3md, pdatad3);
n=length2(Cuspsplitpt);
Cusppt[0][0]=0;
nall=appendd2(0, 1,n,Cuspsplitpt,Cusppt);
borderparadata(ch,pdatad3, outd3);
push3(Inf,3,0,outd3);
nall=appendd3(0,1,length3(Borderhiddendata),Borderhiddendata,outd3);
push3(Inf,3,0,outd3);
}
void groupnearpt3(double qlist[][3],double plist[][3]){
// 180428
int ii,jj,flg,din[DsizeS][2];
double p1[3],p2[3],gl[DsizeS][3];
while(length3(qlist)>0){
gl[0][0]=0;
appendd3(2,1,1,qlist,gl);
removed3(1,qlist);
for(ii=1;ii<=length3(qlist);ii++){
flg=0;
pull3(ii,qlist,p1);
for(jj=1;jj<=length3(gl);jj++){
pull3(jj,gl,p2);
if(dist(3,p1,p2)<Eps1){
flg=1;
break;
}
}
if(flg==1){
addptd3(gl,p1);
removed3(ii,qlist);
}
}
appendd3(2,1,length3(gl),gl,plist);
}
}
double funmeet(short ch,double u, double v,double pa[3], double vec[3]){
double pt[3], out;
surffun(ch,u, v, pt);
if((fabs(vec[1])>Eps)||(fabs(vec[0])>Eps)){
out=(vec[1]*(pt[0]-pa[0])-vec[0]*(pt[1]-pa[1]));
}else{
out=pt[0];
}
return out;
}
void meetpoints(short ch,double pta[3], double ptb[3], int uveq,double out[][3]){
int i, j, k,flg,din[DsizeS][2];
double vec[3],v1,v2,v3;
double du=(Urng[1]-Urng[0])/Mdv, dv=(Vrng[1]-Vrng[0])/Ndv;
double uval1,uval2,vval1,vval2,eval11,eval12,eval21,eval22;
double pl[5][2], vl[5], ql[11][2],p1[2],p2[2],m1,m2;
double ptuv[2], puv1[2], puv2[2],p1d3[3], p2d3[3], ptd3[3];
double tmpd1, tmpd2[2],tmpd3[3],tmp1d3[3],tmp1md3[DsizeS][3];
vec[0]=ptb[0]-pta[0]; vec[1]=ptb[1]-pta[1]; vec[2]=ptb[2]-pta[2];
out[0][0]=0;
if(norm(3,vec)<Eps){
return;
}
for(j=0; j<=Ndv-1; j++){
vval1=Vrng[0]+j*dv;
vval2=Vrng[0]+(j+1)*dv;
uval1=Urng[0];
eval11=funmeet(ch,uval1,vval1,pta,vec);
eval12=funmeet(ch,uval1,vval2,pta,vec);
for(i=0; i<=Mdv-1; i++){
uval2=Urng[0]+(i+1)*du;
eval21=funmeet(ch,uval2,vval1,pta,vec);
eval22=funmeet(ch,uval2,vval2,pta,vec);
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;
ql[0][0]=0;
for(k=0; k<=3; k++){
pull2(k,pl,p1);
pull2(k+1,pl,p2);
m1=vl[k]; m2=vl[k+1];
if(fabs(m1)<Eps){
addptd2(ql, p1);
continue;
}
if(fabs(m2)<Eps){
continue;
}
if((m1>0)&&(m2>0)){
continue;
}
if((m1< 0)&&(m2< 0)){
continue;
}
tmpd2[0]=1/(m1-m2)*(-m2*p1[0]+m1*p2[0]);
tmpd2[1]=1/(m1-m2)*(-m2*p1[1]+m1*p2[1]);
addptd2(ql, tmpd2);
}
uval1=uval2;
eval11=eval21;
eval12=eval22;
if(length2(ql)==2){
puv1[0]=ql[1][0]; puv1[1]=ql[1][1];
puv2[0]=ql[2][0]; puv2[1]=ql[2][1];
surffun(ch,puv1[0],puv1[1],p1d3);
surffun(ch,puv2[0],puv2[1],p2d3);
v1=vec[0]; v2=vec[1]; v3=vec[2];
if(fabs(v1)>Eps){
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)>Eps){
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[2];
}
if(m1*m2>= 0){
if(((m1>0) && (m2>0)) || ((m1< 0) && (m2< 0))){
continue;
}
if(m1==0){
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[0]);
ptuv[1]=1/(m1-m2)*(-m2*puv1[1]+m1*puv2[1]);
}
tmpd3[0]=ptd3[0]-pta[0];
tmpd3[1]=ptd3[1]-pta[1];
tmpd3[2]=ptd3[2]-pta[2];
crossprod(3,tmpd3,vec, tmp1d3);
if(norm(3,tmp1d3)<Eps1){
tmpd1=dotprod(3,tmpd3,vec);
if((tmpd1>-Eps)&&(norm(3,tmpd3)<norm(3,vec)+Eps)){
if(length3(out)==0){
addptd3(out,ptd3);
}else{
pull3(length3(out),out,p1d3);
if(dist(3,p1d3,ptd3)>Eps){
addptd3(out,ptd3);
}
}
}
}
}
}
}
tmp1md3[0][0]=0;
groupnearpt3(out,tmp1md3);
dataindexd3(2,tmp1md3,din);
out[0][0]=0;
for(i=1;i<=din[0][0];i++){
p1d3[0]=0; p1d3[1]=0; p1d3[2]=0;
tmpd1=din[i][1]-din[i][0]+1;
for(j=din[i][0];j<=din[i][1];j++){
p1d3[0]=p1d3[0]+tmp1md3[j][0]/tmpd1;
p1d3[1]=p1d3[1]+tmp1md3[j][1]/tmpd1;
p1d3[2]=p1d3[2]+tmp1md3[j][2]/tmpd1;
}
addptd3(out,p1d3);
}
}
void crvsfparadata(short ch, double fkL[][3], double fbdkL[][3], int sepflg, double out[][3]){
double fbdy[DsizeL][2], fk[DsizeM][3],outh[DsizeL][3];
// double fkp[DsizeM][3], dt;
double fh[DsizeM][2], parL[DsizeM], tmpmd3[DsizeM][3];
double ptL[DsizeM][3], tmpd2[2], tmpd3[3], tmp1d1, tmp2d1;
double po[2]={0,0}, epsd2[2]={Eps1,1}, pa[3], pb[3];
int nbor=length3(Borderhiddendata);
int ncshidden,din[DsizeM][2],din2[DsizeS][2];
int nn, i, j, k, n;
projpara(fbdkL,fbdy);
out[0][0]=0;
outh[0][0]=0;
dataindexd3(2,fkL,din);
for(nn=1; nn<=length2i(din); nn++){
fk[0][0]=0;
appendd3(0,din[nn][0],din[nn][1],fkL,fk);
projpara(fk,fh);
partitionseg(fh,fbdy,0,parL);
if(sepflg==0){ //180522
for(i=1; i<=length3(fk)-1; i++){
pull3(i,fk,pa);
pull3(i+1,fk,pb);
meetpoints(ch,pa,pb,1,ptL);
for(j=1; j<=length3(ptL); j++){
pull3(j,ptL,tmpd3);
parapt(tmpd3,tmpd2);
tmp1d1=paramoncurve(tmpd2,i,fh);
tmp2d1=Inf;
for(k=1; k<=length1(parL); 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){
appendd1(tmp1d1,parL);
}
}
simplesort(parL);
}
}
nohiddenpara2(ch,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
appendd3(0,1,length3(outh),outh,out);
}
void crv3onsfparadata(short ch,double fk[][3], double fbdyd3[][3], double out[][3]){
// 180609 debugged(renewed)
double fbdy[DsizeL][2],fh[DsizeL][2],fks[DsizeL][3],fhs[DsizeL][2],par[DsizeM];
double tmpmd3[DsizeL][3],outh[DsizeL][3];
int i,j,din[DsizeS][2];
projpara(fbdyd3,fbdy);
projpara(fk,fh);
out[0][0]=0;
outh[0][0]=0;
dataindexd2(2,fh,din);
for(i=1;i<=din[0][0];i++){
fhs[0][0]=0; fks[0][0]=0;
appendd2(0,din[i][0],din[i][1],fh,fhs);
appendd3(0,din[i][0],din[i][1],fk,fks);
tmpmd3[0][0]=0;
if(length2(fhs)>1){
partitionseg(fhs,fbdy,0, par);
nohiddenpara2(ch,par,fks,1,tmpmd3);
appendd3(2,1,length3(tmpmd3),tmpmd3,out);
appendd3(2,1,length3(Hiddendata),Hiddendata,outh);
}else{
appendd3(2,1,1,fks,out);
}
}
connectseg3(out, Eps1,tmpmd3);
out[0][0]=0;
appendd3(0,1,length3(tmpmd3),tmpmd3,out);
push3(Inf,3,0,out); //181025
connectseg3(outh, Eps1,tmpmd3);
appendd3(0,1,length3(tmpmd3),tmpmd3,out);//181025
}
void crv2onsfparadata(short ch,double fh[][2], double fbdyd3[][3], double out[][3]){
double fk[DsizeL][3];
surfcurve(ch,fh,fk);
crv3onsfparadata(ch,fk,fbdyd3,out);
}
void wireparadata(short ch,double bdyk[][3], double udata[], double vdata[],const char *fname,const char *fnameh){
double crv2d[DsizeL][2],out[DsizeL][3],out1[DsizeL][3],out2[DsizeL][3];
double du=(Urng[1]-Urng[0])/Mdv;
double dv=(Vrng[1]-Vrng[0])/Ndv;
int i,j,din[DsizeS][2];
short allflg=1;
if(strlen(fnameh)>0){
allflg=0;
}
char var0[]="wire3d";
char varh0[]="wireh3d";
char var[20];
char varh[20];
char varnow[40];
char varhnow[40];
varnow[0]='\0';
varhnow[0]='\0';
sprintf(var,"%s%d",var0,ch);
sprintf(varh,"%s%d",varh0,ch);
char dirfname[256];
char dirfnameh[256];
char varname[256];
char varnameh[256];
dirfname[0]='\0';
dirfnameh[0]='\0';
varname[0]='\0';
varnameh[0]='\0';
sprintf(varname,"%s%d",var,ch);
sprintf(varnameh,"%s%d",varh,ch);
sprintf(dirfname,"%s%s",Dirname,fname);
sprintf(dirfnameh,"%s%s",Dirname,fnameh);
if((length1(udata)==0)&&(allflg==0)){
out[0][0]=0;
output3(1,"w",varname,dirfname,out);
output3(1,"w",varnameh,dirfnameh,out);
}
for(i=1;i<=length1(udata);i++){
crv2d[0][0]=0;
for(j=0; j<=Ndv; j++){
add2(crv2d, udata[i],Vrng[0]+j*dv);
}
if(allflg==1){out[0][0]=0;}
crv2onsfparadata(ch,crv2d,bdyk,out);
if(allflg==0){
dataindexd3(3,out,din);
out1[0][0]=0; out2[0][0]=0;
appendd3(0,din[1][0],din[1][1],out,out1);
appendd3(0,din[2][0],din[2][1],out,out2);
if(i==1){
output3(1,"w",varname,dirfname,out1);
output3(1,"w",varnameh,dirfnameh,out2);
}else{
output3(0,"a",varname,dirfname,out1);
output3(0,"a",varnameh,dirfnameh,out2);
}
}else{
sprintf(varnow,"%s%s%d",var,"u",i);
sprintf(varhnow,"%s%s%d",varh,"u",i);
output3h("a",varnow, varhnow,fname,out);
}
}
for(j=1;j<=length1(vdata);j++){
crv2d[0][0]=0;
for(i=0; i<=Mdv; i++){
add2(crv2d, Urng[0]+i*du,vdata[j]);
}
if(allflg==1){out[0][0]=0;}
crv2onsfparadata(ch,crv2d,bdyk,out);
if(allflg==0){
dataindexd3(3,out,din);
out1[0][0]=0; out2[0][0]=0;
appendd3(0,din[1][0],din[1][1],out,out1);
appendd3(0,din[2][0],din[2][1],out,out2);
if(i<length1(vdata)){
output3(0,"a",varname,dirfname,out1);
output3(0,"a",varnameh,dirfnameh,out2);
}else{
output3(0,"a",varname,dirfname,out1);
outputend(dirfname);
output3(0,"a",varnameh,dirfnameh,out2);
outputend(dirfnameh);
}
}else{
sprintf(varnow,"%s%s%d",var,"v",j);
sprintf(varhnow,"%s%s%d",varh,"v",j);
output3h("a",varnow, varhnow,fname,out);
}
}
if(allflg==0){
outputend(dirfname);
outputend(dirfnameh);
}
}
void intersectcrvsf(const char *wa, short chfd,double crv[][3],const char *fname){
double pa[3],pb[3],out[DsizeM][3],ptL[DsizeM][3];
int i;
short chcut;
char chc[10];
sprintf(chc,"%d",chfd);
char var[]="intercrvsf";
char dirfname[256];
dirfname[0] = '\0';
sprintf(dirfname,"%s%s",Dirname,fname);
char varname[256];
varname[0] = '\0';
sprintf(varname,"%s%s",var,chc);
ptL[0][0]=0;
for(i=1;i<length3(crv);i++){
pull3(i,crv,pa);
pull3(i+1,crv,pb);
meetpoints(chfd,pa,pb,1,out);
appendd3(0,1,length3(out),out,ptL);
}
output3(1,wa,varname,dirfname,ptL);
}
void sfcutparadata(short chfd, short ncut, double fbdy3[][3],const char *fname,const char *fnameh){
double Vec[3]={sin(THETA)*cos(PHI),sin(THETA)*sin(PHI),cos(THETA)};
double v1=Vec[0],v2=Vec[1],v3=Vec[2];
double out[DsizeM][2],out2[DsizeM][2],outd3[DsizeL][3];
double ekL[DsizeL][3],out1d3[DsizeL][3],out2d3[DsizeL][3];
double uval1,uval2,vval1,vval2,eval11,eval12,eval21,eval22;
double pl[5][2], vl[5], ql[11][2],diff1,diff2;
double tmp1md[DsizeM][2],tmp2md[DsizeM][2],tmpd[2],tmp1d[2],tmp2d[2];
double tmp2md3[DsizeM][3],tmpd3[3],tmp1d3[3];
double du=(Urng[1]-Urng[0])/Mdv;
double dv=(Vrng[1]-Vrng[0])/Ndv;
double p1[2],p2[2],m1,m2,q11,q12,q21,q22,a1,a3,b1,b3;
int i,j,k,din[DsizeS][2],ns,ne,rmv[DsizeS];
short chcut, allflg=0;
if(strlen(fnameh)==0){
allflg=1;
}
char var0[]="sfcut3d";
char varh0[]="sfcuth3d";
char var[20];
char varh[20];
sprintf(var,"%s%d",var0,chfd);
sprintf(varh,"%s%d",varh0,chfd);
char varnow[40];
char varhnow[40];
char dirfname[256];
char dirfnameh[256];
char varname[256];
char varnameh[256];
varnow[0]='\0';
varhnow[0]='\0';
dirfname[0]='\0';
dirfnameh[0]='\0';
varname[0]='\0';
varnameh[0]='\0';
sprintf(varname,"%s%d",var,chfd);
sprintf(varnameh,"%s%d",varh,chfd);
sprintf(dirfname,"%s%s",Dirname,fname);
sprintf(dirfnameh,"%s%s",Dirname,fnameh);
for(chcut=1;chcut<=ncut;chcut++){
out[0][0]=0; out2[0][0]=0;
for(j=0; j<=Ndv-1; j++){
vval1=Vrng[0]+j*dv;
vval2=Vrng[0]+(j+1)*dv;
uval1=Urng[0];
eval11=cutfun(chfd, chcut,uval1, vval1);
eval12=cutfun(chfd, chcut,uval1, vval2);
for(i=0; i<=Mdv-1; i++){
uval2=Urng[0]+(i+1)*du;
eval21=cutfun(chfd, chcut,uval2, vval1);
eval22=cutfun(chfd, chcut,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;
ql[0][0]=0;
for(k=0; k<=3; k++){
pull2(k,pl,p1);
pull2(k+1,pl,p2);
m1=vl[k]; m2=vl[k+1];
if(fabs(m1)<Eps){
addptd2(ql, p1);
continue;
}
if(fabs(m2)<Eps){
continue;
}
if((m1>0)&&(m2>0)){
continue;
}
if((m1< 0)&&(m2< 0)){
continue;
}
tmpd[0]=1/(m1-m2)*(-m2*p1[0]+m1*p2[0]);
tmpd[1]=1/(m1-m2)*(-m2*p1[1]+m1*p2[1]);
addptd2(ql, tmpd);
}
uval1=uval2;
eval11=eval21;
eval12=eval22;
if(length2(ql)==2){
q11=ql[1][0];q12=ql[1][1];q21=ql[2][0];q22=ql[2][1];
a1=uval1;a3=uval2;b1=vval1;b3=vval2;
if(((q11==a1)&&(q21==a1))||((q11==a3)&&(q21==a3))){
if(((q21==b1)&&(q22==b1))||((q21==b3)&&(q22==b3))){
appendd2(2,1,2,ql,out2);
}else{
appendd2(2,1,2,ql,out);
}
continue;
}
if(((q12==b1)&&(q22==b1))||((q12==b3)&&(q22==b3))){
if(((q11==a1)&&(q21==a1))||((q11==a3)&&(q21==a3))){
appendd2(2,1,2,ql,out2);
}else{
appendd2(2,1,2,ql,out);
}
continue;
}
appendd2(2,1,2,ql,out);
}
}
}
dataindexd2(2,out2,din);
while(length2i(din)>0){
ns=din[1][0];ne=din[1][1];
tmp1md[0][0]=0;
appendd2(0,ns,ne,out2,tmp1md);
appendd2(2,ns,ne,out2,out);
removelistd2(2,1,out2);
dataindexd2(2,out2,din);
rmv[0]=0;
for(j=1;j<=length2i(din);j++){
ns=din[j][0];ne=din[j][1];
tmp2md[0][0]=0;
appendd2(0,ns,ne,out2,tmp2md);
pull2(1,tmp2md,tmp2d);pull2(1,tmp1md,tmp1d);
diff1=dist(2,tmp1d,tmp2d);
pull2(2,tmp2md,tmp2d);pull2(2,tmp1md,tmp1d);
diff1=diff1+dist(2,tmp1d,tmp2d);
pull2(1,tmp2md,tmp2d);pull2(2,tmp1md,tmp1d);
diff2=dist(2,tmp1d,tmp2d);
pull2(2,tmp2md,tmp2d);pull2(1,tmp1md,tmp1d);
diff2=diff2+dist(2,tmp1d,tmp2d);
if((diff1<Eps)||(diff2<Eps)){
appendi1(j,rmv);
continue;
}
}
for(j=1;j<=rmv[0];j++){
removelistd2(2,rmv[j],out2);
}
dataindexd2(2,out2,din);
}
connectseg(out, Eps1, out2);
dataindexd2(2,out2,din);
outd3[0][0]=0;
for(i=1;i<=length2i(din);i++){
ns=din[i][0];ne=din[i][1];
tmp1md[0][0]=0;
appendd2(0,ns,ne,out2,tmp1md);
tmp2md3[0][0]=0;
for(j=1;j<=length2(tmp1md);j++){
pull2(j,tmp1md,tmpd);
surffun(chfd,tmpd[0],tmpd[1],tmpd3);
if(length3(tmp2md3)>0){
pull3(length3(tmp2md3),tmp2md3,tmp1d3);
if(dist(3,tmpd3,tmp1d3)<Eps1){
continue;
}
}
addptd3(tmp2md3,tmpd3);
}
appendd3(2,1,length3(tmp2md3),tmp2md3,outd3);
}
crv3onsfparadata(chfd,outd3,fbdy3,ekL);
if(allflg==0){
dataindexd3(3,ekL,din);
out1d3[0][0]=0; out2d3[0][0]=0;
appendd3(0,din[1][0],din[1][1],ekL,out1d3);
appendd3(0,din[2][0],din[2][1],ekL,out2d3);
if(chcut==1){
output3(1,"w",varname,dirfname,out1d3);
output3(1,"w",varnameh,dirfnameh,out2d3);
}else{
output3(0,"a",varname,dirfname,out1d3);
output3(0,"a",varnameh,dirfnameh,out2d3);
}
}else{
sprintf(varnow,"%s%d",var,chcut);
sprintf(varhnow,"%s%d",varh,chcut);
output3h("a",varnow, varhnow,fname,ekL);
}
}
if(allflg==0){
outputend(dirfname);
outputend(dirfnameh);
}
}
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]<t1){
nres=addptd2(res,ku);
}
else{
flg=1;
if(ku[0]<t1-Eps){
tmpd2[0]=ku[0]; tmpd2[1]=t1;
nres=addptd2(res,tmpd2);
}
if(ku[1]>t2+Eps){
tmpd2[0]=t2; tmpd2[1]=ku[1];
nres=addptd2(res,tmpd2);
}
}
}
else if(flg==1){
if(ku[1]<t2){
continue;
}
else{
flg=2;
if(ku[0]<t2-Eps){
ku[0]=t2;
}
nres=addptd2(res,ku);
}
}
else{
nres=addptd2(res,ku);
}
}
return nres;
}
int skeletondata3(double data[][3], double r00,
double eps1, double eps2, double allres[][3]){
double objL[DsizeLL][3], pltL[DsizeLL][3];
double clipL[DsizeL][5],koc2d6[DsizeM][6],tmpd6[6];
double pts1[DsizeL][2],koc[DsizeM][4], koc2[DsizeM][4], kukanL[DsizeL][2];
double r0, t1, t2, z1, z2, tt, rr, origin[2], te, hh, ku[2], za, zb, ds[DsizeM],dmin;
double pt[2], pta[2], ptb[2], ptq[2];
double ptL[DsizeL][3], ptL2[DsizeL][2], res2[DsizeL][2], allres2[DsizeL][2];
double obj[DsizeL][3], plt[DsizeL][3];
double objp[DsizeL][3], pltp[DsizeL][3];
double obj2d[DsizeL][2], plt2d[DsizeL][2];
double tmpd1, tmp2d1, tmp3d1, tmp1d2[2], tmp2d2[2],tmpd3[3];
double tmpmd2[DsizeL][2], tmpmd3[DsizeL][3], tmpd4[4], tmp1d4[4];
int j, ii, jj, nobj, nplt, nall, din1[DsizeM][2], din2[DsizeM][2];
int nkoc, nkoc2, nn,nn1,nn2, nclipL, flg, ntmp;
char str1[100], str2[100];
objL[0][0]=0; pltL[0][0]=0;
dataindexd3(3,data,din1);
appendd3(0, din1[1][0],din1[1][1],data,objL);
appendd3(0, din1[2][0],din1[2][1],data,pltL);
allres[0][0]=0;
allres2[0][0]=0;
dataindexd3(2,objL,din1);
dataindexd3(2,pltL,din2);
for(nobj=1; nobj<=length2i(din1); nobj++){
tmpmd3[0][0]=0;
ntmp=appendd3(2,din1[nobj][0],din1[nobj][1],objL,tmpmd3);
nn=ceil((fmax(Mdv,Ndv)*2-1)/(ntmp-1));
increasept3(tmpmd3,nn,obj);
appendd3(0,ntmp,ntmp,tmpmd3,obj);
projcoordcurve(obj,objp);
obj2d[0][0]=0;
for(j=1; j<=length3(objp); j++){
push2(objp[j][0],objp[j][1],obj2d);
}
clipL[0][0]=0; nclipL=0;
for(nplt=1; nplt<=length2i(din2); nplt++){
tmpmd3[0][0]=0;
ntmp=appendd3(2,din2[nplt][0],din2[nplt][1],pltL,tmpmd3);
nn=ceil((fmax(Mdv,Ndv)*2-1)/(ntmp-1));
increasept3(tmpmd3,nn,plt);
appendd3(0,ntmp,ntmp,tmpmd3,plt);
projcoordcurve(plt,pltp);
plt2d[0][0]=0;
for(j=1; j<=length3(pltp); j++){
push2(pltp[j][0],pltp[j][1],plt2d);
}
intersectcurvesPp(obj2d,plt2d,20,koc2d6); //180324from
nkoc2=length6(koc2d6);
koc2[0][0]=0;
for(ii=1;ii<=nkoc2;ii++){
pull6(ii,koc2d6,tmpd6);
push4(tmpd6[0],tmpd6[1],tmpd6[2],tmpd6[3],koc2);
}//180324to
if(nkoc2>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]<dmin){
pull4(j,koc2,tmp1d4);
dmin=ds[j];
}
}
else{
addptd4(koc,tmp1d4);
pull4(j,koc2,tmp1d4);
dmin=ds[j];
}
}
nkoc=addptd4(koc,tmp1d4);
/*
if(tmpd4[3]<2*eps1){
if((dist(2,pta,pt)<eps2)&&(tmpd4[2]<0.1*length2(plt2d))){
continue;
}
if((dist(2,ptb,pt)<eps2)&&(tmpd4[2]>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)<eps2)&&(koc[jj][3]<0.3*length2(plt2d))){
continue;
}
if((dist(2,pt,ptb)<eps2)&&(koc[jj][3]>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)<eps1){
continue;
}
t1=dist(2,pta,pt)/dist(2,pta,ptb);
z1=(1-t1)*za+t1*zb;
pta[0]=pltp[nn2][0]; pta[1]=pltp[nn2][1];
za=tmpmd3[nn2][2];
ptb[0]=pltp[nn2+1][0]; ptb[1]=pltp[nn2+1][1];
zb=tmpmd3[nn2+1][2];
if(dist(2,pta,ptb)<Eps){
continue;
}
t2=dist(2,pta,pt)/dist(2,pta,ptb);
z2=(1-t2)*za+t2*zb;
if(z1<z2-eps1){
if(nclipL==0){
tmpd1=1;
}
}
else{
tmpd1=Inf;
for(j=1; j<=nclipL; j++){
tmp2d1=pow(clipL[j][0]-pt[0],2.0);
tmp2d1=tmp2d1+pow(clipL[j][1]-pt[1],2.0);
tmpd1=fmin(tmpd1,tmp2d1);
}
}
if(tmpd1>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)<rr){
continue;
}
flg=jj;
break;
}
if(flg==0){
t1=1;
}
else{
t1=flg; t2=tt;
hh=t2-t1;
for(j=1; j<=10; j++){
hh=hh*0.5;
pointoncurve(t1+hh,obj2d,Eps,ptq);
if(dist(2,pt,ptq)<rr){
t2=t2-hh;
}
else{
t1=t1+hh;
}
}
}
ku[0]=t1;
flg=0;
for(jj=nn+1; jj<=te; jj++){
pointoncurve(jj,obj2d,Eps,ptq);
if(dist(2,pt,ptq)<rr){
continue;
}
flg=jj;
break;
}
if(flg==0){
t2=te;
}
else{
t1=tt; t2=flg;
hh=t2-t1;
for(j=1; j<=10; j++){
hh=hh*0.5;
pointoncurve(t1+hh,obj2d,Eps,ptq);
if(dist(2,pt,ptq)<rr){
t1=t1+hh;
}
else{
t2=t2-hh;
}
}
}
ku[1]=t2;
ntmp=kukannozoku(ku,kukanL,tmpmd2);
kukanL[0][0]=0;
appendd2(0,1,ntmp,tmpmd2,kukanL);
}
for(jj=1; jj<=length2(kukanL); jj++){
tmp1d2[0]=kukanL[jj][0]; tmp1d2[1]=kukanL[jj][1];
t1=kukanL[jj][0]; nn1=floor(t1);
t2=kukanL[jj][1]; nn2=floor(t2);
ptL2[0][0]=0;
ptL[0][0]=0;
if(t1-nn1<1-Eps){
pointoncurve(t1,obj2d,Eps,tmp1d2);
addptd2(ptL2,tmp1d2);
invparapt(t1, obj2d, obj, tmpd3);
addptd3(ptL,tmpd3);
}
for(j=nn1+1; j<=nn2; j++){
pointoncurve(j,obj2d,Eps,tmp1d2);
addptd2(ptL2,tmp1d2);
invparapt(j, obj2d, obj, tmpd3);
addptd3(ptL,tmpd3);
}
if(t2-nn2>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 readoutdata3(const char *fname, const char *var, double data[][3]){
double x,y,z;
float xx;
char dstrorg[256];
dstrorg[0]='\0';
char dstr[256];
dstr[0]='\0';
char str[10];
str[0]='\0';
char strtmp[30];
char tmp[10];
tmp[0]='\0';
int linectr=0, start=0,ii,jj,nn,nctr;
FILE *fp;
fp=fopen(fname,"r");
if(fp==NULL){
printf("file not found\n");
return;
}
data[0][0]=0;
nn=strlen(var);
while( !feof(fp)){
fgets(dstr,250,fp);
linectr++;
jj=strlen(dstr);
if(jj>1){
dstr[jj-3]='\0';
}else{
dstr[0]='\0';
}
if(strncmp(dstr,var,nn)==0){
start=linectr;
}else{
if(start==0){
continue;
}
}
if(linectr==start){
continue;
}
if(strncmp(dstr,"sta",3)==0){
if(linectr>start+1){
add3(data,Inf,2,0);
}
continue;
}
if(strncmp(dstr,"end",3)==0){
continue;
}
if(strncmp(dstr,"[",1)!=0){
break;
}
str[0]='\0';
nctr=0;
for(jj=2;jj<250;jj++){
tmp[0]='\0'; sprintf(tmp,"%c",dstr[jj]);
if(strncmp(tmp,"/",1)==0){
break;
}
if(strncmp(tmp," ",1)==0){
continue;
}
if(strncmp(tmp,",",1)==0){
nctr++;
if(nctr==1){
x=atof(str); str[0]='\0';
continue;
}
if(nctr==2){
y=atof(str);str[0]='\0';
continue;
}
}
if(strncmp(tmp,"]",1)==0){
z=atof(str);str[0]='\0';
add3(data,x,y,z);
nctr=0;
jj++;
tmp[0]='\0'; sprintf(tmp,"%c",dstr[jj]);
if(strncmp(tmp,",",1)==0){
jj++;
}
continue;
}
strtmp[0]='\0';
sprintf(strtmp,"%s%s",str,tmp);
str[0]='\0';
for(ii=0;ii<20;ii++){
str[ii]=strtmp[ii];
if(strtmp[ii]=='\0'){
break;
}
}
}
}
fclose(fp);
}