fixed updateEdge

This commit is contained in:
masongreen 2009-08-01 10:32:06 -04:00
parent 44f9fbe572
commit be0112a0a3
5 changed files with 31 additions and 16 deletions

View File

@ -192,7 +192,7 @@ class Poly2TriDemo extends BasicGame("Poly2Tri") {
hiLighter = seidel.polygons.size-1
}
if(c == 'm') drawMap = !drawMap
if(c == 'c') drawCDT = !drawCDT
if(c == 'd') drawCDT = !drawCDT
if(c == '1') selectModel(nazcaMonkey)
if(c == '2') selectModel(bird)
if(c == '3') selectModel(strange)

View File

@ -78,17 +78,19 @@ object CDT {
// Create segments and connect end points; update edge event pointer
private def initSegments(points: ArrayBuffer[Point]): List[Segment] = {
var segments = List[Segment]()
for(i <- 0 until points.size-1) {
val segment = new Segment(points(i), points(i+1))
points(i+1).eEvent = segment
segments = segment :: segments
}
val segment = new Segment(points.first, points.last)
points.first.eEvent = segment
segments = segment :: segments
for(i <- 0 until points.size-1)
segments = segment(points(i), points(i+1)) :: segments
segments = segment(points.first, points.last) :: segments
segments
}
// Create a new segment and updates edge pointer
private def segment(p1: Point, p2: Point): Segment = {
val seg = new Segment(p1, p2)
p1.updateEdges(p2, seg)
seg
}
// Insertion sort is one of the fastest algorithms for sorting arrays containing
// fewer than ten elements, or for lists that are already mostly sorted.
// Merge sort: O(n log n)
@ -145,9 +147,11 @@ class CDT(val points: List[Point], val segments: List[Segment], iTriangle: Trian
val triangle = new Triangle(pts, neighbors)
mesh.map += triangle
// Check if edges need to be swapped to preserve CDT
// TODO: Make sure AFront pointers are updated correctly
val oPoint = nTri oppositePoint triangle
if(illegal(ccwPoint, oPoint, cwPoint, point)) {
swapEdges(triangle, nTri, oPoint)
legalization(triangle, nTri, oPoint)
}
nTri.updateNeighbors(ccwPoint, cwPoint, triangle)
@ -215,9 +219,8 @@ class CDT(val points: List[Point], val segments: List[Segment], iTriangle: Trian
false
}
// Rotate everything clockwise
private def swapEdges(t1: Triangle, t2: Triangle, oPoint: Point) {
println("swap")
// Flip edges and rotate everything clockwise
private def legalization(t1: Triangle, t2: Triangle, oPoint: Point) {
// Rotate points
val point = t1.points(0)
t1.points(1) = t1.points(0)

View File

@ -40,10 +40,11 @@ class Mesh(initialTriangle: Triangle) {
val map = HashSet(initialTriangle)
def addEdge(point:Point, triangle: Triangle) {
/*
val p = point.eEvent.p
if(!triangle.contains(p)) {
}
*/
}
}

View File

@ -30,14 +30,16 @@
*/
package org.poly2tri.shapes
import scala.collection.mutable.ArrayBuffer
case class Point(val x: Float, val y: Float) {
// Pointers to next and previous points in Monontone Mountain
var next, prev: Point = null
// The setment this point belongs to
var segment: Segment = null
// Edge event pointer for CDT
var eEvent: Segment = null
// List of edges this point constitutes an upper ending point (CDT)
var edges = new ArrayBuffer[Segment]
@inline def -(p: Point) = Point(x - p.x, y - p.y)
@inline def +(p: Point) = Point(x + p.x, y + p.y)
@ -55,4 +57,12 @@ case class Point(val x: Float, val y: Float) {
@inline def >(p: Point) = (y < p.y)
@inline def !(p: Point) = !(p.x == x && p.y == y)
@inline override def clone = Point(x, y)
def updateEdges(point: Point, segment: Segment) {
if(point.y > y)
point.edges += segment
else
edges += segment
}
}

View File

@ -33,6 +33,7 @@ package org.poly2tri.shapes
import scala.collection.mutable.{ArrayBuffer}
// Represents a simple polygon's edge
// TODO: Rename this class to Edge?
class Segment(var p: Point, var q: Point) {
// Pointers used for building trapezoidal map