private void axis_rotate(my_point pt1, my_point pt2, double angle) // поворот вокруг оси { my_point c = normalize_vector(pt1, pt2); double x = c.X, y = c.Y, z = c.Z; double d = Math.Sqrt(y * y + z * z); double alpha = -Math.Asin(y / d); double beta = Math.Asin(x); foreach (my_point p in points) { p.X -= pt1.X; p.Y -= pt1.Y; p.Z -= pt1.Z; rotate_0X(p, alpha); rotate_0Y(p, beta); rotate_0Z(p, angle); rotate_0Y(p, -beta); rotate_0X(p, -alpha); p.X += pt1.X; p.Y += pt1.Y; p.Z += pt1.Z; } }
private void cancel_button_Click(object sender, EventArgs e) // отмена { axis_P1 = axis_P2 = null; checkBox1.Checked = is_axis = false; shape_CheckedChanged(null, null); redraw_image(); }
private void rotate_0Z(my_point p, double angle) // поворот вокруг OZ { double x = p.X; double y = p.Y; p.X = x * Math.Cos(angle) + y * Math.Sin(angle); p.Y = x * -Math.Sin(angle) + y * Math.Cos(angle); }
private void rotate_0Y(my_point p, double angle) // поворот вокруг OY { double x = p.X; double z = p.Z; p.X = x * Math.Cos(angle) + z * -Math.Sin(angle); p.Z = x * Math.Sin(angle) + z * Math.Cos(angle); }
private void rotate_0X(my_point p, double angle) // поворот вокруг OX { double y = p.Y; double z = p.Z; p.Y = y * Math.Cos(angle) + z * Math.Sin(angle); p.Z = y * -Math.Sin(angle) + z * Math.Cos(angle); }
private void axis_choice_button_Click(object sender, EventArgs e) // выбираем точки для поворота вокруг оси { if (axis_P1 != null) { axis_P1 = axis_P2 = null; redraw_image(); } is_axis = true; }
private my_point normalize_vector(my_point pt1, my_point pt2) // нормализуем вектор { double x = pt2.X - pt1.X; double y = pt2.Y - pt1.Y; double z = pt2.Z - pt1.Z; double length = Math.Sqrt(x * x + y * y + z * z); return(new my_point(x / length, y / length, z / length)); }
private void build_tetrahedron() { double h = Math.Sqrt(3) / 2 * 100; my_point p1 = new my_point(-50, -h / 2, 0); my_point p2 = new my_point(0, -h / 2, -h); my_point p3 = new my_point(50, -h / 2, 0); my_point p4 = new my_point(0, h / 2, 0); face f1 = new face(); f1.add(p1); f1.add(p2); f1.add(p3); shape.Add(f1); face f2 = new face(); f2.add(p1); f2.add(p4); f2.add(p2); shape.Add(f2); face f3 = new face(); f3.add(p4); f3.add(p2); f3.add(p3); shape.Add(f3); face f4 = new face(); f4.add(p1); f4.add(p4); f4.add(p3); shape.Add(f4); }
private void build_hexahedron() { my_point p1 = new my_point(-50, -50, -50); my_point p2 = new my_point(-50, 50, -50); my_point p3 = new my_point(50, 50, -50); my_point p4 = new my_point(50, -50, -50); my_point p5 = new my_point(-50, -50, 50); my_point p6 = new my_point(-50, 50, 50); my_point p7 = new my_point(50, 50, 50); my_point p8 = new my_point(50, -50, 50); face f1 = new face(); f1.add(p1); f1.add(p2); f1.add(p3); f1.add(p4); shape.Add(f1); face f2 = new face(); f2.add(p1); f2.add(p2); f2.add(p6); f2.add(p5); shape.Add(f2); face f3 = new face(); f3.add(p5); f3.add(p6); f3.add(p7); f3.add(p8); shape.Add(f3); face f4 = new face(); f4.add(p4); f4.add(p3); f4.add(p7); f4.add(p8); shape.Add(f4); face f5 = new face(); f5.add(p2); f5.add(p6); f5.add(p7); f5.add(p3); shape.Add(f5); face f6 = new face(); f6.add(p1); f6.add(p5); f6.add(p8); f6.add(p4); shape.Add(f6); }
private void scaling(double xScale, double yScale, double zScale) // масштабирование { my_point center_P = center_point(); foreach (my_point p in points) { p.X -= center_P.X; p.Y -= center_P.Y; p.Z -= center_P.Z; p.X *= xScale; p.Y *= yScale; p.Z *= zScale; p.X += center_P.X; p.Y += center_P.Y; p.Z += center_P.Z; } }
private void pictureBox_MouseClick(object sender, MouseEventArgs e) { if (!is_axis || e.Button != System.Windows.Forms.MouseButtons.Left) { return; } if (axis_P1 == null) { axis_P1 = new my_point((e.X - centerX), (-e.Y + centerY), 0); draw_point(axis_P1); } else { axis_P2 = new my_point((e.X - centerX), (-e.Y + centerY), 0); draw_point(axis_P2); g.DrawLine(pen_axis, (int)Math.Round(axis_P1.X + centerX), (int)Math.Round(-axis_P1.Y + centerY), (int)Math.Round(axis_P2.X + centerX), (int)Math.Round(-axis_P2.Y + centerY)); is_axis = false; } pictureBox.Image = bmp; }
private void build_octahedron() { double a = Math.Sqrt(3) / 2 * 100; double p = (a + a + 100) / 2; double h = 2 * Math.Sqrt(p * (p - 100) * (p - a) * (p - a)) / 100; my_point p1 = new my_point(0, -h, 0); my_point p2 = new my_point(-50, 0, -50); my_point p3 = new my_point(0, h, 0); my_point p4 = new my_point(50, 0, -50); my_point p5 = new my_point(-50, 0, 50); my_point p6 = new my_point(50, 0, 50); face f1 = new face(); f1.add(p2); f1.add(p3); f1.add(p4); shape.Add(f1); face f2 = new face(); f2.add(p2); f2.add(p1); f2.add(p4); shape.Add(f2); face f3 = new face(); f3.add(p2); f3.add(p3); f3.add(p5); shape.Add(f3); face f4 = new face(); f4.add(p2); f4.add(p1); f4.add(p5); shape.Add(f4); face f5 = new face(); f5.add(p4); f5.add(p3); f5.add(p6); shape.Add(f5); face f6 = new face(); f6.add(p4); f6.add(p1); f6.add(p6); shape.Add(f6); face f7 = new face(); f7.add(p5); f7.add(p3); f7.add(p6); shape.Add(f7); face f8 = new face(); f8.add(p5); f8.add(p1); f8.add(p6); shape.Add(f8); }
private void build_dodecahedron() { double r = 100 * (3 + Math.Sqrt(5)) / 4; // радиус полувписанной окружности double x = 100 * (1 + Math.Sqrt(5)) / 4; // половина стороны пятиугольника в сечении my_point p1 = new my_point(0, -50, -r); my_point p2 = new my_point(0, 50, -r); my_point p3 = new my_point(x, x, -x); my_point p4 = new my_point(r, 0, -50); my_point p5 = new my_point(x, -x, -x); my_point p6 = new my_point(50, -r, 0); my_point p7 = new my_point(-50, -r, 0); my_point p8 = new my_point(-x, -x, -x); my_point p9 = new my_point(-r, 0, -50); my_point p10 = new my_point(-x, x, -x); my_point p11 = new my_point(-50, r, 0); my_point p12 = new my_point(50, r, 0); my_point p13 = new my_point(-x, -x, x); my_point p14 = new my_point(0, -50, r); my_point p15 = new my_point(x, -x, x); my_point p16 = new my_point(0, 50, r); my_point p17 = new my_point(-x, x, x); my_point p18 = new my_point(x, x, x); my_point p19 = new my_point(-r, 0, 50); my_point p20 = new my_point(r, 0, 50); face f1 = new face(); f1.add(p1); f1.add(p2); f1.add(p3); f1.add(p4); f1.add(p5); shape.Add(f1); face f2 = new face(); f2.add(p1); f2.add(p5); f2.add(p6); f2.add(p7); f2.add(p8); shape.Add(f2); face f3 = new face(); f3.add(p1); f3.add(p2); f3.add(p10); f3.add(p9); f3.add(p8); shape.Add(f3); face f4 = new face(); f4.add(p2); f4.add(p10); f4.add(p11); f4.add(p12); f4.add(p3); shape.Add(f4); face f5 = new face(); f5.add(p4); f5.add(p5); f5.add(p6); f5.add(p15); f5.add(p20); shape.Add(f5); face f6 = new face(); f6.add(p4); f6.add(p3); f6.add(p12); f6.add(p18); f6.add(p20); shape.Add(f6); face f7 = new face(); f7.add(p9); f7.add(p8); f7.add(p7); f7.add(p13); f7.add(p19); shape.Add(f7); face f8 = new face(); f8.add(p9); f8.add(p10); f8.add(p11); f8.add(p17); f8.add(p19); shape.Add(f8); face f9 = new face(); f9.add(p11); f9.add(p12); f9.add(p18); f9.add(p16); f9.add(p17); shape.Add(f9); face f10 = new face(); f10.add(p7); f10.add(p6); f10.add(p15); f10.add(p14); f10.add(p13); shape.Add(f10); face f11 = new face(); f11.add(p19); f11.add(p17); f11.add(p16); f11.add(p14); f11.add(p13); shape.Add(f11); face f12 = new face(); f12.add(p16); f12.add(p14); f12.add(p15); f12.add(p20); f12.add(p18); shape.Add(f12); }
private void build_icosahedron() // икосаэдр { double r = 100 * (1 + Math.Sqrt(5)) / 4; // радиус полувписанной окружности my_point p1 = new my_point(0, -50, -r); my_point p2 = new my_point(0, 50, -r); my_point p3 = new my_point(50, r, 0); my_point p4 = new my_point(r, 0, -50); my_point p5 = new my_point(50, -r, 0); my_point p6 = new my_point(-50, -r, 0); my_point p7 = new my_point(-r, 0, -50); my_point p8 = new my_point(-50, r, 0); my_point p9 = new my_point(r, 0, 50); my_point p10 = new my_point(-r, 0, 50); my_point p11 = new my_point(0, -50, r); my_point p12 = new my_point(0, 50, r); face f1 = new face(); f1.add(p1); f1.add(p2); f1.add(p4); shape.Add(f1); face f2 = new face(); f2.add(p1); f2.add(p2); f2.add(p7); shape.Add(f2); face f3 = new face(); f3.add(p7); f3.add(p2); f3.add(p8); shape.Add(f3); face f4 = new face(); f4.add(p8); f4.add(p2); f4.add(p3); shape.Add(f4); face f5 = new face(); f5.add(p4); f5.add(p2); f5.add(p3); shape.Add(f5); face f6 = new face(); f6.add(p6); f6.add(p1); f6.add(p5); shape.Add(f6); face f7 = new face(); f7.add(p6); f7.add(p7); f7.add(p10); shape.Add(f7); face f8 = new face(); f8.add(p10); f8.add(p7); f8.add(p8); shape.Add(f8); face f9 = new face(); f9.add(p10); f9.add(p8); f9.add(p12); shape.Add(f9); face f10 = new face(); f10.add(p12); f10.add(p8); f10.add(p3); shape.Add(f10); face f11 = new face(); f11.add(p9); f11.add(p4); f11.add(p3); shape.Add(f11); face f12 = new face(); f12.add(p5); f12.add(p4); f12.add(p9); shape.Add(f12); face f13 = new face(); f13.add(p12); f13.add(p3); f13.add(p9); shape.Add(f13); face f14 = new face(); f14.add(p5); f14.add(p1); f14.add(p4); shape.Add(f14); face f15 = new face(); f15.add(p7); f15.add(p1); f15.add(p6); shape.Add(f15); face f16 = new face(); f16.add(p11); f16.add(p5); f16.add(p6); shape.Add(f16); face f17 = new face(); f17.add(p11); f17.add(p6); f17.add(p10); shape.Add(f17); face f18 = new face(); f18.add(p11); f18.add(p10); f18.add(p12); shape.Add(f18); face f19 = new face(); f19.add(p11); f19.add(p12); f19.add(p9); shape.Add(f19); face f20 = new face(); f20.add(p11); f20.add(p5); f20.add(p9); shape.Add(f20); }
public void add(my_point p) { points.Add(p); }
private void draw_point(my_point p) // рисуем точку { g.FillEllipse(new SolidBrush(Color.Red), (int)Math.Round(p.X + centerX - 3), (int)Math.Round(-p.Y + centerY - 3), 6, 6); }
private void axis_del_button_Click(object sender, EventArgs e) // удаляем ось { axis_P1 = axis_P2 = null; redraw_image(); }