mirror of
				https://github.com/jhasse/poly2tri.git
				synced 2025-10-31 20:37:10 +01:00 
			
		
		
		
	fixed edge swap
This commit is contained in:
		| @@ -113,6 +113,8 @@ class CDT(val points: List[Point], val segments: List[Segment], iTriangle: Trian | |||||||
|   // Advancing front |   // Advancing front | ||||||
|   val aFront = new AFront(iTriangle) |   val aFront = new AFront(iTriangle) | ||||||
|    |    | ||||||
|  |   val PI_2 = Math.Pi/2 | ||||||
|  |    | ||||||
|   // Sweep points; build mesh |   // Sweep points; build mesh | ||||||
|   sweep |   sweep | ||||||
|   // Finalize triangulation |   // Finalize triangulation | ||||||
| @@ -142,12 +144,18 @@ class CDT(val points: List[Point], val segments: List[Segment], iTriangle: Trian | |||||||
|     val neighbors = Array(nTri, null, null) |     val neighbors = Array(nTri, null, null) | ||||||
|     val triangle = new Triangle(pts, neighbors) |     val triangle = new Triangle(pts, neighbors) | ||||||
|     mesh.map += triangle |     mesh.map += triangle | ||||||
|     triangle.legalize |      | ||||||
|  |     val oPoint = nTri oppositePoint triangle | ||||||
|  |     if(illegal(ccwPoint, oPoint, cwPoint, point)) { | ||||||
|  |       swapEdges(triangle, nTri, oPoint) | ||||||
|  |     } | ||||||
|      |      | ||||||
|     nTri.updateNeighbors(ccwPoint, cwPoint, triangle) |     nTri.updateNeighbors(ccwPoint, cwPoint, triangle) | ||||||
|      |      | ||||||
|     // Update advancing front |     // Update advancing front | ||||||
|     march(aFront += (point, triangle, node)) |     val newNode = aFront.insert(point, triangle, node) | ||||||
|  |     // Fill in adjacent triangles if required | ||||||
|  |     march(newNode) | ||||||
|     triangle |     triangle | ||||||
|   } |   } | ||||||
|    |    | ||||||
| @@ -156,6 +164,7 @@ class CDT(val points: List[Point], val segments: List[Segment], iTriangle: Trian | |||||||
|     mesh.addEdge(point, triangle) |     mesh.addEdge(point, triangle) | ||||||
|   } |   } | ||||||
|    |    | ||||||
|  |   // Scan left and right to fill holes in the mesh | ||||||
|   def march(n: Node) { |   def march(n: Node) { | ||||||
|      |      | ||||||
|     var node = n.next |     var node = n.next | ||||||
| @@ -165,7 +174,7 @@ class CDT(val points: List[Point], val segments: List[Segment], iTriangle: Trian | |||||||
|       do { |       do { | ||||||
|         angle = fill(node) |         angle = fill(node) | ||||||
|         node = node.next |         node = node.next | ||||||
|       } while(angle <= Math.Pi*0.5 && node.next != null)  |       } while(angle <= PI_2 && node.next != null)  | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     node = n.prev |     node = n.prev | ||||||
| @@ -175,16 +184,15 @@ class CDT(val points: List[Point], val segments: List[Segment], iTriangle: Trian | |||||||
|       do { |       do { | ||||||
| 	    angle = fill(node) | 	    angle = fill(node) | ||||||
|         node = node.prev |         node = node.prev | ||||||
|       } while(angle <= Math.Pi*0.5f && node.prev != null) |       } while(angle <= PI_2 && node.prev != null) | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|    |    | ||||||
|   def fill(node: Node) = { |   def fill(node: Node): Double = { | ||||||
|      |  | ||||||
| 	  val a = (node.prev.point - node.point) | 	  val a = (node.prev.point - node.point) | ||||||
| 	  val b = (node.next.point - node.point) | 	  val b = (node.next.point - node.point) | ||||||
| 	  val angle = Math.abs(Math.atan2(a cross b, a dot b)) | 	  val angle = Math.abs(Math.atan2(a cross b, a dot b)) | ||||||
| 	  if(angle <= Math.Pi*0.5f) { | 	  if(angle <= PI_2) { | ||||||
| 	    val points = Array(node.point, node.next.point, node.prev.point) | 	    val points = Array(node.point, node.next.point, node.prev.point) | ||||||
| 	    val neighbors = Array(null, node.prev.triangle, node.triangle) | 	    val neighbors = Array(null, node.prev.triangle, node.triangle) | ||||||
| 	    val triangle = new Triangle(points, neighbors) | 	    val triangle = new Triangle(points, neighbors) | ||||||
| @@ -194,6 +202,34 @@ class CDT(val points: List[Point], val segments: List[Segment], iTriangle: Trian | |||||||
|       angle |       angle | ||||||
|   } |   } | ||||||
|    |    | ||||||
|  |   // Do edges need to be swapped? | ||||||
|  |   private def illegal(p1: Point, p2: Point, p3: Point, p4:Point): Boolean = { | ||||||
|  | 	  val v1 = p3 - p2 | ||||||
|  |       val v2 = p1 - p2 | ||||||
|  |       val v3 = p1 - p4 | ||||||
|  |       val v4 = p3 - p4 | ||||||
|  |       if((v1 dot v2) < 0 && (v3 dot v4) < 0) | ||||||
|  |         // swap the edge | ||||||
|  |         true  | ||||||
|  |       else  | ||||||
|  |         false | ||||||
|  |   } | ||||||
|  |    | ||||||
|  |   // Rotate everything clockwise | ||||||
|  |   private def swapEdges(t1: Triangle, t2: Triangle, oPoint: Point) { | ||||||
|  |     println("swap") | ||||||
|  |     // Rotate points | ||||||
|  |     val point = t1.points(0) | ||||||
|  |     t1.points(1) = t1.points(0) | ||||||
|  |     t1.points(0) = t1.points(2) | ||||||
|  |     t1.points(2) = oPoint     | ||||||
|  |     val tmp = t2.points(1) | ||||||
|  |     t2.points(1) = point | ||||||
|  |     t2.points(0) = t2.points(2) | ||||||
|  |     t2.points(2) = tmp | ||||||
|  |     // Rotate neighbors | ||||||
|  |   } | ||||||
|  |   | ||||||
|   private def finalization { |   private def finalization { | ||||||
|   } |   } | ||||||
|    |    | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 zzzzrrr
					zzzzrrr