fixed edge swap

This commit is contained in:
zzzzrrr 2009-07-31 23:56:59 -04:00
parent e5da8e98c8
commit 2db07fc4be
1 changed files with 43 additions and 7 deletions

View File

@ -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 {
} }