找到两个弧之间的交点
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了找到两个弧之间的交点相关的知识,希望对你有一定的参考价值。
我正在为孩子们创造一款游戏。它使用3行创建一个三角形。我如何接近这个是我从基线的两个端点创建两个弧(半圆)。但我无法想象如何找到这两个弧的交点。我搜索它但只发现两条直线之间的交点。有没有找到这个交点的方法?下面是从基线的每一端绘制的两个弧的图。
假设圆的中心是(x1
,y1
)和(x2
,y2
),半径是R1
和R2
。让基数的末端为A
和B
,目标点为T
。我们知道AT
= R1
和BT
= 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)/2
和y0 = (y1 + y2)/2
- 中心的坐标。还要让基数的长度为L
及其投影dx = x2 - x1
和dy = 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
对的线是与基线正交的直线(因为系数恰好是dx
和dy
)。
让我们在基线上找到与该线相交的点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
实际上是三角形AB
中T
基础ABT
高度的长度所以它的长度是2*S/L
,其中S
是三角形的区域。而三角形ABT
显然分别有长度L
,R1
和R2
。
为了找到目标T
,我们需要沿着基部移动a
并沿垂直方向移动b
。因此,从段的中间计算的T
的坐标是:
Xt = x0 + a * dx/L ± b * dy / L
Yt = y0 + a * dy/L ± b * dx / L
这里±
意味着有两种解决方案:一种在基线的两侧。
部分情况:如果R1 = R2 = R
,那么a = 0
和b = sqrt(R^2 - (L/2)^2)
显而易见:T
位于段的中间部分sqrt(R^2 - (L/2)^2)
的段平分线上。
希望这可以帮助。
虽然你没有说清楚,我假设你有坐标(A.X, A.Y)
和(B.X, B.Y)
的点和两边LenA
和LenB
的长度,需要找到点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坐标
以上是关于找到两个弧之间的交点的主要内容,如果未能解决你的问题,请参考以下文章