Changeset 18788
- Timestamp:
- 11/14/14 16:42:44 (10 years ago)
- Location:
- issm/trunk-jpl/src/c/modules/MeshProfileIntersectionx
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified issm/trunk-jpl/src/c/modules/MeshProfileIntersectionx/MeshProfileIntersectionx.cpp ¶
r16164 r18788 129 129 ysegment[0]=yc[i]; 130 130 ysegment[1]=yc[i+1]; 131 ElementSegment(segments_dataset,el, xnodes,ynodes,xsegment,ysegment); 132 } 133 }/*}}}*/ 134 void ElementSegment(DataSet* segments_dataset,int el,double* xnodes,double* ynodes,double* xsegment,double* ysegment){/*{{{*/ 131 /*if (el==318 && i==9){ 132 _printf_("contour: " << i << " " << xsegment[0] << " " << ysegment[0] << " " << xsegment[1] << " " << ysegment[1] 133 << " " << xnodes[0] << " " << xnodes[1] << " " << xnodes[2] << " " << ynodes[0] << " " << ynodes[1] << " " << 134 ynodes[2] << "\n"); 135 }*/ 136 ElementSegment(segments_dataset,el, i, xnodes,ynodes,xsegment,ysegment); 137 } 138 }/*}}}*/ 139 void ElementSegment(DataSet* segments_dataset,int el, int contouri, double* xnodes,double* ynodes,double* xsegment,double* ysegment){/*{{{*/ 135 140 136 141 /*We have a tria element (xnodes,ynodes) and a segment (xsegment,ysegment). Find whether they intersect. … … 159 164 edge3=SegmentIntersect(&gamma1,&gamma2, xel,yel,xsegment,ysegment); 160 165 161 /*edge can be either IntersectEnum (one iand only one intersection between the edge and the segment), ColinearEnum (edge and segment are collinear) and SeparateEnum (no intersection): */ 166 /*edge can be either IntersectEnum (one and only one intersection between the edge and the segment), ColinearEnum (edge and segment are collinear) and SeparateEnum (no intersection): */ 167 168 /*if (el==318 && contouri==9){ 169 _printf_(edge1 << " " << edge2 << " " << edge3 << " " << alpha1 << " " << alpha2 << " " << beta1 << " " << beta2 << " " << gamma1 << " " << gamma2 << " " << xsegment[0] << " " << xsegment[1] << " " << ysegment[0] << " " << ysegment[1] << " " << xnodes[0] << " " << xnodes[1] << " " << xnodes[2] << " " << ynodes[0] << " " << ynodes[1] << " " << ynodes[2]); 170 171 _printf_("Bool" << (edge1==IntersectEnum) || (edge2==IntersectEnum) || (edge3==IntersectEnum)); 172 }*/ 162 173 163 174 if( (edge1==IntersectEnum) && (edge2==IntersectEnum) && (edge3==IntersectEnum) ){ 164 /*This case is impossible: */ 165 _error_("error: a line cannot go through 3 different vertices!"); 175 176 /*This can only be the case if the segment intersected through one vertex, meaning a pair from alpha1, beta1 or gamma1 is 0:*/ 177 if (alpha1!=0 && alpha1!=1){ 178 /*The vertex opposite edge 1 was intersected:*/ 179 xfinal[0]=xsegment[0]+alpha1*(xsegment[1]-xsegment[0]); 180 yfinal[0]=ysegment[0]+alpha1*(ysegment[1]-ysegment[0]); 181 xfinal[1]=xnodes[2]; 182 yfinal[1]=ynodes[2]; 183 } 184 else if (beta1!=0 && beta1!=1){ 185 /*The vertex opposite edge 2 was intersected:*/ 186 xfinal[0]=xsegment[0]+beta1*(xsegment[1]-xsegment[0]); 187 yfinal[0]=ysegment[0]+beta1*(ysegment[1]-ysegment[0]); 188 xfinal[1]=xnodes[0]; 189 yfinal[1]=ynodes[0]; 190 } 191 else if (gamma1!=0 && gamma1!=1){ 192 /*The vertex opposite edge 3 was intersected:*/ 193 xfinal[0]=xsegment[0]+gamma1*(xsegment[1]-xsegment[0]); 194 yfinal[0]=ysegment[0]+gamma1*(ysegment[1]-ysegment[0]); 195 xfinal[1]=xnodes[1]; 196 yfinal[1]=ynodes[1]; 197 } 198 segments_dataset->AddObject(new Segment<double>(el+1,xfinal[0],yfinal[0],xfinal[1],yfinal[1])); 199 200 201 /*This case is impossible: not quite! */ 202 //_printf_(alpha1 << " " << alpha2 << " " << beta1 << " " << beta2 << " " << gamma1 << " " << gamma2 << " " << xsegment[0] << " " << xsegment[1] << " " << ysegment[0] << " " << ysegment[1] << " " << xnodes[0] << " " << xnodes[1] << " " << xnodes[2] << " " << ynodes[0] << " " << ynodes[1] << " " << ynodes[2]); 203 /* _error_("error: a line cannot go through 3 different vertices!");*/ 166 204 } 167 205 else if( ((edge1==IntersectEnum) && (edge2==IntersectEnum)) || ((edge2==IntersectEnum) && (edge3==IntersectEnum)) || ((edge3==IntersectEnum) && (edge1==IntersectEnum)) ){ … … 187 225 } 188 226 else if( (edge1==IntersectEnum) || (edge2==IntersectEnum) || (edge3==IntersectEnum) ){ 227 228 /*if (el==318 && contouri==9){ 229 _printf_("hello" << " NodeInElement 0 " << (NodeInElement(xnodes,ynodes,xsegment[0],ysegment[0])) << " NodeInElement 1 " << (NodeInElement(xnodes,ynodes,xsegment[1],ysegment[1]))); 230 }*/ 189 231 190 232 /*segment intersect only 1 edge. Figure out where the first point in the segment is, inside or outside the element, … … 196 238 if(edge3==IntersectEnum){coord2=gamma1;} 197 239 } 198 else {240 else if (NodeInElement(xnodes,ynodes,xsegment[1],ysegment[1])){ 199 241 if(edge1==IntersectEnum){coord1=alpha1;} 200 242 if(edge2==IntersectEnum){coord1=beta1;} 201 243 if(edge3==IntersectEnum){coord1=gamma1;} 202 244 coord2=1.0; 245 } 246 else{ 247 double tolerance=1e-10; 248 /*Ok, we have an issue here. Probably one of the segments' end is on a vertex, within a certain tolerance!*/ 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)){ 252 253 /*ok, segments[0] is common to one of our vertices: */ 254 //if (el==318 && contouri==9){ _printf_("ok1" << "\n"); } 255 coord1=0; 256 if(edge1==IntersectEnum){coord2=alpha1;} 257 if(edge2==IntersectEnum){coord2=beta1;} 258 if(edge3==IntersectEnum){coord2=gamma1;} 259 } 260 else if (IsIdenticalNode(xnodes[0],ynodes[0],xsegment[1],ysegment[1],tolerance) || 261 IsIdenticalNode(xnodes[1],ynodes[1],xsegment[1],ysegment[1],tolerance) || 262 IsIdenticalNode(xnodes[2],ynodes[2],xsegment[1],ysegment[1],tolerance)){ 263 264 /*ok, segments[1] is common to one of our vertices: */ 265 //if (el==318 && contouri==9){ _printf_("ok2" << "\n"); } 266 if(edge1==IntersectEnum){coord1=alpha1;} 267 if(edge2==IntersectEnum){coord1=beta1;} 268 if(edge3==IntersectEnum){coord1=gamma1;} 269 coord2=1.0; 270 } 203 271 } 204 272 … … 344 412 return IntersectEnum; 345 413 }/*}}}*/ 414 bool IsIdenticalNode(double x1, double y1, double x2, double y2, double tolerance){ /*{{{*/ 415 416 if (sqrt(pow(x1-x2,2.0) + pow(y1-y2,2))<tolerance)return true; 417 else return false; 418 419 }/*}}}*/ -
TabularUnified issm/trunk-jpl/src/c/modules/MeshProfileIntersectionx/MeshProfileIntersectionx.h ¶
r15000 r18788 13 13 void MeshSegmentsIntersection(double** psegments, int* pnumsegs,int* index, double* x, double* y, int nel, int nods, double* xc, double* yc, int numnodes); 14 14 void ElementSegmentsIntersection(DataSet* segments_dataset,int el, double* xnodes,double* ynodes,double* xc,double* yc,int numnodes); 15 void ElementSegment(DataSet* segments_dataset,int el, double* xnodes,double* ynodes,double* xsegment,double* ysegment);15 void ElementSegment(DataSet* segments_dataset,int el,int contouri, double* xnodes,double* ynodes,double* xsegment,double* ysegment); 16 16 int SegmentIntersect(double* palpha, double* pbeta, double* x1, double* y1, double* x2, double* y2); 17 17 bool NodeInElement(double* xnodes, double* ynodes, double x, double y); 18 bool IsIdenticalNode(double x1, double y1, double x2, double y2, double tolerance); 18 19 19 20 #endif /* _MESHPROFILEINTERSECTIONX_H */
Note:
See TracChangeset
for help on using the changeset viewer.