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); }
/// <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(); }