Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        //Формирования индекса для каждого случая пересечения куба
        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);
        }
Пример #4
0
        //Метод для получения треугольников
        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;
            }
        }
Пример #5
0
        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);
        }