public static OctreeNode Intersect(this OctreeNode a, Sphere s)
 {
     return a.Intersect(node =>
         {
             if (node.AABB.Inside(s)) return OctreeNode.NodeIntersectResult.Inside;
             if (s.Intersects(node.AABB)) return OctreeNode.NodeIntersectResult.True;
             return OctreeNode.NodeIntersectResult.False;
         });
 }
Exemple #2
0
        public IModel Generate()
        {
            var s1 = new Sphere { Center = Vect3.Zero, Radius = 4 };

            var s2 = new Sphere { Center = new Vect3(-3, -3, -3), Radius = 4 };

            var b = new OctreeNode(Vect3.Zero, 16, 8);

            var t1 = b.Intersect(node =>
            {
                if (node.AABB.Inside(s1)) return OctreeNode.NodeIntersectResult.Inside;
                if (s1.Intersects(node.AABB)) return OctreeNode.NodeIntersectResult.True;
                return OctreeNode.NodeIntersectResult.False;
            });
            var t2 = b.Intersect(node =>
            {
                if (node.AABB.Inside(s2)) return OctreeNode.NodeIntersectResult.Inside;
                if (s2.Intersects(node.AABB)) return OctreeNode.NodeIntersectResult.True;
                return OctreeNode.NodeIntersectResult.False;
            });

            return new OctreeModel(t1.Subtract(t2), "Test Octree");
            return new OctreeModel( new OctreeNode(Vect3.Zero, 16.0, 9).Intersect(s1), "Test Octree");
        }
 public static bool Inside(this AABB b, Sphere s)
 {
     return b.Points.All(p => Inside((Vect3)p, s));
 }
 public static bool Inside(this Vect3 v, Sphere s)
 {
     return (s.Center - v).LengthSquared < s.Radius * s.Radius;
 }