public KdNode(KdNodePlane plane, PosVector coord, List <IShape> list, KdNode nodeLeft, KdNode nodeRight) { Plane = plane; Coord = coord; Shapes = list; Left = nodeLeft; Right = nodeRight; }
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(); } }
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); }