Guest User

Untitled

a guest
Feb 20th, 2018
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.60 KB | None | 0 0
  1. public class Triangle
  2. {
  3. public Vector3[] vertices { get; protected set; }
  4.  
  5. public Triangle(Vector3 vtx0, Vector3 vtx1, Vector3 vtx2)
  6. {
  7. vertices = new[] { vtx0, vtx1, vtx2 };
  8. }
  9.  
  10. public int GetLongestSideIdx()
  11. {
  12. var ret = 0;
  13. var sqrMagLongest = 0f;
  14. for (var i = 0; i < 3; ++i)
  15. {
  16. var vtx0 = vertices[i];
  17. var vtx1 = vertices[(i + 1) % 3];
  18.  
  19. var sqrMag = (vtx0 - vtx1).sqrMagnitude;
  20. if (sqrMag > sqrMagLongest)
  21. {
  22. sqrMagLongest = sqrMag;
  23. ret = i;
  24. }
  25. }
  26.  
  27. return ret;
  28. }
  29. }
  30.  
  31. protected static Mesh DevidePolygon(Mesh mesh, float maxSideLength)
  32. {
  33. var vertices = mesh.vertices;
  34. var trianges = mesh.triangles;
  35. var newVertices = new List<Vector3>(mesh.vertices.Length);
  36.  
  37. for (var i = 0; i < mesh.triangles.Length; i += 3)
  38. {
  39. var idx0 = trianges[i];
  40. var idx1 = trianges[i + 1];
  41. var idx2 = trianges[i + 2];
  42.  
  43.  
  44. DevidePolygon(
  45. new Triangle(
  46. vertices[idx0],
  47. vertices[idx1],
  48. vertices[idx2]
  49. ),
  50. newVertices,
  51. maxSideLength
  52. );
  53. }
  54.  
  55. mesh.vertices = newVertices.ToArray();
  56. mesh.triangles = Enumerable.Range(0, mesh.vertices.Length).ToArray();
  57.  
  58. return mesh;
  59. }
  60.  
  61. protected static void DevidePolygon(Triangle triagnle, List<Vector3> outputVetices, float maxSideLength)
  62. {
  63. var sideIdx = triagnle.GetLongestSideIdx();
  64. var vtxs = triagnle.vertices;
  65.  
  66. var v0 = vtxs[sideIdx];
  67. var v1 = vtxs[(sideIdx + 1) % 3];
  68. var v2 = vtxs[(sideIdx + 2) % 3];
  69. if (Vector3.Distance(v0, v1) > maxSideLength)
  70. {
  71. var v3 = (v0 + v1) * 0.5f;
  72. DevidePolygon(new Triangle(v0, v3, v2), outputVetices, maxSideLength);
  73. DevidePolygon(new Triangle(v3, v1, v2), outputVetices, maxSideLength);
  74. }
  75. else
  76. {
  77. var startIdx = outputVetices.Count;
  78. outputVetices.Add(vtxs[0]);
  79. outputVetices.Add(vtxs[1]);
  80. outputVetices.Add(vtxs[2]);
  81. }
  82. }
Add Comment
Please, Sign In to add comment