我正在寻找一个库或其他源代码来帮助我显示不相交的球体或球体,不一定是bin包装问题,但它可能是。这些球体中的每一个还可以包含另一组更小的球体。然后,我想通过这个"世界"来拍摄一个切片,即两个相距一定距离的平行平面或一个长方体,并计算有多少更大和更小的球体被捕获"通过给定切片,并生成3D图形。
虽然我在编程方面有很多经验,但3D空间对我来说是新的,而且我的几何有点生锈。我已经查看了R +和R3.js的rgl包,但没有看到明显的解决方案。我已经通过StackOverflow进行了搜索,并且进行了" Cube球体交叉测试?"发帖,但它并没有让我得到我想要的东西。不确定这是否属于"碰撞"问题或更多的立体学问题或许,但CRAN包StereoMorph也没有产生任何答案。
欢迎任何关于我应该看的地方的建议。我也不会使用任何特定的计算机语言。
谢谢!
答案 0 :(得分:1)
球体定义为:
[centerX,centerY,centerZ,radius]
并且平面定义为
[normalVectorX,normalVectorY,normalVectorZ,distance]
距离是指沿着法向量方向行进时距离原点到平面的距离。换句话说,如果将法线向量的每个分量乘以距离,则在平面上的某个位置会有一个点。
测试球体是在平面的一侧还是在另一侧:
将球体中心投影到平面法线上,添加球体的半径,如果该总和小于平面距离,则它没有相交。
CENTER = [centerX,centerY,centerZ]
NORMAL = [normalVectorX,normalVectorY,normalVectorZ]
isBelowHighPlane = dotProduct(CENTER,NORMAL)+radius < distance
对于另一个平面,让我们说“下”平面,减去半径并测试总和是否更大:
isAboveLowPlane = dotProduct(CENTER,NORMAL)-radius > distance
因此,如果上述两个测试均为真,则包含球体。
注意:如果你的飞机是以其他方式定义的,例如空间A,B,C中的三个点,你可以通过任意两个方面的叉积来找到法线:
normalVector = normalize(crossProduct((B-A),(B-C)))
一旦你有了法向量,就可以通过将矢量从原点投射到正常的任何一点来找到距离:
distance = dotProduct(B,normalVector)
注意,距离可能是负数。
因此,您选择的语言所需的3d功能是:
dotProduct()
,crossProduct()
和normalize()
如果你从小球体到它们包含的大球体有一些连接,并且那个大球体完全处于或完全没有,那么你可以立即知道所有小球体的状态。但是,为了测试一个大球体是否完全脱落,你需要在测试中有额外的变化:
isAboveHighPlane = dotProduct(CENTER,NORMAL)-radius > distance
isBelowLowPlane = dotProduct(CENTER,NORMAL)+radius < distance