Пример #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
        /// <summary>
        /// Построение сетки
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button1_Click(object sender, EventArgs e)
        {
            toolStripStatusLabel1.Text  = @"Выполняется построение модели...";
            toolStripProgressBar1.Value = 0;
            Refresh();

            float pw = Convert.ToSingle(_layers[0].Dicom.PixelSpacingValue[0], CultureInfo.InvariantCulture.NumberFormat);
            float ph = Convert.ToSingle(_layers[0].Dicom.PixelSpacingValue[1], CultureInfo.InvariantCulture.NumberFormat);

            Volume volume = new Volume(_layers, pw, ph);
            var    depth  = _layers[0].Dicom.pixelDepth;
            var    space  = _layers[0].Dicom.pixeSpace;
            var    t      = MCCube.getTriangles(volume);
            int    koeff  = 18;

            for (int k = 0; k < t.Count - 2; k += 3)
            {
                var    trg  = new MyTriangle(t[k], t[k + 1], t[k + 2]);
                Vertex vrt1 = new Vertex(t[k].X * koeff, t[k].Z * koeff * (-1), t[k].Y * koeff);
                Vertex vrt2 = new Vertex(t[k + 1].X * koeff, t[k + 1].Z * koeff * (-1), t[k + 1].Y * koeff);
                Vertex vrt3 = new Vertex(t[k + 2].X * koeff, t[k + 2].Z * koeff * (-1), t[k + 2].Y * koeff);
                var    trg2 = new MyTriangle(vrt1, vrt2, vrt3);
                _triangles.Add(trg2);
            }

            SystemSounds.Beep.Play();
            MessageBox.Show("Done!!!");
            toolStripStatusLabel1.Text = @"Реконструкция 3D модели позвонка завершена. Число треугольников:" + _triangles.Count.ToString();

            Stream  myStream = new FileStream(@"Stl\Vertebras\st1\L1.stl", FileMode.Create);
            StlFile stl      = new StlFile
            {
                SolidName = "my",
                Triangles = _triangles
            };

            stl.Save(myStream, true);
            myStream.Close();



            btn_render_start.Enabled           = true;
            btn_render_stop.Enabled            = true;
            сохранитьToolStripMenuItem.Enabled = true;
            button2.Enabled = true;
            Refresh();
        }