private static Group CreatePyramid() { var pyramid = new Group("Pyramid"); var bottom = new Triangle(new Point(-0.5, 0, 0), new Point(0, 0, -1), new Point(0.5, 0, 0)); var backSide = new Triangle(new Point(-0.5, 0, 0), new Point(0, 1, -0.5), new Point(0.5, 0, 0)); var leftSide = new Triangle(new Point(-0.5, 0, 0), new Point(0, 1, -0.5), new Point(0, 0, -1)); var rightSide = new Triangle(new Point(0, 0, -1), new Point(0, 1, -0.5), new Point(0.5, 0, 0)); pyramid.AddChildren(bottom, backSide, leftSide, rightSide); return(pyramid); }
public void Intersecting_a_ray_with_a_nonempty_group() { var group = new Group(); var s1 = new Sphere(); var s2 = new Sphere(transform: Matrix4x4.CreateTranslation(0, 0, -3)); var s3 = new Sphere(transform: Matrix4x4.CreateTranslation(5, 0, 0)); group.AddChildren(s1, s2, s3); var ray = new Ray(new Point(0, 0, -5), Vector.UnitZ); var intersections = group.LocalIntersect(ray); intersections.Shapes.Should().HaveCount(4).And.ContainInOrder(s2, s2, s1, s1); }
public void SubDivideGroup() { var s1 = new Sphere(Translation(-2, -2, 0)); var s2 = new Sphere(Translation(-2, 2, 0)); var s3 = new Sphere(Scale(4)); var g = new Group(); g.AddChildren(s1, s2, s3); g.Divide(); Assert.AreEqual(g.Count, 2); Assert.IsFalse(g.Contains(s1)); Assert.IsFalse(g.Contains(s2)); Assert.IsTrue(g.Contains(s3)); }
public void GroupHasBoxContainingChildren() { var s = new Sphere(Translation(2, 5, -3) * Scale(2)); var c = new Cylinder(Translation(-4, -1, 4) * Scale(.5f, 1, .5f)) { Minimum = -2, Maximum = 2 }; var g = new Group(); g.AddChildren(s, c); var b = g.BoundingBox; Assert.AreEqual(b.Min, Point(-4.5f, -3, -5)); Assert.AreEqual(b.Max, Point(4, 7, 4.5f)); }
public void PartitioningChildren() { var s1 = new Sphere(Translation(-2, 0, 0)); var s2 = new Sphere(Translation(2, 0, 0)); var s3 = new Sphere(); var g = new Group(); g.AddChildren(s1, s2, s3); var(left, right) = g.Partition(); Assert.IsTrue(g.Contains(s3)); Assert.IsTrue(left.Contains(s1)); Assert.IsTrue(right.Contains(s2)); Assert.AreEqual(g.Count, 1); Assert.AreEqual(left.Count, 1); Assert.AreEqual(right.Count, 1); }
private static Group CreateUfo() { var group = new Group(); for (int i = 0; i < 6; i++) { var leg = CreateLeg(Matrix4x4.CreateRotationY(i * (Math.PI / 3))); group.AddChild(leg); } var topCap = CreateCap().ChangeTransform(Matrix4x4.CreateTranslation(0, 1, 0)); var bottomCap = CreateCap().ChangeTransform(Matrix4x4.CreateTranslation(0, 1, 0).RotateX(3.1416)); group.AddChildren(topCap, bottomCap); return(group); }
public void IntersectingWithNonEmptyGroup() { var g = new Group(); var s1 = new Sphere(); var s2 = new Sphere(Translation(0, 0, -3)); var s3 = new Sphere(Translation(5, 0, 0)); g.AddChildren(s1, s2, s3); var r = new Ray(0, 0, -5, 0, 0, 1); var xs = g.IntersectLocal(ref r); xs.Sort(); //do not sort in groups as world does already do that Assert.AreEqual(xs.Count, 4); Assert.AreEqual(xs[0].Object, s2); Assert.AreEqual(xs[1].Object, s2); Assert.AreEqual(xs[2].Object, s1); Assert.AreEqual(xs[3].Object, s1); }
static Group HexagonSide() { var mat = new PhongMaterial(Util.FromHex("#7bc74d")) { Specular = .5f, Shininess = 800 }; var edge = new Cylinder(Translation(0, 0, -1) * RotationY(-MathF.PI / 6f) * RotationZ(-MathF.PI / 2f) * Scale(.25f, 1, .25f)) { Minimum = 0, Maximum = 1, Material = mat }; var s = new Sphere(Translation(0, 0, -1) * Scale(.25f)) { Material = mat }; var side = new Group(); side.AddChildren(edge, s); return(side); }