mirror of
https://github.com/jhasse/poly2tri.git
synced 2025-01-31 04:33:30 +01:00
fixed edge swap
This commit is contained in:
parent
e5da8e98c8
commit
2db07fc4be
@ -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 {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user