代码之家  ›  专栏  ›  技术社区  ›  TheGunners

查找两条圆弧之间的交点

  •  0
  • TheGunners  · 技术社区  · 8 年前

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

    enter image description here

    3 回复  |  直到 8 年前
        1
  •  2
  •   SergGr    8 年前

    假设圆心为( 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 =常数是一条与基底正交的直线(因为系数 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 在垂直方向上。So坐标 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) 从段的中间开始。

    希望这有帮助。

        2
  •  2
  •   MBo    8 年前

    虽然您没有明确说明,但我假设您有带坐标的点 (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。

    并不是说从所有其他坐标中减去一个坐标是值得的,而是要使系统变得更简单并求解它(第一个方程变成 C'.X^2 + C'.Y^2 = LenA^2 ),然后再次添加坐标

        3
  •  1
  •   RobertF    4 年前

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

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

    让我们首先将问题映射到新的坐标系上,其中Lq是原点,因此Q=(0,0),Let(x,y)=P(Xp Xq,Yp Yq)和Let(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中有这么多漂亮的东西,但丢失了