public Section(float[] points, int[] tri, int xyz, float value, Vector3 maxVer, Vector3 minVer) { //xyz截面方向,value截面值 direction = xyz; sectionValue = value; vMax = maxVer; vMin = minVer; if (vMax.x - vMin.x > vMax.y - vMin.y) { if (vMax.x - vMin.x > vMax.z - vMin.z) { Max = vMax.x; Min = vMin.x; } else { Max = vMax.z; Min = vMin.z; } } else { if (vMax.y - vMin.y > vMax.z - vMin.z) { Max = vMax.y; Min = vMin.y; } else { Max = vMax.z; Min = vMin.z; } } int pointNum = points.Length / 3; int triNum = tri.Length / 3; //int[] mark = new int[pointNum * pointNum]; List <long> mark = new List <long>(); List <int> n0 = new List <int>(); List <int> n1 = new List <int>(); List <float> frac = new List <float>(); List <Vector2> v2 = new List <Vector2>(); List <Vector3> v3 = new List <Vector3>(); int[] pointIndex = new int[] { 0, 1, 1, 2, 2, 0 }; int ni0 = 0, ni1 = 0; float f = 0; for (int i = 0; i < triNum; ++i) { for (int pointIndexI = 0; pointIndexI < 3; ++pointIndexI) { int triPoint0 = tri[3 * i + pointIndex[2 * pointIndexI]]; int triPoint1 = tri[3 * i + pointIndex[2 * pointIndexI + 1]]; bool isSection = false; if (points[3 * triPoint0 + xyz] < value) { if (points[3 * triPoint1 + xyz] > value) { ni0 = triPoint0; ni1 = triPoint1; f = (value - points[3 * ni0 + xyz]) / (points[3 * ni1 + xyz] - points[3 * ni0 + xyz]); isSection = true; } else if (points[3 * triPoint1 + xyz] == value) { ni0 = triPoint1; ni1 = triPoint1; f = 0; isSection = true; } } else if (points[3 * triPoint0 + xyz] > value) { if (points[3 * triPoint1 + xyz] < value) { ni0 = triPoint1; ni1 = triPoint0; f = (value - points[3 * ni0 + xyz]) / (points[3 * ni1 + xyz] - points[3 * ni0 + xyz]); isSection = true; } else if (points[3 * triPoint1 + xyz] == value) { ni0 = triPoint1; ni1 = triPoint1; f = 0; isSection = true; } } else if (points[3 * triPoint0 + xyz] == value) { if (points[3 * triPoint1 + xyz] < value) { ni0 = triPoint0; ni1 = triPoint0; f = 0; isSection = true; } else if (points[3 * triPoint1 + xyz] > value) { ni0 = triPoint0; ni1 = triPoint0; f = 0; isSection = true; } } if (isSection && !mark.Contains(ni0 * pointNum + ni1)) { n0.Add(ni0); n1.Add(ni1); frac.Add(f); float xx, yy; switch (xyz) { case 0: xx = points[3 * ni0 + 1] + f * (points[3 * ni1 + 1] - points[3 * ni0 + 1]); yy = points[3 * ni0 + 2] + f * (points[3 * ni1 + 2] - points[3 * ni0 + 2]); v2.Add(new Vector2(xx, yy)); v3.Add(new Vector3(10 * (value - vMin.x) / (Max - Min) - 5 , 5 - 10 * (xx - vMin.y) / (Max - Min), 10 * (yy - vMin.z) / (Max - Min) - 5)); break; case 1: xx = points[3 * ni0] + f * (points[3 * ni1] - points[3 * ni0]); yy = points[3 * ni0 + 2] + f * (points[3 * ni1 + 2] - points[3 * ni0 + 2]); v2.Add(new Vector2(xx, yy)); v3.Add(new Vector3(10 * (xx - vMin.x) / (Max - Min) - 5 , 5 - 10 * (value - vMin.y) / (Max - Min), 10 * (yy - vMin.z) / (Max - Min) - 5)); break; case 2: xx = points[3 * ni0] + f * (points[3 * ni1] - points[3 * ni0]); yy = points[3 * ni0 + 1] + f * (points[3 * ni1 + 1] - points[3 * ni0 + 1]); v2.Add(new Vector2(xx, yy)); v3.Add(new Vector3(10 * (xx - vMin.x) / (Max - Min) - 5 , 5 - 10 * (yy - vMin.y) / (Max - Min), 10 * (value - vMin.z) / (Max - Min) - 5)); break; } mark.Add(ni0 * pointNum + ni1); } } } node0 = n0.ToArray(); node1 = n1.ToArray(); nodeNum = node0.Length; fraction = frac.ToArray(); vertices = v3.ToArray(); // Delaunay 三角剖分 DelaunayTriangulation delaunayTriangulation = null; DelaunayCalculator delaunayCalculator = new DelaunayCalculator(); if (vertices.Length > 0) { delaunayCalculator.CalculateTriangulation(v2, ref delaunayTriangulation); triangles = delaunayTriangulation.Triangles.ToArray(); } }
public VolumeticMesh2D generateMesh() { var mesh = new VolumeticMesh2D(); Mesh rawMesh = GetComponent <MeshFilter>().mesh; var vertices = rawMesh.vertices; foreach (var vertex in vertices) { mesh.nodes.Add(new Vector2(vertex.x, vertex.y)); } var calculator = new GK.DelaunayCalculator(); var result = calculator.CalculateTriangulation(mesh.nodes); var triangles = result.Triangles; for (int i = 0; i < triangles.Count; i += 3) { var edgeA = new Edge2D(triangles[i], triangles[i + 2]); var edgeB = new Edge2D(triangles[i + 2], triangles[i + 1]); var edgeC = new Edge2D(triangles[i + 1], triangles[i]); int edgeIndexA, edgeIndexB, edgeIndexC; if (!mesh.edges.Contains(edgeA)) { mesh.edges.Add(edgeA); edgeIndexA = mesh.edges.Count - 1; } else { edgeIndexA = mesh.edges.FindIndex(edge => edge == edgeA); } if (!mesh.edges.Contains(edgeB)) { mesh.edges.Add(edgeB); edgeIndexB = mesh.edges.Count - 1; } else { edgeIndexB = mesh.edges.FindIndex(edge => edge == edgeB); } if (!mesh.edges.Contains(edgeC)) { mesh.edges.Add(edgeC); edgeIndexC = mesh.edges.Count - 1; } else { edgeIndexC = mesh.edges.FindIndex(edge => edge == edgeC); } mesh.nodeJointIndexes.Add(new TriangleNodes2D(triangles[i], triangles[i + 2], triangles[i + 1])); mesh.edgeJointIndexes.Add(new TriangleEdges2D(edgeIndexA, edgeIndexB, edgeIndexC)); } return(mesh); }