17 double* segments=NULL;
21 double** allsegments=NULL;
22 double* segmentsi=NULL;
28 allsegments=xNew<double*>(numcontours);
29 allnumsegs=xNew<int>(numcontours);
32 for (i=0;i<numcontours;i++){
35 contouri=*(contours+i);
36 numnodes=contouri->
nods;
44 allsegments[i]=segmentsi;
45 allnumsegs[i]=numsegsi;
50 for(i=0;i<numcontours;i++)numsegs+=allnumsegs[i];
53 segments=xNew<double>(5*numsegs);
55 for(i=0;i<numcontours;i++){
57 segmentsi=allsegments[i];
58 numsegsi=allnumsegs[i];
60 for(j=0;j<numsegsi;j++){
62 *(segments+count*5+k)=*(segmentsi+j*5+k);
72 void MeshSegmentsIntersection(
double** psegments,
int* pnumsegs,
int* index,
double* x,
double* y,
int nel,
int nods,
double* xc,
double* yc,
int numnodes){
77 double* segments=NULL;
91 xnodes[j]=x[*(index+3*i+j)];
92 ynodes[j]=y[*(index+3*i+j)];
98 numsegs=segments_dataset->
Size();
99 segments=xNew<double>(5*numsegs);
100 for(i=0;i<numsegs;i++){
104 segments[5*i+0]=segment->
x1;
105 segments[5*i+1]=segment->
y1;
106 segments[5*i+2]=segment->
x2;
107 segments[5*i+3]=segment->
y2;
108 segments[5*i+4]=(double)segment->
eid;
112 delete segments_dataset;
126 for(
int i=0;i<numnodes-1;i++){
136 ElementSegment(segments_dataset,el, i, xnodes,ynodes,xsegment,ysegment);
139 void ElementSegment(
DataSet* segments_dataset,
int el,
int contouri,
double* xnodes,
double* ynodes,
double* xsegment,
double* ysegment){
144 double alpha1,alpha2;
146 double gamma1,gamma2;
148 int edge1,edge2,edge3;
150 double xel[2],yel[2];
153 double xfinal[2],yfinal[2];
156 xel[0]=xnodes[0]; yel[0]=ynodes[0]; xel[1]=xnodes[1]; yel[1]=ynodes[1];
160 xel[0]=xnodes[1]; yel[0]=ynodes[1]; xel[1]=xnodes[2]; yel[1]=ynodes[2];
164 xel[0]=xnodes[2]; yel[0]=ynodes[2]; xel[1]=xnodes[0]; yel[1]=ynodes[0];
178 if (alpha1!=0 && alpha1!=1){
180 xfinal[0]=xsegment[0]+alpha1*(xsegment[1]-xsegment[0]);
181 yfinal[0]=ysegment[0]+alpha1*(ysegment[1]-ysegment[0]);
185 else if (beta1!=0 && beta1!=1){
187 xfinal[0]=xsegment[0]+beta1*(xsegment[1]-xsegment[0]);
188 yfinal[0]=ysegment[0]+beta1*(ysegment[1]-ysegment[0]);
192 else if (gamma1!=0 && gamma1!=1){
194 xfinal[0]=xsegment[0]+gamma1*(xsegment[1]-xsegment[0]);
195 yfinal[0]=ysegment[0]+gamma1*(ysegment[1]-ysegment[0]);
215 xfinal[0]=xsegment[0]+coord1*(xsegment[1]-xsegment[0]);
216 xfinal[1]=xsegment[0]+coord2*(xsegment[1]-xsegment[0]);
217 yfinal[0]=ysegment[0]+coord1*(ysegment[1]-ysegment[0]);
218 yfinal[1]=ysegment[0]+coord2*(ysegment[1]-ysegment[0]);
240 else if (
NodeInElement(xnodes,ynodes,xsegment[1],ysegment[1])){
247 double tolerance=1e-10;
249 if (
IsIdenticalNode(xnodes[0],ynodes[0],xsegment[0],ysegment[0],tolerance) ||
250 IsIdenticalNode(xnodes[1],ynodes[1],xsegment[0],ysegment[0],tolerance) ||
251 IsIdenticalNode(xnodes[2],ynodes[2],xsegment[0],ysegment[0],tolerance)){
259 else if (
IsIdenticalNode(xnodes[0],ynodes[0],xsegment[1],ysegment[1],tolerance) ||
260 IsIdenticalNode(xnodes[1],ynodes[1],xsegment[1],ysegment[1],tolerance) ||
261 IsIdenticalNode(xnodes[2],ynodes[2],xsegment[1],ysegment[1],tolerance)){
272 xfinal[0]=xsegment[0]+coord1*(xsegment[1]-xsegment[0]);
273 xfinal[1]=xsegment[0]+coord2*(xsegment[1]-xsegment[0]);
274 yfinal[0]=ysegment[0]+coord1*(ysegment[1]-ysegment[0]);
275 yfinal[1]=ysegment[0]+coord2*(ysegment[1]-ysegment[0]);
291 double lambda1,lambda2,lambda3;
302 det=x1*y2-x1*y3-x3*y2-x2*y1+x2*y3+x3*y1;
305 lambda1=((y2-y3)*(x-x3)+(x3-x2)*(y-y3))/
det;
306 lambda2=((y3-y1)*(x-x3)+(x1-x3)*(y-y3))/
det;
307 lambda3=1-lambda1-lambda2;
309 if( ((lambda1<=1) && (lambda1>=0)) && ((lambda2<=1) && (lambda2>=0)) && ((lambda3<=1) && (lambda3>=0)) )
return true;
313 int SegmentIntersect(
double* palpha,
double* pbeta,
double* x1,
double* y1,
double* x2,
double* y2){
321 double xA,xB,xC,xD,yA,yB,yC,yD;
322 double O2A[2],O2B[2],O1C[2],O1D[2];
324 double test1, test2, test3, test4;
327 double pO1A,pO1B,pO1C,pO1D;
334 O2A[0]=xA -(xD/2+xC/2); O2A[1]=yA -(yD/2+yC/2);
335 O2B[0]=xB -(xD/2+xC/2); O2B[1]=yB -(yD/2+yC/2);
336 O1C[0]=xC -(xA/2+xB/2); O1C[1]=yC -(yA/2+yB/2);
337 O1D[0]=xD -(xA/2+xB/2); O1D[1]=yD -(yA/2+yB/2);
339 n1[0]=yA-yB; n1[1]=xB-xA;
340 n2[0]=yC-yD; n2[1]=xD-xC;
342 test1=n2[0]*O2A[0]+n2[1]*O2A[1];
343 test2=n2[0]*O2B[0]+n2[1]*O2B[1];
349 test3=n1[0]*O1C[0]+n1[1]*O1C[1];
350 test4=n1[0]*O1D[0]+n1[1]*O1D[1];
357 det=n1[0]*n2[1]-n2[0]*n1[1];
359 if(test1*test2==0 && test3*test4==0 &&
det==0){
362 O2O1[0]=(xA/2+xB/2)-(xD/2+xC/2);
363 O2O1[1]=(yA/2+yB/2)-(yD/2+yC/2);
365 pO1A=O2O1[0]*(O2A[0]-O2O1[0])+O2O1[1]*(O2A[1]-O2O1[1]);
366 pO1B=O2O1[0]*(O2B[0]-O2O1[0])+O2O1[1]*(O2B[1]-O2O1[1]);
367 pO1C=O2O1[0]*O1C[0]+O2O1[1]*O1C[1];
368 pO1D=O2O1[0]*O1D[0]+O2O1[1]*O1D[1];
371 if ((pO1C-pO1A)*(pO1D-pO1A)<0){
373 *palpha=
alpha;*pbeta=beta;
376 if ((pO1C-pO1B)*(pO1D-pO1B)<0){
378 *palpha=
alpha;*pbeta=beta;
381 if ((pO1A-pO1C)*(pO1B-pO1C)<0){
383 *palpha=
alpha;*pbeta=beta;
386 if ((pO1A-pO1D)*(pO1B-pO1D)<0){
388 *palpha=
alpha;*pbeta=beta;
393 if(O2O1[0]==0 && O2O1[1]){
395 *palpha=
alpha;*pbeta=beta;
401 *palpha=
alpha;*pbeta=beta;
408 alpha=-(xA*yB-xC*yB+yC*xB-yC*xA+xC*yA-yA*xB)/(-xD*yB+xD*yA+xC*yB-xC*yA-yD*xA+yD*xB+yC*xA-yC*xB);
410 *palpha=
alpha;*pbeta=beta;
415 if (sqrt(pow(x1-x2,2.0) + pow(y1-y2,2))<tolerance)
return true;