/// <summary> /// Параллельный перенос 3D объекта. /// </summary> /// <param name="item">3D объект.</param> /// <param name="X">Смещение по оси X.</param> /// <param name="Y">Смещение по оси Y.</param> /// <param name="Z">Смещение по оси Z.</param> static public void Translate(Abstract3DInstance item, double X, double Y, double Z) { foreach (Point3D point in item.Points) { point.X += X; point.Y += Y; point.Z += Z; } }
/// <summary> /// Масштабирования 3D объекта. /// </summary> /// <param name="item">3D объект.</param> /// <param name="scaleFactor">масштабный множитель</param> /// <param name="Xc">X координата точки масштабирования.</param> /// <param name="Yc">Y координата точки масштабирования.</param> /// <param name="Zc">Z координата точки масштабирования.</param> static public void Scale(Abstract3DInstance item, double scaleFactor, double Xc, double Yc, double Zc) { foreach (Point3D point in item.Points) { point.X = scaleFactor * (point.X - Xc) + Xc; point.Y = scaleFactor * (point.Y - Yc) + Yc; point.Z = scaleFactor * (point.Z - Zc) + Zc; } }
void FirstTransformation(Abstract3DInstance instance, double Xc, double Yc) { if (instance == null) { return; } TransformEngine.Scale(instance, 140, 0, 0, 0); TransformEngine.Translate(instance, Xc, Yc, 0); _scaleFactor = 1; }
/// <summary> /// Поворот в плоскости YZ. /// </summary> /// <param name="item">3D объект.</param> /// <param name="angle">Угол в радианах.</param> /// <param name="Yc">Y координата центра вращения.</param> /// <param name="Zc">Z координата центра вращения.</param> static public void RotateYZ(Abstract3DInstance item, double angle, double Yc, double Zc) { double si = Math.Sin(angle); double co = Math.Cos(angle); foreach (Point3D point in item.Points) { double y = co * (point.Y - Yc) - si * (point.Z - Zc) + Yc; double z = si * (point.Y - Yc) + co * (point.Z - Zc) + Zc; point.Y = y; point.Z = z; } }
/// <summary> /// Поворот в плоскости XZ. /// </summary> /// <param name="item">3D объект.</param> /// <param name="angle">Угол в радианах.</param> /// <param name="Xc">X координата центра вращения.</param> /// <param name="Zc">Z координата центра вращения.</param> static public void RotateXZ(Abstract3DInstance item, double angle, double Xc, double Zc) { double si = Math.Sin(angle); double co = Math.Cos(angle); foreach (Point3D point in item.Points) { double x = co * (point.X - Xc) - si * (point.Z - Zc) + Xc; double z = si * (point.X - Xc) + co * (point.Z - Zc) + Zc; point.X = x; point.Z = z; } }
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { int index = comboBox1.SelectedIndex; if (index < 0) { return; } _instance3D = Factory3Dinstance.GetInstance(index); FirstTransformation(_instance3D, pictureBox1.Width / 2, pictureBox1.Height / 2); trackBar1.Value = (trackBar1.Minimum + trackBar1.Maximum) / 2; Render(); }
/// <summary> /// Получение 3D объекта по id. /// </summary> /// <param name="id"></param> /// <returns>Экземпляр класса Abstract3DInstance.</returns> static public Abstract3DInstance GetInstance(int id) { Abstract3DInstance instance = null; switch (id) { case 0: instance = new Cube(); break; case 1: instance = new Tetrahedron(); break; case 2: instance = new Octahedron(); break; } return(instance); }
void Render3DInstance(Abstract3DInstance instance, Graphics g, Point3D centerPerspective, int mode) { if (instance == null) { return; } Pen pen = new Pen(Color.Black, 3f); Pen dashPen = new Pen(Color.Black, 3f) { DashStyle = System.Drawing.Drawing2D.DashStyle.Dash }; IEnumerable <Edge> edges = checkBox1.Checked ? instance.Render(new PerspectiveTransform(), centerPerspective) : instance.Render(); foreach (Edge e in edges) { switch (mode) { case 0: g.DrawLine(pen, e.Point1.ToPointF(), e.Point2.ToPointF()); break; case 1: if (e.Visible) { g.DrawLine(pen, e.Point1.ToPointF(), e.Point2.ToPointF()); } break; case 2: g.DrawLine(e.Visible ? pen : dashPen, e.Point1.ToPointF(), e.Point2.ToPointF()); break; } } }