mirror of
				https://github.com/jhasse/poly2tri.git
				synced 2025-11-03 21:59:32 +01:00 
			
		
		
		
	added snake and debug controls
This commit is contained in:
		@@ -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
 | 
			
		||||
	}
 | 
			
		||||
   }
 | 
			
		||||
 
 | 
			
		||||
 
 | 
			
		||||
@@ -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,18 +71,25 @@ 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) {
 | 
			
		||||
   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)
 | 
			
		||||
	     }
 | 
			
		||||
     //g.setColor(red)
 | 
			
		||||
     //g.draw(polygon)
 | 
			
		||||
	     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) {
 | 
			
		||||
@@ -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
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  
 | 
			
		||||
}
 | 
			
		||||
@@ -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
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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 
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user