Esempio n. 1
0
 public ShapeSide(ShapeSide s)
 {
     points      = new List <int>(s.points);
     host        = s.host;
     drawing_pen = s.drawing_pen.Clone() as Pen;
     Normal      = new Point(s.Normal);
 }
Esempio n. 2
0
        public void build_scene()
        {
            Shape room = Shape.get_cube(10);

            //сторона комнаты
            up_left    = room.sides[0].get_point(0);
            up_right   = room.sides[0].get_point(1);
            down_right = room.sides[0].get_point(2);
            down_left  = room.sides[0].get_point(3);

            Point normal = ShapeSide.norm(room.sides[0]);                       // нормаль стороны комнаты
            Point center = (up_left + up_right + down_left + down_right) / 4;   // центр стороны комнаты

            focus = center + normal * 10;

            room.set_pen(new Pen(Color.Gray));
            room.sides[0].drawing_pen = new Pen(Color.Yellow);
            room.sides[3].drawing_pen = new Pen(Color.Red);
            room.sides[2].drawing_pen = new Pen(Color.Green);
            room.sides[1].drawing_pen = new Pen(Color.Blue);
            room.figure_material      = new Material(0f, 0, 0.2f, 0.7f);

            Light l1 = new Light(new Point(0f, 2f, 4.9f), new Point(1f, 1f, 1f));

            //Light l2 = new Light(new Point(4.5f, -1f, 4f), new Point(1f, 1f, 1f));
            lights.Add(l1);
            //lights.Add(l2);

            //прозрачная сфера
            ShapeSphere s1 = new ShapeSphere(new Point(-2.5f, 3, -4f), 1f);

            s1.set_pen(new Pen(Color.White));
            s1.figure_material = new Material(0f, 0.9f, 0.1f, 0f, 1.3f);

            //зеркальная сфера
            ShapeSphere s2 = new ShapeSphere(new Point(1.5f, 2, -3.7f), 1.5f);

            s2.set_pen(new Pen(Color.White));
            s2.figure_material = new Material(0.9f, 0f, 0f, 0.1f, 1.5f);

            //куб
            Shape cube = Shape.get_cube(3.0f);

            cube.offset(-2.5f, -1, -3.5f);
            cube.rotate_around(55, "CZ");
            cube.set_pen(new Pen(Color.Purple));
            cube.figure_material = new Material(0f, 0f, 0.3f, 0.7f, 1.5f);


            scene.Add(room);
            scene.Add(cube);
            scene.Add(s1);
            scene.Add(s2);
        }
Esempio n. 3
0
        public static Point norm(ShapeSide S)
        {
            if (S.points.Count() < 3)
            {
                return(new Point(0, 0, 0));
            }
            Point U      = S.get_point(1) - S.get_point(0);
            Point V      = S.get_point(S.points.Count - 1) - S.get_point(0);
            Point normal = U * V;

            return(Point.norm(normal));
        }
Esempio n. 4
0
        //-------------------------------------------------------------------------------------------------------
        // пересечение луча с фигурой
        public virtual bool figure_intersection(Ray r, out float intersect, out Point normal)
        {
            intersect = 0;
            normal    = null;
            ShapeSide sd = null;


            foreach (ShapeSide s in sides)
            {
                if (s.points.Count == 3)
                {
                    float t;
                    if (ray_intersects_triangle(r, s.get_point(0), s.get_point(1), s.get_point(2), out t) && (intersect == 0 || t < intersect))
                    {
                        intersect = t;
                        sd        = s;
                    }
                }
                else if (s.points.Count == 4)
                {
                    float t;
                    if (ray_intersects_triangle(r, s.get_point(0), s.get_point(1), s.get_point(3), out t) && (intersect == 0 || t < intersect))
                    {
                        intersect = t;
                        sd        = s;
                    }
                    else if (ray_intersects_triangle(r, s.get_point(1), s.get_point(2), s.get_point(3), out t) && (intersect == 0 || t < intersect))
                    {
                        intersect = t;
                        sd        = s;
                    }
                }
            }

            if (intersect != 0)
            {
                normal = ShapeSide.norm(sd);
                figure_material.clr = new Point(sd.drawing_pen.Color.R / 255f, sd.drawing_pen.Color.G / 255f, sd.drawing_pen.Color.B / 255f);
                return(true);
            }

            return(false);
        }
Esempio n. 5
0
        /// ------------------------ГОТОВЫЕ ФИГУРЫ-----------------------------


        static public Shape get_cube(float sz)
        {
            Shape res = new Shape();

            res.points.Add(new Point(sz / 2, sz / 2, sz / 2));    // 0
            res.points.Add(new Point(-sz / 2, sz / 2, sz / 2));   // 1
            res.points.Add(new Point(-sz / 2, sz / 2, -sz / 2));  // 2
            res.points.Add(new Point(sz / 2, sz / 2, -sz / 2));   //3

            res.points.Add(new Point(sz / 2, -sz / 2, sz / 2));   // 4
            res.points.Add(new Point(-sz / 2, -sz / 2, sz / 2));  //5
            res.points.Add(new Point(-sz / 2, -sz / 2, -sz / 2)); // 6
            res.points.Add(new Point(sz / 2, -sz / 2, -sz / 2));  // 7

            ShapeSide s = new ShapeSide(res);

            s.points.AddRange(new int[] { 3, 2, 1, 0 });
            res.sides.Add(s);

            s = new ShapeSide(res);
            s.points.AddRange(new int[] { 4, 5, 6, 7 });
            res.sides.Add(s);

            s = new ShapeSide(res);
            s.points.AddRange(new int[] { 2, 6, 5, 1 });
            res.sides.Add(s);

            s = new ShapeSide(res);
            s.points.AddRange(new int[] { 0, 4, 7, 3 });
            res.sides.Add(s);

            s = new ShapeSide(res);
            s.points.AddRange(new int[] { 1, 5, 4, 0 });
            res.sides.Add(s);

            s = new ShapeSide(res);
            s.points.AddRange(new int[] { 2, 3, 7, 6 });
            res.sides.Add(s);

            return(res);
        }