python 检查圆柱体是否在3D中重叠的算法

ljsrvy3e  于 2023-02-18  发布在  Python
关注(0)|答案(1)|浏览(179)

我正在创建一个脚本来在三维空间中生成圆柱体,但是,我希望它们不占据空间中的同一区域(避免重叠)。
圆柱体由起点和终点定义,并且都具有固定半径。
我将现有圆柱体存储在一个名为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

但这并没有考虑到存在横向重叠的情况。
有人有好的算法吗?
致上

ovfsdjhp

ovfsdjhp1#

WLOG其中一个圆柱体是垂直的(否则旋转空间)。如果你看表面轮廓在XY上的投影,你会看到一个圆和一个以椭圆结尾的矩形。(为了简化方程,你也可以使第二个圆柱体平行于XZ。)
如果这些2D形状不重叠,你就完成了。不管怎样,圆和椭圆的相交导致了四次方程。
你可以重复这个过程,交换两个圆柱体的角色,这给出了不重叠的充分条件,不幸的是,我不确定这是必要的,尽管这与平面分离定理有直接的联系。

对于数值方法,可按以下步骤进行:

  • 在规范位置移动圆柱体;
  • 通过绕轴旋转并使用Angular 参数在斜圆柱上生成矩形;
  • 对于矩形的所有边,检测与圆柱的干涉(这涉及一个二次不等式和两个线性不等式的系统,这是相当容易处理的);
  • 对Angular 参数进行足够密集的采样以检查是否没有有效的相交。

我想完整的解析解是可能的,但很复杂,而且无论如何可能会导致需要用数值方法求解的方程。

相关问题