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);
        }
示例#2
0
        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);
        }
示例#6
0
        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);
            }