如何找到不规则形状(由 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】:

如果 AB 是形成一条直线的点,那么您可以使用坐标来描述该直线上的任何点:

x = t·Ax + (1−t) ·Bxy = t·Ay + (1−tBy 0≤t≤1

你也可以将圆心M,半径r描述为

(x - Mx)2 + (y - My)2 = r2

因此,从直线方程中取出 xy,并将它们代入圆方程。您在 t 中获得了一个 二次 方程。它的两个解描述了直线和圆之间的两个交点。在您的示例中,其中只有一个位于线段上,即满足 0 ≤ t ≤ 1。另一个描述了线段延伸超过其端点的点。将 t 的正确值带回直线方程,即可得到交点的 xy 坐标。

如果您事先不知道要与给定线相交哪个圆,则将这三个圆相交,然后选择最合适的点。这可能是最接近线段外部起点的点。两个交点都位于线段上的情况也是如此。

【讨论】:

我会写 A_x 而不是 Ax。我把它读成乘法,对此感到困惑;) @phant0m:我处于编写代码模式,使用多字母标识符。会解决的。 哦,我明白了,我正处于阅读数学模式:P 现在看起来很整洁;)

以上是关于如何找到不规则形状(由 3 个圆圈构成)和直线之间的碰撞点的主要内容,如果未能解决你的问题,请参考以下文章

是否有一种算法可以在图像中找到已知大小和形状的对象?

求...判断一个点是不是在(不规则)四边形当中

如何获得多个单独形状的组合凸包

OpenCV 2.4.2 findContours(),如何只得到直线轮廓

xmind怎么画直线

沿 konva 中的线或路径为形状设置动画