我正在创建一个脚本来在三维空间中生成圆柱体,但是,我希望它们不占据空间中的同一区域(避免重叠)。
圆柱体由起点和终点定义,并且都具有固定半径。
我将现有圆柱体存储在一个名为listOfCylinders
的数组中,该数组是一个nDim形状数组(nCylinders,2Points [start,end],每个点的{x,y,z}坐标)
我可以编造:
def detect_overlap(new_start, new_end, listOfCylinders):
starts = listOfCylinders[:, 0]
ends = listOfCylinders[:, 1]
radius = 0.1
# Calculate the distance between the new cylinder and all the existing cylinders
dists = np.linalg.norm(np.cross(new_end - new_start, starts - new_start), axis=1) / np.linalg.norm(new_end - new_start)
# Check if any of the distances are less than the sum of the radii
if np.any(dists < (2*radius)):
return True
# If no overlap or intersection is found, return False
return False
但这并没有考虑到存在横向重叠的情况。
有人有好的算法吗?
致上
1条答案
按热度按时间ovfsdjhp1#
WLOG其中一个圆柱体是垂直的(否则旋转空间)。如果你看表面轮廓在XY上的投影,你会看到一个圆和一个以椭圆结尾的矩形。(为了简化方程,你也可以使第二个圆柱体平行于XZ。)
如果这些2D形状不重叠,你就完成了。不管怎样,圆和椭圆的相交导致了四次方程。
你可以重复这个过程,交换两个圆柱体的角色,这给出了不重叠的充分条件,不幸的是,我不确定这是必要的,尽管这与平面分离定理有直接的联系。
对于数值方法,可按以下步骤进行:
我想完整的解析解是可能的,但很复杂,而且无论如何可能会导致需要用数值方法求解的方程。