Пример #1
0
 public KdNode(KdNodePlane plane, PosVector coord, List <IShape> list, KdNode nodeLeft, KdNode nodeRight)
 {
     Plane  = plane;
     Coord  = coord;
     Shapes = list;
     Left   = nodeLeft;
     Right  = nodeRight;
 }
Пример #2
0
        private PosVector GetVectorPlaneIntersection(Ray ray, KdNodePlane plane, PosVector coord)
        {
            switch (plane)
            {
            case KdNodePlane.XY:
                if (((coord.Z < ray.Position.Z) && (ray.Direction.Z > 0.0)) ||
                    ((coord.Z > ray.Position.Z) && (ray.Direction.Z < 0.0)))
                {
                    return(null);
                }
                else
                {
                    double k = (coord.Z - ray.Position.Z) / ray.Direction.Z;
                    return(new PosVector(
                               ray.Position.X + (ray.Direction.X * k),
                               ray.Position.Y + (ray.Direction.Y * k),
                               coord.Z));
                }

            case KdNodePlane.XZ:
                if (((coord.Y < ray.Position.Y) && (ray.Direction.Y > 0.0)) ||
                    ((coord.Y > ray.Position.Y) && (ray.Direction.Y < 0.0)))
                {
                    return(null);
                }
                else
                {
                    double k = (coord.Y - ray.Position.Y) / ray.Direction.Y;
                    return(new PosVector(
                               ray.Position.X + (ray.Direction.X * k),
                               coord.Y,
                               ray.Position.Z + (ray.Direction.Z * k)));
                }

            case KdNodePlane.YZ:
                if (((coord.X < ray.Position.X) && (ray.Direction.X > 0.0)) ||
                    ((coord.X > ray.Position.X) && (ray.Direction.X < 0.0)))
                {
                    return(null);
                }
                else
                {
                    double k = (coord.X - ray.Position.X) / ray.Direction.X;
                    return(new PosVector(
                               coord.X,
                               ray.Position.Y + (ray.Direction.Y * k),
                               ray.Position.Z + (ray.Direction.Z * k)));
                }

            default:
                throw new InvalidOperationException();
            }
        }
Пример #3
0
        private static (BoundingBox, BoundingBox) SplitBoundingBox(
            BoundingBox bbox,
            KdNodePlane plane,
            PosVector coord)
        {
            BoundingBox bboxLeft;
            BoundingBox bboxRight;

            switch (plane)
            {
            case KdNodePlane.XY:
                bboxLeft = new BoundingBox(
                    new Bound(bbox.BoxMin.X, bbox.BoxMax.X),
                    new Bound(bbox.BoxMin.Y, bbox.BoxMax.Y),
                    new Bound(bbox.BoxMin.Z, coord.Z));
                bboxRight = new BoundingBox(
                    new Bound(bbox.BoxMin.X, bbox.BoxMax.X),
                    new Bound(bbox.BoxMin.Y, bbox.BoxMax.Y),
                    new Bound(coord.Z, bbox.BoxMax.Z));
                break;

            case KdNodePlane.XZ:
                bboxLeft = new BoundingBox(
                    new Bound(bbox.BoxMin.X, bbox.BoxMax.X),
                    new Bound(bbox.BoxMin.Y, coord.Y),
                    new Bound(bbox.BoxMin.Z, bbox.BoxMax.Z));
                bboxRight = new BoundingBox(
                    new Bound(bbox.BoxMin.X, bbox.BoxMax.X),
                    new Bound(coord.Y, bbox.BoxMax.Y),
                    new Bound(bbox.BoxMin.Z, bbox.BoxMax.Z));
                break;

            case KdNodePlane.YZ:
                bboxLeft = new BoundingBox(
                    new Bound(bbox.BoxMin.X, coord.X),
                    new Bound(bbox.BoxMin.Y, bbox.BoxMax.Y),
                    new Bound(bbox.BoxMin.Z, bbox.BoxMax.Z));
                bboxRight = new BoundingBox(
                    new Bound(coord.X, bbox.BoxMax.X),
                    new Bound(bbox.BoxMin.Y, bbox.BoxMax.Y),
                    new Bound(bbox.BoxMin.Z, bbox.BoxMax.Z));
                break;

            default:
                throw new InvalidOperationException();
            }

            return(bboxLeft, bboxRight);
        }