public Cube(Polyhedron p) { ph = p.Clone() as Polyhedron; outside_sphere = new Sphere(ph); squares.Clear(); foreach (var face in ph.Verges) { double s = 0; int cnt = face.Edges.Count(); for (int i = 1; i < cnt - 1; ++i) { s += triangle_square(face.Edges[0].First, face.Edges[i].First, face.Edges[i + 1].First); } squares.Add(face, s); } }
public Sphere(Polyhedron ph) { var p = ph.Verges[0].Edges[0].First; var dist = new Vector(ph.Center, p).Norm(); foreach (var f in ph.Verges) { foreach (var e in f.Edges) { var pp = e.First; var ddist = new Vector(ph.Center, pp).Norm(); if (ddist > dist) { dist = ddist; p = pp; } } } this.center = ph.Center; this.radius = dist; }
private void Init() { Models.Clear(); colors.Clear(); diffuse.Clear(); reflect.Clear(); trans.Clear(); refract.Clear(); // Сферы Models.Add(new Sphere(new XYZPoint(-2, 1, -2.5), 1)); colors.Add(Models.Last(), Color.White); diffuse.Add(Models.Last(), 0.8); reflect.Add(Models.Last(), 0.2); trans.Add(Models.Last(), 0); refract.Add(Models.Last(), 1.5); Models.Add(new Sphere(new XYZPoint(2, 1, -2.5), 0.5)); colors.Add(Models.Last(), Color.White); diffuse.Add(Models.Last(), 0.3); reflect.Add(Models.Last(), 0.7); trans.Add(Models.Last(), 0); refract.Add(Models.Last(), 1.5); // Кубы Models.Add(new Cube(Polyhedron.CreateHexahedron( new XYZPoint(-3, -3, -5), new XYZPoint(-2, -3, -5), new XYZPoint(-3, -2, -5)))); colors.Add(Models.Last(), Color.Black); diffuse.Add(Models.Last(), 0.8); reflect.Add(Models.Last(), 0.2); trans.Add(Models.Last(), 0); refract.Add(Models.Last(), 1.5); Models.Add(new Cube(Polyhedron.CreateHexahedron( new XYZPoint(-1.5, -4, -5), new XYZPoint(0, -4, -5), new XYZPoint(-1.5, -2.5, -5)))); colors.Add(Models.Last(), Color.Blue); diffuse.Add(Models.Last(), 0.1); reflect.Add(Models.Last(), 0); trans.Add(Models.Last(), 0.5); refract.Add(Models.Last(), 1); // Правая стена Models.Add(new Wall( new XYZPoint(-5, -5, -5), new XYZPoint(-5, -5, 5), new XYZPoint(-5, 5, 5), new XYZPoint(-5, 5, -5))); colors.Add(Models.Last(), Color.LawnGreen); diffuse.Add(Models.Last(), 1); reflect.Add(Models.Last(), 0); trans.Add(Models.Last(), 0); refract.Add(Models.Last(), 1); // Левая стена Models.Add(new Wall( new XYZPoint(5, 5, -5), new XYZPoint(5, 5, 5), new XYZPoint(5, -5, 5), new XYZPoint(5, -5, -5))); colors.Add(Models.Last(), Color.Crimson); diffuse.Add(Models.Last(), 0); reflect.Add(Models.Last(), 1); trans.Add(Models.Last(), 0); refract.Add(Models.Last(), 1); // Передняя стена Models.Add(new Wall( new XYZPoint(5, -5, -5), new XYZPoint(5, -5, 5), new XYZPoint(-5, -5, 5), new XYZPoint(-5, -5, -5))); colors.Add(Models.Last(), Color.Azure); diffuse.Add(Models.Last(), 0.5); reflect.Add(Models.Last(), 0.5); trans.Add(Models.Last(), 0); refract.Add(Models.Last(), 1); // Пол Models.Add(new Wall( new XYZPoint(-5, -5, -5), new XYZPoint(5, -5, -5), new XYZPoint(5, 5, -5), new XYZPoint(-5, 5, -5))); colors.Add(Models.Last(), Color.White); diffuse.Add(Models.Last(), 0.8); reflect.Add(Models.Last(), 0.2); trans.Add(Models.Last(), 0); refract.Add(Models.Last(), 1); lights.Clear(); lights_power.Clear(); lights.Add(new XYZPoint(-4.9, -4.9, -4.9)); lights_power.Add(lights.Last(), 1); lights.Add(new XYZPoint(0, -4.9, 0)); lights_power.Add(lights.Last(), 1); }