Browse Source

Merge branch 'fixtriang' of https://github.com/jahting/three.js into dev

Mr.doob 11 years ago
parent
commit
03770624c4
1 changed files with 10 additions and 5 deletions
  1. 10 5
      src/extras/core/Shape.js

+ 10 - 5
src/extras/core/Shape.js

@@ -125,7 +125,7 @@ THREE.Shape.Utils = {
 
 	triangulateShape: function ( contour, holes ) {
 
-		function point_in_segment_2D( inSegPt1, inSegPt2, inOtherPt ) {
+		function point_in_segment_2D_colin( inSegPt1, inSegPt2, inOtherPt ) {
 			// inOtherPt needs to be colinear to the inSegment
 			if ( inSegPt1.x != inSegPt2.x ) {
 				if ( inSegPt1.x < inSegPt2.x ) {
@@ -167,7 +167,8 @@ THREE.Shape.Utils = {
 					if ( ( perpSeg2 > 0 ) || ( perpSeg2 < limit ) ) 		return [];
 				}
 
-				// intersection at endpoint ?
+				// i.e. to reduce rounding errors
+				// intersection at endpoint of segment#1?
 				if ( perpSeg2 == 0 ) {
 					if ( ( inExcludeAdjacentSegs ) &&
 						 ( ( perpSeg1 == 0 ) || ( perpSeg1 == limit ) ) )		return [];
@@ -178,6 +179,9 @@ THREE.Shape.Utils = {
 						 ( ( perpSeg1 == 0 ) || ( perpSeg1 == limit ) ) )		return [];
 					return  [ inSeg1Pt2 ];
 				}
+				// intersection at endpoint of segment#2?
+				if ( perpSeg1 == 0 )		return  [ inSeg2Pt1 ];
+				if ( perpSeg1 == limit )	return  [ inSeg2Pt2 ];
 
 				// return real intersection point
 				var factorSeg1 = perpSeg2 / limit;
@@ -185,7 +189,8 @@ THREE.Shape.Utils = {
 							y: inSeg1Pt1.y + factorSeg1 * seg1dy } ];
 
 			} else {		// parallel or colinear
-				if ( perpSeg1 != 0 )							 			return [];
+				if ( ( perpSeg1 != 0 ) ||
+					 ( seg2dy * seg1seg2dx != seg2dx * seg1seg2dy ) ) 			return [];
 
 				// they are collinear or degenerate
 				var seg1Pt = ( (seg1dx == 0) && (seg1dy == 0) );	// segment1 ist just a point?
@@ -198,12 +203,12 @@ THREE.Shape.Utils = {
 				}
 				// segment#1  is a single point
 				if ( seg1Pt ) {
-					if (! point_in_segment_2D( inSeg2Pt1, inSeg2Pt2, inSeg1Pt1 ) )		return [];		// but not in segment#2
+					if (! point_in_segment_2D_colin( inSeg2Pt1, inSeg2Pt2, inSeg1Pt1 ) )		return [];		// but not in segment#2
 					return  [ inSeg1Pt1 ];
 				}
 				// segment#2  is a single point
 				if ( seg2Pt ) {
-					if (! point_in_segment_2D( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1 ) )		return [];		// but not in segment#1
+					if (! point_in_segment_2D_colin( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1 ) )		return [];		// but not in segment#1
 					return  [ inSeg2Pt1 ];
 				}