mirror of
https://github.com/jhasse/poly2tri.git
synced 2024-12-31 23:23:30 +01:00
added monkey test; added control instructions
This commit is contained in:
parent
b44791a4bf
commit
b6c40da8e4
@ -33,6 +33,8 @@ class EarClip {
|
|||||||
var pinchIndexB = -1
|
var pinchIndexB = -1
|
||||||
var pin: Poly = null
|
var pin: Poly = null
|
||||||
|
|
||||||
|
var numTriangles = 0
|
||||||
|
|
||||||
def triangulatePolygon(xv: Array[Float], yv: Array[Float], vn: Int, results: Array[Triangle]): Int = {
|
def triangulatePolygon(xv: Array[Float], yv: Array[Float], vn: Int, results: Array[Triangle]): Int = {
|
||||||
|
|
||||||
if (vn < 3) return 0
|
if (vn < 3) return 0
|
||||||
@ -53,7 +55,8 @@ class EarClip {
|
|||||||
val nA = triangulatePolygon(pA.x,pA.y,pA.nVertices,mergeA)
|
val nA = triangulatePolygon(pA.x,pA.y,pA.nVertices,mergeA)
|
||||||
val nB = triangulatePolygon(pB.x,pB.y,pB.nVertices,mergeB)
|
val nB = triangulatePolygon(pB.x,pB.y,pB.nVertices,mergeB)
|
||||||
if (nA == -1 || nB == -1){
|
if (nA == -1 || nB == -1){
|
||||||
return -1;
|
numTriangles = -1
|
||||||
|
return numTriangles
|
||||||
}
|
}
|
||||||
for (i <- 0 until nA){
|
for (i <- 0 until nA){
|
||||||
results(i).set(mergeA(i));
|
results(i).set(mergeA(i));
|
||||||
@ -61,7 +64,8 @@ class EarClip {
|
|||||||
for (i <- 0 until nB){
|
for (i <- 0 until nB){
|
||||||
results(nA+i).set(mergeB(i));
|
results(nA+i).set(mergeB(i));
|
||||||
}
|
}
|
||||||
return (nA+nB);
|
numTriangles = (nA+nB)
|
||||||
|
return numTriangles
|
||||||
}
|
}
|
||||||
|
|
||||||
val buffer = new Array[Triangle](vNum-2);
|
val buffer = new Array[Triangle](vNum-2);
|
||||||
@ -119,7 +123,10 @@ class EarClip {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (bufferSize > 0) return bufferSize;
|
if (bufferSize > 0) return bufferSize;
|
||||||
else return -1;
|
else {
|
||||||
|
numTriangles = -1
|
||||||
|
return numTriangles
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clip off the ear:
|
// Clip off the ear:
|
||||||
@ -157,8 +164,8 @@ class EarClip {
|
|||||||
for (i <- 0 until bufferSize) {
|
for (i <- 0 until bufferSize) {
|
||||||
results(i).set(buffer(i))
|
results(i).set(buffer(i))
|
||||||
}
|
}
|
||||||
|
numTriangles = bufferSize
|
||||||
return bufferSize;
|
return numTriangles
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -71,8 +71,12 @@ class Poly2TriDemo extends BasicGame("Poly2Tri") {
|
|||||||
var hiLighter = 0
|
var hiLighter = 0
|
||||||
var drawEarClip = false
|
var drawEarClip = false
|
||||||
|
|
||||||
|
val nazcaMonkey = "data/nazca_monkey.dat"
|
||||||
|
val bird = "data/bird.dat"
|
||||||
|
var currentModel = nazcaMonkey
|
||||||
|
|
||||||
def init(container: GameContainer) {
|
def init(container: GameContainer) {
|
||||||
bird
|
selectModel
|
||||||
}
|
}
|
||||||
|
|
||||||
def update(gc: GameContainer, delta: Int) {
|
def update(gc: GameContainer, delta: Int) {
|
||||||
@ -81,6 +85,11 @@ class Poly2TriDemo extends BasicGame("Poly2Tri") {
|
|||||||
|
|
||||||
def render(container: GameContainer, g: Graphics) {
|
def render(container: GameContainer, g: Graphics) {
|
||||||
|
|
||||||
|
g.drawString("'1-5' to cycle models", 10, 540)
|
||||||
|
g.drawString("'SPACE' to turn on debug info", 10, 552)
|
||||||
|
g.drawString("'m' to show trapezoidal map (debug mode)", 10, 564)
|
||||||
|
g.drawString("'e' to switch Seidel / EarClip", 10, 576)
|
||||||
|
|
||||||
val red = new Color(1f, 0f,0.0f)
|
val red = new Color(1f, 0f,0.0f)
|
||||||
val blue = new Color(0f, 0f, 1f)
|
val blue = new Color(0f, 0f, 1f)
|
||||||
val green = new Color(0f, 1f, 0f)
|
val green = new Color(0f, 1f, 0f)
|
||||||
@ -142,6 +151,7 @@ class Poly2TriDemo extends BasicGame("Poly2Tri") {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override def keyPressed(key:Int, c:Char) {
|
override def keyPressed(key:Int, c:Char) {
|
||||||
|
|
||||||
// ESC
|
// ESC
|
||||||
if(key == 1) quit = true
|
if(key == 1) quit = true
|
||||||
// SPACE
|
// SPACE
|
||||||
@ -159,12 +169,24 @@ class Poly2TriDemo extends BasicGame("Poly2Tri") {
|
|||||||
hiLighter = tesselator.triangles.size-1
|
hiLighter = tesselator.triangles.size-1
|
||||||
}
|
}
|
||||||
if(c == 'm') drawMap = !drawMap
|
if(c == 'm') drawMap = !drawMap
|
||||||
if(c == '1') bird
|
if(c == '1') {currentModel = nazcaMonkey; selectModel}
|
||||||
if(c == '2') {poly; earClipPoly}
|
if(c == '2') {currentModel = bird; selectModel}
|
||||||
if(c == '3') snake
|
if(c == '3') {poly; earClipPoly}
|
||||||
if(c == '4') star
|
if(c == '4') snake
|
||||||
|
if(c == '5') star
|
||||||
if(c == 's') drawSegs = !drawSegs
|
if(c == 's') drawSegs = !drawSegs
|
||||||
if(c == 'e') drawEarClip = !drawEarClip
|
if(c == 'e') {drawEarClip = !drawEarClip; selectModel}
|
||||||
|
}
|
||||||
|
|
||||||
|
def selectModel {
|
||||||
|
currentModel match {
|
||||||
|
case "data/nazca_monkey.dat" =>
|
||||||
|
loadModel(nazcaMonkey, 4.5f, Point(400, 300), 1500)
|
||||||
|
case "data/bird.dat" =>
|
||||||
|
loadModel(bird, 25f, Point(400, 300), 350)
|
||||||
|
case _ =>
|
||||||
|
assert(false)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test #1
|
// Test #1
|
||||||
@ -291,17 +313,15 @@ class Poly2TriDemo extends BasicGame("Poly2Tri") {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
def bird {
|
def loadModel(model: String, scale: Float, center: Point, maxTriangles: Int) {
|
||||||
|
|
||||||
println("*** Bird ***")
|
println("*** " + model + " ***")
|
||||||
|
|
||||||
polyX = new ArrayBuffer[Float]
|
polyX = new ArrayBuffer[Float]
|
||||||
polyY = new ArrayBuffer[Float]
|
polyY = new ArrayBuffer[Float]
|
||||||
|
|
||||||
val scale = 25.0f
|
|
||||||
val center = Point(400, 300)
|
|
||||||
val angle = Math.Pi
|
val angle = Math.Pi
|
||||||
for (line <- Source.fromFile("data/bird.dat").getLines) {
|
for (line <- Source.fromFile(model).getLines) {
|
||||||
val s = line.replaceAll("\n", "")
|
val s = line.replaceAll("\n", "")
|
||||||
val tokens = s.split("[ ]+")
|
val tokens = s.split("[ ]+")
|
||||||
if(tokens.size == 2) {
|
if(tokens.size == 2) {
|
||||||
@ -329,41 +349,38 @@ class Poly2TriDemo extends BasicGame("Poly2Tri") {
|
|||||||
val p2 = segments(segments.length-1).q
|
val p2 = segments(segments.length-1).q
|
||||||
segments += new Segment(p2, p1)
|
segments += new Segment(p2, p1)
|
||||||
|
|
||||||
var t1: Float = 0f
|
|
||||||
var t2: Float = 0f
|
|
||||||
var runTime: Float = 0
|
|
||||||
val iterations = 1
|
|
||||||
|
|
||||||
println("Iteration count = " + iterations)
|
|
||||||
println("Number of points = " + polyX.size)
|
println("Number of points = " + polyX.size)
|
||||||
println("Seidel triangulation:")
|
println
|
||||||
|
|
||||||
for(i <- 0 until iterations) {
|
if(!drawEarClip) {
|
||||||
// Run benchmarks
|
|
||||||
|
// Sediel triangulation
|
||||||
tesselator = new Triangulator(segments)
|
tesselator = new Triangulator(segments)
|
||||||
t1 = System.nanoTime
|
val t1 = System.nanoTime
|
||||||
tesselator.process
|
tesselator.process
|
||||||
runTime += System.nanoTime - t1
|
val runTime = System.nanoTime - t1
|
||||||
}
|
|
||||||
println("Poly2Tri average (ms) = " + runTime*1e-6/iterations)
|
|
||||||
println("Number of triangles = " + tesselator.triangles.size)
|
|
||||||
|
|
||||||
println("Earclip triangulation:")
|
println("Poly2Tri average (ms) = " + runTime*1e-6)
|
||||||
// Earclip
|
println("Number of triangles = " + tesselator.triangles.size)
|
||||||
earClipResults = new Array[Triangle](500)
|
|
||||||
for(i <- 0 until earClipResults.size) earClipResults(i) = new Triangle
|
|
||||||
val xVerts = polyX.toArray.reverse
|
|
||||||
val yVerts = polyY.toArray.reverse
|
|
||||||
|
|
||||||
runTime = 0
|
} else {
|
||||||
for(i <- 0 until iterations) {
|
|
||||||
t1 = System.nanoTime
|
// Earclip
|
||||||
|
|
||||||
|
earClipResults = new Array[Triangle](maxTriangles)
|
||||||
|
|
||||||
|
for(i <- 0 until earClipResults.size) earClipResults(i) = new Triangle
|
||||||
|
val xVerts = polyX.toArray.reverse
|
||||||
|
val yVerts = polyY.toArray.reverse
|
||||||
|
|
||||||
|
val t1 = System.nanoTime
|
||||||
earClip.triangulatePolygon(xVerts, yVerts, xVerts.size, earClipResults)
|
earClip.triangulatePolygon(xVerts, yVerts, xVerts.size, earClipResults)
|
||||||
runTime += System.nanoTime - t1
|
val runTime = System.nanoTime - t1
|
||||||
|
|
||||||
|
println
|
||||||
|
println("Earclip average (ms) = " + runTime*1e-6)
|
||||||
|
println("Number of triangles = " + earClip.numTriangles)
|
||||||
}
|
}
|
||||||
println("Earclip average (ms) = " + runTime*1e-6/iterations)
|
|
||||||
val numTriangles = earClip.triangulatePolygon(xVerts, yVerts, xVerts.size, earClipResults)
|
|
||||||
println("Number of triangles = " + numTriangles)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
def earClipPoly {
|
def earClipPoly {
|
||||||
|
Loading…
Reference in New Issue
Block a user