package org.newdawn.slick.geom;
/**
* A triangulator implementation that splits the triangules of another, subdividing
* to give a higher tesselation - and hence smoother transitions.
*
* @author kevin
*/
public class OverTriangulator implements Triangulator {
/** The triangles data */
private float[][] triangles;
/**
* Create a new triangulator
*
* @param tris The original set of triangles to be sub-dividied
*/
public OverTriangulator(Triangulator tris) {
triangles = new float[tris.getTriangleCount()*6*3][2];
int tcount = 0;
for (int i=0;i<tris.getTriangleCount();i++) {
float cx = 0;
float cy = 0;
for (int p = 0;p < 3;p++) {
float[] pt = tris.getTrianglePoint(i, p);
cx += pt[0];
cy += pt[1];
}
cx /= 3;
cy /= 3;
for (int p = 0;p < 3;p++) {
int n = p +1;
if (n > 2) {
n = 0;
}
float[] pt1 = tris.getTrianglePoint(i, p);
float[] pt2 = tris.getTrianglePoint(i, n);
pt1[0] = (pt1[0] + pt2[0]) / 2;
pt1[1] = (pt1[1] + pt2[1]) / 2;
triangles[(tcount *3) + 0][0] = cx;
triangles[(tcount *3) + 0][1] = cy;
triangles[(tcount *3) + 1][0] = pt1[0];
triangles[(tcount *3) + 1][1] = pt1[1];
triangles[(tcount *3) + 2][0] = pt2[0];
triangles[(tcount *3) + 2][1] = pt2[1];
tcount++;
}
for (int p = 0;p < 3;p++) {
int n = p +1;
if (n > 2) {
n = 0;
}
float[] pt1 = tris.getTrianglePoint(i, p);
float[] pt2 = tris.getTrianglePoint(i, n);
pt2[0] = (pt1[0] + pt2[0]) / 2;
pt2[1] = (pt1[1] + pt2[1]) / 2;
triangles[(tcount *3) + 0][0] = cx;
triangles[(tcount *3) + 0][1] = cy;
triangles[(tcount *3) + 1][0] = pt1[0];
triangles[(tcount *3) + 1][1] = pt1[1];
triangles[(tcount *3) + 2][0] = pt2[0];
triangles[(tcount *3) + 2][1] = pt2[1];
tcount++;
}
}
}
/**
* @see org.newdawn.slick.geom.Triangulator#addPolyPoint(float, float)
*/
public void addPolyPoint(float x, float y) {
}
/**
* @see org.newdawn.slick.geom.Triangulator#getTriangleCount()
*/
public int getTriangleCount() {
return triangles.length / 3;
}
/**
* @see org.newdawn.slick.geom.Triangulator#getTrianglePoint(int, int)
*/
public float[] getTrianglePoint(int tri, int i) {
float[] pt = triangles[(tri * 3)+i];
return new float[] {pt[0],pt[1]};
}
/**
* @see org.newdawn.slick.geom.Triangulator#startHole()
*/
public void startHole() {
}
/**
* @see org.newdawn.slick.geom.Triangulator#triangulate()
*/
public boolean triangulate() {
return true;
}
}