fixed advanding front, constrained edge bug

This commit is contained in:
zzzzrrr 2009-08-19 19:42:42 -04:00
parent b67a9b4495
commit 690f0e138c
3 changed files with 13 additions and 30 deletions

View File

@ -180,7 +180,7 @@ class Poly2TriDemo extends BasicGame("Poly2Tri") {
val draw = if(drawcdtMesh) slCDT.triangleMesh else slCDT.triangles val draw = if(drawcdtMesh) slCDT.triangleMesh else slCDT.triangles
draw.foreach( t => { draw.foreach( t => {
if(true) { if(false) {
for(i <- 0 to 2) { for(i <- 0 to 2) {
val s = t.points(i) val s = t.points(i)
val e = if(i == 2) t.points(0) else t.points(i + 1) val e = if(i == 2) t.points(0) else t.points(i + 1)

View File

@ -93,30 +93,24 @@ class AFront(iTriangle: Triangle) {
def constrainedEdge(sNode: Node, eNode: Node, T1: ArrayBuffer[Triangle], def constrainedEdge(sNode: Node, eNode: Node, T1: ArrayBuffer[Triangle],
T2: ArrayBuffer[Triangle], edge: Segment) { T2: ArrayBuffer[Triangle], edge: Segment) {
var node = sNode var node = sNode.prev
val point1 = edge.q val point1 = edge.q
val point2 = edge.p val point2 = edge.p
var marked = false
// Scan the advancing front and update Node triangle pointers // Scan the advancing front and update Node triangle pointers
while(node != null && node != eNode) { while(node != null && node != eNode.next) {
T2.foreach(t => { T2.foreach(t => {
if(t.contains(node.point, node.next.point)) if(t.contains(node.point, node.next.point))
node.triangle = t node.triangle = t
marked = true
}) })
if(!marked)
T1.foreach(t => { T1.foreach(t => {
if(t.contains(node.point, node.next.point)) if(t.contains(node.point, node.next.point))
node.triangle = t node.triangle = t
}) })
node = node.next node = node.next
} }
} }
def -=(tuple: Tuple3[Node, Node, Triangle]) { def -=(tuple: Tuple3[Node, Node, Triangle]) {

View File

@ -139,7 +139,7 @@ class CDT(polyLine: Array[Point], clearPoint: Point) {
// Implement sweep-line // Implement sweep-line
private def sweep { private def sweep {
for(i <- 1 until 36 /*points.size*/) { for(i <- 1 until points.size) {
val point = points(i) val point = points(i)
// Process Point event // Process Point event
val node = pointEvent(point) val node = pointEvent(point)
@ -208,9 +208,7 @@ class CDT(polyLine: Array[Point], clearPoint: Point) {
tList.foreach(t => { tList.foreach(t => {
t.neighbors.foreach(n => if(n != null && !tList.contains(n)) nTriangles += n) t.neighbors.foreach(n => if(n != null && !tList.contains(n)) nTriangles += n)
mesh.map -= t mesh.map -= t
//mesh.debug += t
}) })
//nTriangles.foreach(n => mesh.debug += n)
val lPoints = new ArrayBuffer[Point] val lPoints = new ArrayBuffer[Point]
val rPoints = new ArrayBuffer[Point] val rPoints = new ArrayBuffer[Point]
@ -250,11 +248,8 @@ class CDT(polyLine: Array[Point], clearPoint: Point) {
val point1 = if(ahead) edge.q else edge.p val point1 = if(ahead) edge.q else edge.p
val point2 = if(ahead) edge.p else edge.q val point2 = if(ahead) edge.p else edge.q
val sNode = if(ahead) node else aFront.locate(point1).prev val sNode = if(ahead) node else aFront.locate(point1)
val eNode = aFront.locate(point2).next val eNode = aFront.locate(point2)
//mesh.debug += sNode.triangle
//mesh.debug += eNode.triangle
aFront.constrainedEdge(sNode, eNode, T1, T2, edge) aFront.constrainedEdge(sNode, eNode, T1, T2, edge)
@ -262,14 +257,8 @@ class CDT(polyLine: Array[Point], clearPoint: Point) {
T1.last markEdge(point1, point2) T1.last markEdge(point1, point2)
T2.last markEdge(point1, point2) T2.last markEdge(point1, point2)
// Copy constraied edges from old triangles // Copy constraied edges from old triangles
T1.foreach(t => {t.markEdge(tList)/*;mesh.debug += t*/}) T1.foreach(t => t.markEdge(tList))
T2.foreach(t => {t.markEdge(tList)/*;mesh.debug += t*/}) T2.foreach(t => t.markEdge(tList))
var n = sNode
while(n != eNode) {
mesh.debug += n.triangle
n = n.next
}
} else if(firstTriangle == null) { } else if(firstTriangle == null) {