Point3 p = new Point3(halfTableDiag * cost1, halfTableDiag * sint1, 0.0);
Point3 q = new Point3(radius * cost1, radius * sint1, -crownHeight);
Point3 r;
Basis3 basis = Basis3.fromUW(p.vectorTo(q), Vector3.K);
Plane3 planeKite = Plane3.throughPoint(p, basis);
b.slice(planeKite, true);
q = new Point3(halfTableDiag * cost3, halfTableDiag * sint3, 0.0);
r = new Point3(starPointRadius * cost2, starPointRadius * sint2, 0.0);
Ray3 ray = new Ray3(r, Vector3.K);
r = ray.pointAt(planeKite.intersect(ray));
Plane3 planeStar = Plane3.throughPoints(q, p, r);
b.slice(planeStar, true);
p = new Point3(radius * cost2, radius * sint2, -crownHeight);
q = new Point3(radius * cost1, radius * sint1, -crownHeight);
Plane3 planeGirdle = Plane3.throughPoints(q, p, r);
b.slice(planeGirdle, true);
q = new Point3(radius * cost3, radius * sint3, -crownHeight);
planeGirdle = Plane3.throughPoints(p, q, r);
b.slice(planeGirdle, true);
p = new Point3(radius * cost1, radius * sint1, lowerMainTop);
q = new Point3(0.0, 0.0, lowerMainTop - pavilionPointDepth);
basis = Basis3.fromUW(p.vectorTo(q), Vector3.NEGATIVE_K);
Plane3 planeMain = Plane3.throughPoint(p, basis);
b.slice(planeMain, true);
q = new Point3(radius * cost0, radius * sint0, lowerMainTop);
r = new Point3(lowerGirdleInner * cost0, lowerGirdleInner * sint0, 0.0);
ray = new Ray3(r, Vector3.NEGATIVE_K);
r = ray.pointAt(planeMain.intersect(ray));
planeGirdle = Plane3.throughPoints(p, q, r);
b.slice(planeGirdle, true);
q = new Point3(radius * cost2, radius * sint2, lowerMainTop);
r = new Point3(lowerGirdleInner * cost2, lowerGirdleInner * sint2, 0.0);
ray = new Ray3(r, Vector3.NEGATIVE_K);
r = ray.pointAt(planeMain.intersect(ray));
planeGirdle = Plane3.throughPoints(q, p, r);
b.slice(planeGirdle, true);
}