diff --git a/src/org/poly2tri/MonoToneMountain.scala b/src/org/poly2tri/MonoToneMountain.scala index bfffe3c..aa0cecd 100644 --- a/src/org/poly2tri/MonoToneMountain.scala +++ b/src/org/poly2tri/MonoToneMountain.scala @@ -99,7 +99,7 @@ class MonotoneMountain { p.angle = Math.abs(angle(p.prev, p, p.next)) println("angle = " + p.angle) // Link strictly convex vertices into a list - if(p.angle > 0 && p.angle <= Math.Pi) convexPoints.enqueue(p) + if(p.angle >= 0 && p.angle <= Math.Pi) convexPoints.enqueue(p) p = p.next } @@ -114,12 +114,12 @@ class MonotoneMountain { // Remove ear, update angles and convex list remove(ear) a.angle -= ear.angle - if(a.angle > 0) convexPoints.enqueue(a) + if(a.angle > 0 && a != head && a != tail) convexPoints.enqueue(a) c.angle -= ear.angle - if(c.angle > 0) convexPoints.enqueue(c) + if(c.angle > 0 && c != head && c != tail) convexPoints.enqueue(c) } - if(size == 3) lastTriangle + if(size > 2)lastTriangle } } diff --git a/src/org/poly2tri/Poly2Tri.scala b/src/org/poly2tri/Poly2Tri.scala index 6fe3476..68318f3 100644 --- a/src/org/poly2tri/Poly2Tri.scala +++ b/src/org/poly2tri/Poly2Tri.scala @@ -36,7 +36,7 @@ package org.poly2tri // "Computational Geometry in C", 2nd edition, by Joseph O'Rourke import org.newdawn.slick.{BasicGame, GameContainer, Graphics, Color, AppGameContainer} -import org.newdawn.slick.geom.Polygon +import org.newdawn.slick.geom.{Polygon, Circle} import collection.jcl.ArrayList @@ -55,10 +55,14 @@ object Poly2Tri { class Poly2TriDemo extends BasicGame("Poly2Tri") { var tesselator: Triangulator = null + var quit = false + var debug = false + var drawMap = false def init(container: GameContainer) { testTesselator + //snake } def update(gc: GameContainer, delta: Int) { @@ -67,19 +71,26 @@ class Poly2TriDemo extends BasicGame("Poly2Tri") { def render(container: GameContainer, g: Graphics) { - val red = new Color(1f,0.0f,0.0f) + val red = new Color(1f, 0f,0.0f) val blue = new Color(0f, 0f, 1f) val green = new Color(0f, 1f, 0f) + val yellow = new Color(1f, 1f, 0f) - //for(t <- tesselator.allTrapezoids) { - for(t <- tesselator.trapezoids) { - val polygon = new Polygon() - for(v <- t.vertices) { - polygon.addPoint(v.x, v.y) - } - //g.setColor(red) - //g.draw(polygon) - } + if(debug) { + val draw = if(drawMap) tesselator.allTrapezoids else tesselator.trapezoids + for(t <- draw) { + val polygon = new Polygon() + for(v <- t.vertices) { + polygon.addPoint(v.x, v.y) + } + val lCirc = new Circle(t.leftPoint.x, t.leftPoint.y, 4) + g.setColor(blue); g.draw(lCirc); g.fill(lCirc) + val rCirc = new Circle(t.rightPoint.x, t.rightPoint.y, 6) + g.setColor(yellow); g.draw(rCirc); g.fill(rCirc) + g.setColor(red) + g.draw(polygon) + } + } for(x <- tesselator.xMonoPoly) { var t = x.triangles @@ -94,6 +105,8 @@ class Poly2TriDemo extends BasicGame("Poly2Tri") { override def keyPressed(key:Int, c:Char) { if(key == 1) quit = true + if(key == 57) debug = !debug + if(c == 'm') drawMap = !drawMap } def testTesselator { @@ -118,5 +131,39 @@ class Poly2TriDemo extends BasicGame("Poly2Tri") { tesselator.process } + def snake { + + val scale = 10.0f + val displace = 100 + val p1 = new Point(10,1)*scale+displace + val p2 = new Point(20,10)*scale+displace + val p3 = new Point(30,1)*scale+displace + val p4 = new Point(40,10)*scale+displace + val p5 = new Point(50,1)*scale+displace + val p6 = new Point(50,10)*scale+displace + val p7 = new Point(40,20)*scale+displace + val p8 = new Point(30,10)*scale+displace + val p9 = new Point(20,20)*scale+displace + val p10 = new Point(10,10)*scale+displace + val p11 = new Point(1,20)*scale+displace + val p12 = new Point(1,10)*scale+displace + + val segments = new ArrayList[Segment] + segments += new Segment(p1, p2) + segments += new Segment(p2, p3) + segments += new Segment(p3, p4) + segments += new Segment(p4, p5) + segments += new Segment(p5, p6) + segments += new Segment(p6, p7) + segments += new Segment(p7, p8) + segments += new Segment(p8, p9) + segments += new Segment(p9, p10) + segments += new Segment(p10, p11) + segments += new Segment(p11, p12) + segments += new Segment(p12, p1) + tesselator = new Triangulator(segments) + tesselator.process + } + } \ No newline at end of file diff --git a/src/org/poly2tri/Trapezoid.scala b/src/org/poly2tri/Trapezoid.scala index 0780ab7..8fbb191 100644 --- a/src/org/poly2tri/Trapezoid.scala +++ b/src/org/poly2tri/Trapezoid.scala @@ -89,13 +89,4 @@ class Trapezoid(val leftPoint: Point, var rightPoint: Point, val top: Segment, v top.mPoints += leftPoint top.mPoints += rightPoint } - - // Clear points when dividing this trapezoid - def clear { - bottom.mPoints -= leftPoint - bottom.mPoints -= rightPoint - top.mPoints -= leftPoint - top.mPoints -= rightPoint - } - } diff --git a/src/org/poly2tri/Triangulator.scala b/src/org/poly2tri/Triangulator.scala index 24ee134..97832e8 100644 --- a/src/org/poly2tri/Triangulator.scala +++ b/src/org/poly2tri/Triangulator.scala @@ -48,7 +48,7 @@ class Triangulator(var segments: ArrayList[Segment]) { for(s <- segments) { val traps = queryGraph.followSegment(s) // Remove trapezoids from trapezoidal Map - traps.foreach(t => {trapezoidalMap.remove(t); t.clear}) + traps.foreach(trapezoidalMap.remove) for(t <- traps) { var tList: ArrayList[Trapezoid] = null val containsP = t.contains(s.p) @@ -93,6 +93,7 @@ class Triangulator(var segments: ArrayList[Segment]) { // Build a list of x-monotone mountains private def createMountains { for(s <- segments) { + println(s.mPoints.size) if(s.mPoints.size > 2) { val mountain = new MonotoneMountain // TODO: Optomize sort? The number of points should be