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); }
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); }
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)); }
//------------------------------------------------------------------------------------------------------- // пересечение луча с фигурой 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); }
/// ------------------------ГОТОВЫЕ ФИГУРЫ----------------------------- 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); }