找到两个圆弧之间的交点

find point of intersection between two arc

我正在为孩子们制作游戏。它使用 3 条线创建一个三角形。我如何接近这个是我从基线的两个端点创建两个圆弧(半圆)。但我不知道如何找到这两条弧线的交点。我已经搜索过了,但只找到了两条直线之间的交点。有什么方法可以找到这个交点吗?下面是从基线两端分别画出两条弧线的图。

虽然你没有说清楚,但我假设你有坐标(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 坐标

假设圆心为(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 = Q = const 的线是与基线正交的直线(因为系数正好是 dxdy).

让我们在与该线相交的底面上找到点 C。这很简单——它分割基数使得长度的平方差为 Q。很容易发现它是距离 A L/2 + Q/(2*L) 距离 B L/2 - Q/(2*L) 上的点。所以现在我们可以找到

  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 中从 T 到底边 AB 的高度长度,所以它的长度是 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) 从段的中间开始。

希望这对您有所帮助。

所以我实际上需要这个来设计一个料斗,以便在葡萄收获期间提升葡萄。试图自己解决,但代数很糟糕,所以我在网上看了一下 - 最后我自己做了但引入了一些中间变量(我在 Excel 中计算 - 这也适用于OP,因为目标是计算出的解决方案)。公平地说,这与以前的解决方案非常相似,但希望更清晰一些。

问题: 点 P(Xp,Yp) 到点 Q(Xq,Yq) 的距离 Lq 和点 R(Xr,Yr) 的距离 Lr 的坐标是多少?

让我们先将问题映射到以Lq为原点的新坐标系上,即Q' = (0,0),让(x,y) = P'(Xp-Xq,Yp-Yq)设 (a,b) = R'(Xr-Xq,Yr-Yq).

我们现在可以写:

x^2 + y^2 = Lq^2 -(1)

(x-a)^2 + (y-b)^2 = Lr^2 -(2)

扩展 2:

x^2 – 2ax + a^2 + y^2 -2ay + b^2 =Lr^2

减 1 并重新排列

2by = -2ax + a2 + b2 - Lr^2+ Lq^2

为了方便起见,令c = a^2 + b^2 + Lq^2 + Lr^2(这些都是已知常数,所以c很容易计算),因此我们得到:

y = -ax/b + c/2b

代入1得到:

x^2 + (-a/b x + c/2b)^2 = Lq^2

将整个方程乘以 b^2 并收集各项:

(a^2 + b^2) x2 -ac x + c/4 + Lq^2 b^2 = 0

令 A = (a2 + b2), B= -ac 和 C= c/4 + Lq^2 b^2

使用二次方程的通解

x = (-B +-SQRT(B^2-4AC))/2A

代回1得到:

y= SQRT(Lq^2 - x^2)
(这避免了 b = 0 时的计算困难)

映射回原坐标系

P = (x+Xq, y + Yq)

希望这对您有所帮助,对于格式化,我很抱歉,我在 Word 中把这些都写得很漂亮,但是丢失了