changed edge initialization

This commit is contained in:
zzzzrrr 2009-08-18 10:22:16 -04:00
parent 629b1f5164
commit 251e8ed8ff
2 changed files with 31 additions and 26 deletions

View File

@ -81,16 +81,41 @@ 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) {
segments = new Segment(points(i), points(i+1)) :: segments
segments.first.updateEdge
val endPoints = validatePoints(points(i), points(i+1))
segments = new Segment(endPoints(0), endPoints(1)) :: segments
endPoints(1).edges += segments.first
}
segments = new Segment(points.first, points.last) :: segments
segments.first.updateEdge
val endPoints = validatePoints(points.first, points.last)
segments = new Segment(endPoints(0), endPoints(1)) :: segments
endPoints(1).edges += segments.first
segments
}
def validatePoints(p1: Point, p2: Point): List[Point] = {
if(p1.y > p2.y) {
// For CDT we want q to be the point with > y
return List(p2, p1)
} else if(p1.y == p2.y) {
// If y values are equal, make sure point with smaller x value
// is the the left
if(p1.x > p2.x) {
return List(p2, p1)
} else if(p1.x == p2.x) {
throw new Exception("Duplicate point")
}
}
List(p1, p2)
}
// 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)
@ -259,6 +284,7 @@ class CDT(val points: List[Point], val segments: List[Segment], iTriangle: Trian
val first = pNode
val points = new ArrayBuffer[Point]
// Neighbor triangles
val nTriangles = new ArrayBuffer[Triangle]
nTriangles += pNode.triangle

View File

@ -50,26 +50,5 @@ class Segment(var p: Point, var q: Point) {
def > (point: Point) = (Math.floor(point.y) < Math.floor(slope * point.x + b))
// Determines if this segment lies below the given point
def < (point: Point) = (Math.floor(point.y) > Math.floor(slope * point.x + b))
// Update point edge list for CDT
def updateEdge {
if(p.y > q.y) {
// For CDT we want q to be the point with > y
val tmp = p
p = q
q = tmp
} else if(p.y == q.y) {
// If y values are equal, make sure point with smaller x value
// is the the left
if(p.x > q.x) {
val tmp = p
p = q
q = tmp
} else if(p.x == q.x) {
throw new Exception("Duplicate point")
}
}
q.edges += this
}
}