【问题标题】:Determine the points of intersection between N spheres确定 N 个球体之间的交点
【发布时间】:2011-09-21 22:33:30
【问题描述】:

只是想知道确定 N 个球体上交点的最佳方法(就速度和准确性而言)是什么(要求两个球体here);想知道什么是最好的语言来做到这一点。关于我想做的更详细的解释是here

【问题讨论】:

    标签: performance geometry scientific-computing computation


    【解决方案1】:

    如果我猜对了,你想要一组 N 个球体中至少两个球体的所有交点,对吧?

    如果是这样,这对于高性能计算来说实际上不是一个简单的问题,至少如果您需要一个准确的解决方案则不是。 这个问题在计算分子的“缩小面”时也解决了:

    http://www.ncbi.nlm.nih.gov/pubmed/8906967

    关于如何有效地计算这些点和圆的出版物有很多,但这并不是一件容易的事。 我相信有一个出版物用 CUDA 计算这些值,但我不记得细节了。 Google (Scholar) 应该能够在这个方向上为您提供帮助。

    但是,根据您想要实现的目标,可能会有更简单的解决方案。 那么,也许您可​​以详细说明您的问题?

    【讨论】:

    【解决方案2】:

    据我所知,您正在询问每对 N 个 3D 球体的交叉点。 算上对称性,有 N * (N-1) / 2 对。

    所以拿走每一对。 如果中心之间的距离大于它们的半径之和,则不存在交集。 (编辑:或者,正如@Ben 指出的那样,如果距离小于半径的差异,也没有交点。)

    如果相等,则交点是一个点,很容易在中心之间的线段上找到。 如果小于,则轨迹是一个圆,而不是一个点。

    要找到该圆的中心及其半径,您需要对两个球体进行平面切片。 这将问题减少到找到两个圆的交点。 为此,您需要Law of Cosines

    详细说明:看看那个维基百科图表。 ab 是两个球体的半径,c 是中心之间的距离。 使用倒数第二个方程求解 cos(alpha)。 从中您可以轻松获得 sin(alpha)。 那么b sin(alpha)就是圆的半径, b cos(alpha) 是到其中心的距离。 (注意 - 这不调用任何三角函数,只调用 sqrt。)

    一旦你知道了相交圆的圆心和半径,圆本身就在一个垂直于连接球心的线段的平面上。

    除此之外,我不确定你想要什么。

    【讨论】:

    • 漏掉一个案例:一个球体完全包含在另一个球体中,交叉点是空的。
    • @Ben:另一种情况:如果距离为0且半径相等,则相交为球体:-)
    • 您提出的解决方案非常适合 2 个球体,但我说的是数千个球体。我想确定得到的外表面积
    • @gpu_drug:我还是不明白你需要什么。外表面积是多少?你能用一堆圆圈在 2D 中解释它吗?
    • 在 2D 中,对于一组重叠的圆圈,我需要得到的图形的周长;球体和外部区域在 3D 中的想法相同
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 2019-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    相关资源
    最近更新 更多