public static List <Vertex> getTriangles(Volume volume) { List <Vertex> tri = new List <Vertex>(); PointHolder ph = new PointHolder(volume.xDim, volume.yDim, volume.zDim, volume); MCCube cube = new MCCube(); for (int z = -1; z < ph.depth + 1; z += 1) { for (int x = -1; x < ph.width + 1; x += 1) { for (int y = -1; y < ph.height + 1; y += 1) { cube.init(x, y, z); cube.computeEdges(ph); cube.getTriangles(tri, ph); } } } //for (Point3f p : tri) //{ // p.x = (float)(p.x * volume.pw + volume.minCoordinates.x); // p.y = (float)(p.y * volume.ph + volume.minCoordinates.y); // p.z = (float)(p.z * volume.pd + volume.minCoordinates.z); //} List <Vertex> tri1 = new List <Vertex>(); foreach (var p in tri) { tri1.Add(new Vertex((p.X - volume.xDim / 2) * volume.pw, (p.Y - volume.yDim / 2) * volume.ph, p.Z * volume.pd)); } return(tri1); }
private void computeEdges(PointHolder ph) { int i0 = ph.Intensity(v[0]); int i1 = ph.Intensity(v[1]); int i2 = ph.Intensity(v[2]); int i3 = ph.Intensity(v[3]); int i4 = ph.Intensity(v[4]); int i5 = ph.Intensity(v[5]); int i6 = ph.Intensity(v[6]); int i7 = ph.Intensity(v[7]); this.computeEdge(v[0], i0, v[1], i1, ref e[0], ph); this.computeEdge(v[1], i1, v[2], i2, ref e[1], ph); this.computeEdge(v[2], i2, v[3], i3, ref e[2], ph); this.computeEdge(v[3], i3, v[0], i0, ref e[3], ph); this.computeEdge(v[4], i4, v[5], i5, ref e[4], ph); this.computeEdge(v[5], i5, v[6], i6, ref e[5], ph); this.computeEdge(v[6], i6, v[7], i7, ref e[6], ph); this.computeEdge(v[7], i7, v[4], i4, ref e[7], ph); this.computeEdge(v[0], i0, v[4], i4, ref e[8], ph); this.computeEdge(v[1], i1, v[5], i5, ref e[9], ph); this.computeEdge(v[3], i3, v[7], i7, ref e[10], ph); this.computeEdge(v[2], i2, v[6], i6, ref e[11], ph); }
//Формирования индекса для каждого случая пересечения куба private int caseNumber(PointHolder ph) { int caseNumber = 0; for (int index = -1; ++index < v.Length; caseNumber += (ph.Intensity(v[index]) - ph.threshold > 0) ? 1 << index : 0) { ; } return(caseNumber); }
//Метод для получения треугольников private void getTriangles(List <Vertex> list, PointHolder ph) { int cn = caseNumber(ph); int offset = cn * 15; for (int index = 0; index < 5; index++) { if (faces[offset] != -1) { list.Add(new Vertex(this.e[faces[offset]])); list.Add(new Vertex(this.e[faces[offset + 1]])); list.Add(new Vertex(this.e[faces[offset + 2]])); } offset += 3; } }
private bool computeEdge(Vertex v1, int i1, Vertex v2, int i2, ref Vertex result, PointHolder ph) { if (i2 < i1) { return(computeEdge(v2, i2, v1, i1, ref result, ph)); } float t = (ph.threshold - i1) / (float)(i2 - i1); if (t >= 0 && t <= 1) { result.Set(v2); result.Sub(v1); result.Scale(t); result.Add(v1); return(true); } result.Set(new Vertex(-1, -1, -1)); return(false); }