找到两个弧之间的交点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了找到两个弧之间的交点相关的知识,希望对你有一定的参考价值。

我正在为孩子们创造一款游戏。它使用3行创建一个三角形。我如何接近这个是我从基线的两个端点创建两个弧(半圆)。但我无法想象如何找到这两个弧的交点。我搜索它但只发现两条直线之间的交点。有没有找到这个交点的方法?下面是从基线的每一端绘制的两个弧的图。

enter image description here

答案

假设圆的中心是(x1y1)和(x2y2),半径是R1R2。让基数的末端为AB,目标点为T。我们知道AT = R1BT = R2。恕我直言,找到T最简单的技巧是注意到距离的平方差是一个已知的常数(R1^2 - R2^2)。并且很容易看出包含满足此条件的点的线实际上是垂直于基线的直线。圆圈方程:

(x - x1)^2 + (y-y1)^2 = R1^2    
(x - x2)^2 + (y-y2)^2 = R2^2

如果我们从另一个中减去一个,我们将得到:

(x2 - x1)(2*x - x1 - x2) + (y2 - y1)(2*y - y1 - y2) = R1^2 - R2^2

让我们的x0 = (x1 + x2)/2y0 = (y1 + y2)/2 - 中心的坐标。还要让基数的长度为L及其投影dx = x2 - x1dy = y2 - y1(即L^2 = dx^2 + dy^2)。让我们来Q = R1^2 - R2^2所以我们可以看到

2 * (dx * (x-x0) + dy*(y-y0)) = Q

因此,(x,y) = R1^2 - R2^2 = const的所有Q对的线是与基线正交的直线(因为系数恰好是dxdy)。

让我们在基线上找到与该线相交的点C。它很容易 - 它分裂底座,使长度的正方形差异为Q。很容易发现它是来自L/2 + Q/(2*L)的距离A和来自L/2 - Q/(2*L)B的点。所以现在我们可以找到它

  TC^2 = R1^2 - (L/2 + Q/(2*L))^2

替换回Q并简化一点,我们可以找到

  TC^2 = (2*L^2*R1^2 + 2*L^2*R2^2 + 2*R1^2*R2^2 - L^4 - R1^4 - R2^4) / (4*L^2)

那么我们

 a = (R1^2 - R2^2)/(2*L)
 b = sqrt(2*L^2*R1^2 + 2*L^2*R2^2 + 2*R1^2*R2^2 - L^4 - R1^4 - R2^4) / (2*L)

请注意,b的公式也可以用不同的形式编写:

 b = sqrt[(R1+R2+L)*(-R1+R2+L)*(R1-R2+L)*(R1+R2-L)] / (2*L)

这看起来非常类似于Heron's formula。这并不奇怪,因为b实际上是三角形ABT基础ABT高度的长度所以它的长度是2*S/L,其中S是三角形的区域。而三角形ABT显然分别有长度LR1R2

为了找到目标T,我们需要沿着基部移动a并沿垂直方向移动b。因此,从段的中间计算的T的坐标是:

 Xt = x0 + a * dx/L ± b * dy / L
 Yt = y0 + a * dy/L ± b * dx / L

这里±意味着有两种解决方案:一种在基线的两侧。

部分情况:如果R1 = R2 = R,那么a = 0b = sqrt(R^2 - (L/2)^2)显而易见:T位于段的中间部分sqrt(R^2 - (L/2)^2)的段平分线上。

希望这可以帮助。

另一答案

虽然你没有说清楚,我假设你有坐标(A.X, A.Y)(B.X, B.Y)的点和两边LenALenB的长度,需要找到点C的坐标。

所以你可以使方程系统利用圆方程:

(C.X - A.X)^2 + (C.Y - A.Y)^2 = LenA^2
(C.X - B.X)^2 + (C.Y - B.Y)^2 = LenB^2

为未知数解决它C.X,C.Y。

不是值得从所有其他人中减去A坐标,制作和解决更简单的系统(第一个方程式变为C'.X^2 + C'.Y^2 = LenA^2),然后再次添加A坐标

以上是关于找到两个弧之间的交点的主要内容,如果未能解决你的问题,请参考以下文章

查找直线和 QPainterPath 之间的交点

通过 3D 向量拟合线并找到与平面的交点

沿着两个平面的交点找到线

由点指定的两条无限线的交点

以整数形式获取线段和 2^n 网格之间的所有交点

在OpenGL中绘制两个点云之间的交点