fixed cdt fill

This commit is contained in:
zzzzrrr 2009-07-30 21:24:39 -04:00
parent 81265ea832
commit e5da8e98c8
3 changed files with 33 additions and 47 deletions

View File

@ -85,7 +85,7 @@ class Poly2TriDemo extends BasicGame("Poly2Tri") {
val strange = "data/strange.dat" val strange = "data/strange.dat"
val i18 = "data/i.18" val i18 = "data/i.18"
var currentModel = star var currentModel = nazcaMonkey
def init(container: GameContainer) { def init(container: GameContainer) {
selectModel(currentModel) selectModel(currentModel)
@ -125,7 +125,7 @@ class Poly2TriDemo extends BasicGame("Poly2Tri") {
} }
} }
if(!debug && !drawEarClip) { if(!debug && !drawEarClip && !drawCDT) {
var i = 0 var i = 0
for(t <- seidel.polygons) { for(t <- seidel.polygons) {
val poly = new Polygon val poly = new Polygon

View File

@ -74,13 +74,6 @@ class AFront(iTriangle: Triangle) {
node.triangle = triangle node.triangle = triangle
} }
def -==(tuple: Tuple3[Node, Node, Triangle]) {
val (node, kNode, triangle) = tuple
kNode.prev.next = node
node.prev = kNode.prev
node.prev.triangle = triangle
}
} }
class Node(val point: Point, var triangle: Triangle) { class Node(val point: Point, var triangle: Triangle) {

View File

@ -158,47 +158,40 @@ class CDT(val points: List[Point], val segments: List[Segment], iTriangle: Trian
def march(n: Node) { def march(n: Node) {
var node = n var node = n.next
/*
// Update right // Update right
if(node.next != aFront.tail) { if(node.next != null) {
var a = (node.point - node.next.point)
var b = (node.next.next.point - node.next.point)
var angle = Math.atan2(a cross b, a dot b)
while(node != aFront.tail && angle > -Math.Pi*0.5f) {
if(angle >= -Math.Pi*0.5f) {
val points = Array(node.next.point, node.next.next.point, node.point)
val neighbors = Array(null, node.triangle, node.next.triangle)
val triangle = new Triangle(points, neighbors)
mesh.map += triangle
aFront -= (node, node.next, triangle)
}
node = node.next
a = (node.point - node.next.point)
b = (node.next.next.point - node.next.point)
angle = Math.atan2(a cross b, a dot b)
}
}
*/
node = n
// Update left
if(node.prev != aFront.head) {
var angle = 0.0 var angle = 0.0
while(node != aFront.head.next && angle < Math.Pi*0.5f) { do {
val a = (node.point - node.prev.point) angle = fill(node)
val b = (node.prev.prev.point - node.prev.point) node = node.next
angle = Math.abs(Math.atan2(a cross b, a dot b)) } while(angle <= Math.Pi*0.5 && node.next != null)
if(angle <= Math.Pi*0.5f) {
val points = Array(node.prev.point, node.prev.prev.point, node.point)
val neighbors = Array(null, node.triangle, node.prev.triangle)
val triangle = new Triangle(points, neighbors)
mesh.map += triangle
aFront -== (node, node.prev, triangle)
}
node = node.prev
}
} }
node = n.prev
// Update left
if(node.prev != null) {
var angle = 0.0
do {
angle = fill(node)
node = node.prev
} while(angle <= Math.Pi*0.5f && node.prev != null)
}
}
def fill(node: Node) = {
val a = (node.prev.point - node.point)
val b = (node.next.point - node.point)
val angle = Math.abs(Math.atan2(a cross b, a dot b))
if(angle <= Math.Pi*0.5f) {
val points = Array(node.point, node.next.point, node.prev.point)
val neighbors = Array(null, node.prev.triangle, node.triangle)
val triangle = new Triangle(points, neighbors)
mesh.map += triangle
aFront -= (node.prev, node, triangle)
}
angle
} }
private def finalization { private def finalization {