From 6100a498aba14ed6ad3dc866b8c028a7071a6e7d Mon Sep 17 00:00:00 2001 From: zzzzrrr Date: Sun, 19 Jul 2009 00:38:50 -0400 Subject: [PATCH] fixed floating point rounding bug --- src/org/poly2tri/Poly2Tri.scala | 7 ++++--- src/org/poly2tri/Segment.scala | 2 +- src/org/poly2tri/Triangulator.scala | 4 ++-- src/org/poly2tri/YNode.scala | 5 +++-- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/org/poly2tri/Poly2Tri.scala b/src/org/poly2tri/Poly2Tri.scala index ac2b23f..dd981af 100644 --- a/src/org/poly2tri/Poly2Tri.scala +++ b/src/org/poly2tri/Poly2Tri.scala @@ -171,13 +171,14 @@ class Poly2TriDemo extends BasicGame("Poly2Tri") { val p16 = Point(300,312) segments = new ArrayBuffer[Segment] - segments += new Segment(p1, p2) segments += new Segment(p2, p3) - segments += new Segment(p3, p4) + segments += new Segment(p1, p2) + segments += new Segment(p7, p1) segments += new Segment(p4, p5) + segments += new Segment(p3, p4) segments += new Segment(p5, p6) segments += new Segment(p6, p7) - segments += new Segment(p7, p8) + segments += new Segment(p3, p4) segments += new Segment(p8, p9) segments += new Segment(p9, p10) segments += new Segment(p10, p11) diff --git a/src/org/poly2tri/Segment.scala b/src/org/poly2tri/Segment.scala index 281c536..462133a 100644 --- a/src/org/poly2tri/Segment.scala +++ b/src/org/poly2tri/Segment.scala @@ -49,7 +49,7 @@ class Segment(var p: Point, var q: Point) { val b = p.y - (p.x * slope) // Determines if this segment lies above the given point - def > (point: Point) = (point.y < slope * point.x + b) + def > (point: Point) = (point.y < Math.floor(slope * point.x + b)) // Determines if this segment lies below the given point def < (point: Point) = (point.y > slope * point.x + b) diff --git a/src/org/poly2tri/Triangulator.scala b/src/org/poly2tri/Triangulator.scala index b4b0353..0539a75 100644 --- a/src/org/poly2tri/Triangulator.scala +++ b/src/org/poly2tri/Triangulator.scala @@ -144,11 +144,11 @@ class Triangulator(segments: ArrayBuffer[Segment]) { if(s.p.x > s.q.x) { segs += new Segment(s.q.clone, s.p.clone) } else if(s.p.x < s.q.x) - segs += new Segment(s.p.clone, s.q.clone) + segs += new Segment(s.p.clone, s.q.clone) // Randomized triangulation improves performance // See Seidel's paper, or O'Rourke's book, p. 57 // Turn this off for now because of pointer bug somewhere in DAG / trapezoidal map - //Random.shuffle(segs) + Random.shuffle(segs) segs } } diff --git a/src/org/poly2tri/YNode.scala b/src/org/poly2tri/YNode.scala index fc0266a..e53fc3f 100644 --- a/src/org/poly2tri/YNode.scala +++ b/src/org/poly2tri/YNode.scala @@ -35,10 +35,11 @@ class YNode(segment: Segment, lChild: Node, rChild: Node) extends Node(lChild, r override def locate(s: Segment): Sink = { if (segment > s.p) { // Move down the graph - right.locate(s) + return right.locate(s) } else if (segment < s.p){ // Move up the graph - left.locate(s) + return left.locate(s) + } else { // s and segment share the same endpoint, p if (s.slope < segment.slope) {