Skip to content

Instantly share code, notes, and snippets.

@fuqunaga
Created February 8, 2018 10:34
Show Gist options
  • Save fuqunaga/1e8baa974d7d7c734fccc87e2c790772 to your computer and use it in GitHub Desktop.
Save fuqunaga/1e8baa974d7d7c734fccc87e2c790772 to your computer and use it in GitHub Desktop.
DiviedPolygon
public class Triangle
{
public Vector3[] vertices { get; protected set; }
public Triangle(Vector3 vtx0, Vector3 vtx1, Vector3 vtx2)
{
vertices = new[] { vtx0, vtx1, vtx2 };
}
public int GetLongestSideIdx()
{
var ret = 0;
var sqrMagLongest = 0f;
for (var i = 0; i < 3; ++i)
{
var vtx0 = vertices[i];
var vtx1 = vertices[(i + 1) % 3];
var sqrMag = (vtx0 - vtx1).sqrMagnitude;
if (sqrMag > sqrMagLongest)
{
sqrMagLongest = sqrMag;
ret = i;
}
}
return ret;
}
}
protected static Mesh DevidePolygon(Mesh mesh, float maxSideLength)
{
var vertices = mesh.vertices;
var trianges = mesh.triangles;
var newVertices = new List<Vector3>(mesh.vertices.Length);
for (var i = 0; i < mesh.triangles.Length; i += 3)
{
var idx0 = trianges[i];
var idx1 = trianges[i + 1];
var idx2 = trianges[i + 2];
DevidePolygon(
new Triangle(
vertices[idx0],
vertices[idx1],
vertices[idx2]
),
newVertices,
maxSideLength
);
}
mesh.vertices = newVertices.ToArray();
mesh.triangles = Enumerable.Range(0, mesh.vertices.Length).ToArray();
return mesh;
}
protected static void DevidePolygon(Triangle triagnle, List<Vector3> outputVetices, float maxSideLength)
{
var sideIdx = triagnle.GetLongestSideIdx();
var vtxs = triagnle.vertices;
var v0 = vtxs[sideIdx];
var v1 = vtxs[(sideIdx + 1) % 3];
var v2 = vtxs[(sideIdx + 2) % 3];
if (Vector3.Distance(v0, v1) > maxSideLength)
{
var v3 = (v0 + v1) * 0.5f;
DevidePolygon(new Triangle(v0, v3, v2), outputVetices, maxSideLength);
DevidePolygon(new Triangle(v3, v1, v2), outputVetices, maxSideLength);
}
else
{
var startIdx = outputVetices.Count;
outputVetices.Add(vtxs[0]);
outputVetices.Add(vtxs[1]);
outputVetices.Add(vtxs[2]);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment