找到两个圆弧之间的交点
find point of intersection between two arc
我正在为孩子们制作游戏。它使用 3 条线创建一个三角形。我如何接近这个是我从基线的两个端点创建两个圆弧(半圆)。但我不知道如何找到这两条弧线的交点。我已经搜索过了,但只找到了两条直线之间的交点。有什么方法可以找到这个交点吗?下面是从基线两端分别画出两条弧线的图。
虽然你没有说清楚,但我假设你有坐标(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 坐标
假设圆心为(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
= Q
= const 的线是与基线正交的直线(因为系数正好是 dx
和 dy
).
让我们在与该线相交的底面上找到点 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
的边长分别为 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)
从段的中间开始。
希望这对您有所帮助。
所以我实际上需要这个来设计一个料斗,以便在葡萄收获期间提升葡萄。试图自己解决,但代数很糟糕,所以我在网上看了一下 - 最后我自己做了但引入了一些中间变量(我在 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 中把这些都写得很漂亮,但是丢失了
我正在为孩子们制作游戏。它使用 3 条线创建一个三角形。我如何接近这个是我从基线的两个端点创建两个圆弧(半圆)。但我不知道如何找到这两条弧线的交点。我已经搜索过了,但只找到了两条直线之间的交点。有什么方法可以找到这个交点吗?下面是从基线两端分别画出两条弧线的图。
虽然你没有说清楚,但我假设你有坐标(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 坐标
假设圆心为(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
= Q
= const 的线是与基线正交的直线(因为系数正好是 dx
和 dy
).
让我们在与该线相交的底面上找到点 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
的边长分别为 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)
从段的中间开始。
希望这对您有所帮助。
所以我实际上需要这个来设计一个料斗,以便在葡萄收获期间提升葡萄。试图自己解决,但代数很糟糕,所以我在网上看了一下 - 最后我自己做了但引入了一些中间变量(我在 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 中把这些都写得很漂亮,但是丢失了