From be0112a0a3f287368a645d595c572be81dd0f411 Mon Sep 17 00:00:00 2001 From: masongreen Date: Sat, 1 Aug 2009 10:32:06 -0400 Subject: [PATCH] fixed updateEdge --- src/org/poly2tri/Poly2Tri.scala | 2 +- src/org/poly2tri/cdt/CDT.scala | 27 +++++++++++++++------------ src/org/poly2tri/cdt/Mesh.scala | 3 ++- src/org/poly2tri/shapes/Point.scala | 14 ++++++++++++-- src/org/poly2tri/shapes/Segment.scala | 1 + 5 files changed, 31 insertions(+), 16 deletions(-) diff --git a/src/org/poly2tri/Poly2Tri.scala b/src/org/poly2tri/Poly2Tri.scala index affe53b..ff9006c 100644 --- a/src/org/poly2tri/Poly2Tri.scala +++ b/src/org/poly2tri/Poly2Tri.scala @@ -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) diff --git a/src/org/poly2tri/cdt/CDT.scala b/src/org/poly2tri/cdt/CDT.scala index a977d7e..9622fdf 100644 --- a/src/org/poly2tri/cdt/CDT.scala +++ b/src/org/poly2tri/cdt/CDT.scala @@ -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) diff --git a/src/org/poly2tri/cdt/Mesh.scala b/src/org/poly2tri/cdt/Mesh.scala index e901b4f..5914c47 100644 --- a/src/org/poly2tri/cdt/Mesh.scala +++ b/src/org/poly2tri/cdt/Mesh.scala @@ -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)) { } - + */ } } diff --git a/src/org/poly2tri/shapes/Point.scala b/src/org/poly2tri/shapes/Point.scala index a81c1b0..49ca1ef 100644 --- a/src/org/poly2tri/shapes/Point.scala +++ b/src/org/poly2tri/shapes/Point.scala @@ -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 + } + } diff --git a/src/org/poly2tri/shapes/Segment.scala b/src/org/poly2tri/shapes/Segment.scala index e27444c..22b95af 100644 --- a/src/org/poly2tri/shapes/Segment.scala +++ b/src/org/poly2tri/shapes/Segment.scala @@ -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