如何找到不规则形状(由 3 个圆圈构成)和直线之间的碰撞点
Posted
技术标签:
【中文标题】如何找到不规则形状(由 3 个圆圈构成)和直线之间的碰撞点【英文标题】:How to find the point of collision between an irregular shape (built out of 3 circles) and a line 【发布时间】:2012-10-12 13:33:23 【问题描述】:我正在编写一个程序,其中许多奇怪的形状被绘制到画布上。现在我正在尝试实现最后一个,也可能是最难的一个。
在这个特定的形状中,我需要一种方法来找到线条撞击形状的位置(在 2d 画布上)。下图是我现在拥有的示例。
黑点是我知道的点(我也有三个空心圆的中心位置和这些圆的半径)。三条外线中的每条线都需要一条朝向中心点的线,在它碰到圆的点结束。这种形状可以旋转 90、180 或 270 度。
形状应如下所示:
如果您需要任何其他信息,请在 cmets 中询问我。我数学不是很好,所以请温柔,谢谢!
【问题讨论】:
【参考方案1】:如果 A 和 B 是形成一条直线的点,那么您可以使用坐标来描述该直线上的任何点:
x = t·Ax + (1−t) ·Bxy = t·Ay + (1−t)·By 0≤t≤1
你也可以将圆心M,半径r描述为
(x - Mx)2 + (y - My)2 = r2
因此,从直线方程中取出 x 和 y,并将它们代入圆方程。您在 t 中获得了一个 二次 方程。它的两个解描述了直线和圆之间的两个交点。在您的示例中,其中只有一个位于线段上,即满足 0 ≤ t ≤ 1。另一个描述了线段延伸超过其端点的点。将 t 的正确值带回直线方程,即可得到交点的 x 和 y 坐标。
如果您事先不知道要与给定线相交哪个圆,则将这三个圆相交,然后选择最合适的点。这可能是最接近线段外部起点的点。两个交点都位于线段上的情况也是如此。
【讨论】:
我会写A_x
而不是 Ax
。我把它读成乘法,对此感到困惑;)
@phant0m:我处于编写代码模式,使用多字母标识符。会解决的。
哦,我明白了,我正处于阅读数学模式:P 现在看起来很整洁;)以上是关于如何找到不规则形状(由 3 个圆圈构成)和直线之间的碰撞点的主要内容,如果未能解决你的问题,请参考以下文章