Beispiel #1
0
        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;
            }
        }
Beispiel #2
0
 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();
 }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
        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);
        }
Beispiel #6
0
 private void axis_choice_button_Click(object sender, EventArgs e) // выбираем точки для поворота вокруг оси
 {
     if (axis_P1 != null)
     {
         axis_P1 = axis_P2 = null;
         redraw_image();
     }
     is_axis = true;
 }
Beispiel #7
0
        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));
        }
Beispiel #8
0
        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);
        }
Beispiel #9
0
        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);
        }
Beispiel #10
0
        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;
            }
        }
Beispiel #11
0
 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;
 }
Beispiel #12
0
        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);
        }
Beispiel #13
0
        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);
        }
Beispiel #14
0
        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);
        }
Beispiel #15
0
 public void add(my_point p)
 {
     points.Add(p);
 }
Beispiel #16
0
 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);
 }
Beispiel #17
0
 private void axis_del_button_Click(object sender, EventArgs e) // удаляем ось
 {
     axis_P1 = axis_P2 = null;
     redraw_image();
 }