Это довольно общий вопрос, и он зависит от того, что вы хотите знать о твердом теле и как быстро вы хотите это знать. Предполагая, что вам нужны только тесты членства, это может сработать (psuedocode):
class Solid {
Solid solids = [] // each Solid has a list of solids that
// have been subtracted from it.
abstract method containedInSelf(point) {
// this will obviously vary from one type of solid to another
}
method contains(point) {
if !containedInSelf(point) return False;
else {
for solid in solids { // loop over all contained solids
if solid.contains(point) return False;
// point is contained in a solid that has been subtracted from it
}
// Now we know that point is contained but not contained in anything
// that's been subtracted
return True;
}
}
method subtract(solid) {
solids.append(solid)
}
}
Преимущество состоит в том, что вы можете составлять вычитания. Например, вы можете вычесть твердое A
из твердого B
, а затем твердое B
из твердого C
, и оно будет работать, как и ожидалось. Например, с тремя сферами по центру в начале координат и radius(A) < radius(B) < radius(C)
, вы получите очки, которые содержатся в A
или содержатся в C
, но не B
.
Вы также можете, например, вычесть два додекаэдра из сферы и затем вычесть это кубу. Это, конечно, то же самое, что вычесть сферу из куба и добавить обратно два додекаэдра.