mirror of
https://github.com/jhasse/poly2tri.git
synced 2024-11-30 01:03:30 +01:00
bug fixes
This commit is contained in:
parent
50848ab60c
commit
5fa8c4501e
@ -139,8 +139,7 @@ class CDT(val points: List[Point], val segments: List[Segment], iTriangle: Trian
|
|||||||
// Process Point event
|
// Process Point event
|
||||||
var triangle = pointEvent(point)
|
var triangle = pointEvent(point)
|
||||||
// Process edge events
|
// Process edge events
|
||||||
if(triangle != null)
|
point.edges.foreach(e => triangle = edgeEvent(e, triangle))
|
||||||
point.edges.foreach(e => triangle = edgeEvent(e, triangle))
|
|
||||||
if(i == CDT.clearPoint) {cleanTri = triangle; mesh.debug += cleanTri}
|
if(i == CDT.clearPoint) {cleanTri = triangle; mesh.debug += cleanTri}
|
||||||
|
|
||||||
} catch {
|
} catch {
|
||||||
@ -256,9 +255,29 @@ class CDT(val points: List[Point], val segments: List[Segment], iTriangle: Trian
|
|||||||
edgeNeighbors(nTriangles, T1)
|
edgeNeighbors(nTriangles, T1)
|
||||||
edgeNeighbors(nTriangles, T2)
|
edgeNeighbors(nTriangles, T2)
|
||||||
|
|
||||||
// Mark constrained edges
|
// Select edge triangle
|
||||||
T1.first.mark(point1, point2)
|
var edgeTri1: Triangle = null
|
||||||
T2.first.mark(point1, point2)
|
var i = 0
|
||||||
|
while(edgeTri1 == null) {
|
||||||
|
if(T1(i).contains(point1, point2))
|
||||||
|
edgeTri1 = T1(i)
|
||||||
|
i += 1
|
||||||
|
}
|
||||||
|
|
||||||
|
// Select edge triangle
|
||||||
|
var edgeTri2: Triangle = null
|
||||||
|
i = 0
|
||||||
|
while(edgeTri2 == null) {
|
||||||
|
if(T2(i).contains(point1, point2))
|
||||||
|
edgeTri2 = T2(i)
|
||||||
|
i += 1
|
||||||
|
}
|
||||||
|
|
||||||
|
edgeTri1.markNeighbor(edgeTri2)
|
||||||
|
|
||||||
|
// Mark constrained edge
|
||||||
|
edgeTri1 mark(point1, point2)
|
||||||
|
edgeTri2 mark(point1, point2)
|
||||||
|
|
||||||
// Double check returning T2.first vs T1.first
|
// Double check returning T2.first vs T1.first
|
||||||
first
|
first
|
||||||
@ -298,29 +317,30 @@ class CDT(val points: List[Point], val segments: List[Segment], iTriangle: Trian
|
|||||||
|
|
||||||
// Select edge triangle
|
// Select edge triangle
|
||||||
var edgeTri: Triangle = null
|
var edgeTri: Triangle = null
|
||||||
T.foreach(t =>
|
var i = 0
|
||||||
if(t.contains(first.point, node.point))
|
while(edgeTri == null) {
|
||||||
edgeTri = t
|
if(T(i).contains(first.point, node.point))
|
||||||
)
|
edgeTri = T(i)
|
||||||
assert(edgeTri != null)
|
i += 1
|
||||||
|
}
|
||||||
|
|
||||||
aFront link (first, node, edgeTri)
|
aFront link (first, node, edgeTri)
|
||||||
|
|
||||||
// Mark constrained edge
|
|
||||||
edgeTri mark(edge.p, edge.q)
|
|
||||||
|
|
||||||
// Update neighbors
|
// Update neighbors
|
||||||
edgeNeighbors(nTriangles, T)
|
edgeNeighbors(nTriangles, T)
|
||||||
|
|
||||||
|
// Mark constrained edge
|
||||||
|
edgeTri mark(edge.p, edge.q)
|
||||||
|
|
||||||
// Return original triangle
|
// Return original triangle
|
||||||
triangle
|
triangle
|
||||||
|
|
||||||
} else {
|
} else if(firstTriangle.contains(edge.p, edge.q)) {
|
||||||
|
|
||||||
// Mark constrained edge
|
// Mark constrained edge
|
||||||
if(firstTriangle != null)
|
firstTriangle mark(edge.p, edge.q)
|
||||||
firstTriangle mark(edge.p, edge.q)
|
|
||||||
triangle
|
triangle
|
||||||
|
} else {
|
||||||
|
throw new Exception("Triangulation error")
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -447,16 +467,12 @@ class CDT(val points: List[Point], val segments: List[Segment], iTriangle: Trian
|
|||||||
val t2 = node.triangle
|
val t2 = node.triangle
|
||||||
|
|
||||||
val point = t1.points(0)
|
val point = t1.points(0)
|
||||||
|
|
||||||
val oPoint = t2 oppositePoint t1
|
val oPoint = t2 oppositePoint t1
|
||||||
|
|
||||||
// Try to avoid creating degenerate triangles
|
if(illegal(t1.points(1), oPoint, t1.points(2), t1.points(0)) && !t2.finalized) {
|
||||||
val collinear = t1.collinear(oPoint) || t2.collinear(oPoint, point)
|
|
||||||
|
|
||||||
if(illegal(t1.points(1), oPoint, t1.points(2), t1.points(0)) && !collinear) {
|
|
||||||
|
|
||||||
// Flip edge and rotate everything clockwise
|
// Flip edge and rotate everything clockwise
|
||||||
t1.legalize(oPoint)
|
t1.legalize(oPoint)
|
||||||
t2.legalize(oPoint, point)
|
t2.legalize(oPoint, point)
|
||||||
|
|
||||||
// Copy old neighbors
|
// Copy old neighbors
|
||||||
|
@ -48,9 +48,11 @@ class Triangle(val points: Array[Point]) {
|
|||||||
// Finalization flag
|
// Finalization flag
|
||||||
var clean = false
|
var clean = false
|
||||||
|
|
||||||
|
var finalized = false
|
||||||
|
|
||||||
// Update neighbor pointers
|
// Update neighbor pointers
|
||||||
private def markNeighbor(p1: Point, p2: Point, t: Triangle) {
|
private def markNeighbor(p1: Point, p2: Point, t: Triangle) {
|
||||||
assert(t != this, "self-pointer error")
|
|
||||||
if((p1 == points(2) && p2 == points(1)) || (p1 == points(1) && p2 == points(2)))
|
if((p1 == points(2) && p2 == points(1)) || (p1 == points(1) && p2 == points(2)))
|
||||||
neighbors(0) = t
|
neighbors(0) = t
|
||||||
else if((p1 == points(0) && p2 == points(2)) || (p1 == points(2) && p2 == points(0)))
|
else if((p1 == points(0) && p2 == points(2)) || (p1 == points(2) && p2 == points(0)))
|
||||||
@ -64,7 +66,7 @@ class Triangle(val points: Array[Point]) {
|
|||||||
|
|
||||||
/* Exhaustive search to update neighbor pointers */
|
/* Exhaustive search to update neighbor pointers */
|
||||||
def markNeighbor(t: Triangle) {
|
def markNeighbor(t: Triangle) {
|
||||||
assert(t != this, "self-pointer error")
|
|
||||||
if (t.contains(points(1), points(2))) {
|
if (t.contains(points(1), points(2))) {
|
||||||
neighbors(0) = t
|
neighbors(0) = t
|
||||||
t.markNeighbor(points(1), points(2), this)
|
t.markNeighbor(points(1), points(2), this)
|
||||||
@ -93,7 +95,6 @@ class Triangle(val points: Array[Point]) {
|
|||||||
t.printDebug
|
t.printDebug
|
||||||
printDebug
|
printDebug
|
||||||
println(area + " | " + t.area)
|
println(area + " | " + t.area)
|
||||||
|
|
||||||
throw new Exception("Point location error, please report")
|
throw new Exception("Point location error, please report")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -308,10 +309,13 @@ class Triangle(val points: Array[Point]) {
|
|||||||
// Mark edge as constrained
|
// Mark edge as constrained
|
||||||
private def markEdge(p: Point, q: Point) {
|
private def markEdge(p: Point, q: Point) {
|
||||||
if((q == points(0) && p == points(1)) || (q == points(1) && p == points(0))) {
|
if((q == points(0) && p == points(1)) || (q == points(1) && p == points(0))) {
|
||||||
|
finalized = true
|
||||||
edges(2) = true
|
edges(2) = true
|
||||||
} else if ((q == points(0) && p == points(2)) || (q == points(2) && p == points(0))) {
|
} else if ((q == points(0) && p == points(2)) || (q == points(2) && p == points(0))) {
|
||||||
|
finalized = true
|
||||||
edges(1) = true
|
edges(1) = true
|
||||||
} else if ((q == points(1) && p == points(2)) || (q == points(2) && p == points(1))){
|
} else if ((q == points(1) && p == points(2)) || (q == points(2) && p == points(1))){
|
||||||
|
finalized = true
|
||||||
edges(0) = true
|
edges(0) = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -125,7 +125,7 @@ object Util {
|
|||||||
return det
|
return det
|
||||||
} else {
|
} else {
|
||||||
// Cheat a little bit.... we have a degenerate triangle
|
// Cheat a little bit.... we have a degenerate triangle
|
||||||
val c = pc * 1.00001f
|
val c = pc * 1.0001f
|
||||||
return orient2d(pa, pb, c)
|
return orient2d(pa, pb, c)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user