Math 如何找到连接两个线段的圆弧?

Math 如何找到连接两个线段的圆弧?,math,2d,Math,2d,我将从帮助我描述问题的img开始: 我有两个连接段AB和BC(我知道coords)。如何计算第一个和最后一个绿点之间的弧。第一个和最后一个绿色点位于距离B点(黑色段)指定距离处我希望所有绿点坐标都在阵列中。有人能帮我解决这个问题吗?我稍微改变了你的形状: 事实:因为Ta和Tc是切线,所以OTaA和OTcC是垂直的,O是循环的中心 从上述事实中,我们可以发现并非每两对Ta和Tc都存在这样一个循环,但如果存在,OTa=OTc。所以你需要做的就是找到O。在找到O之后,你就有了一个循环的R和O(光线

我将从帮助我描述问题的img开始:


我有两个连接段AB和BC(我知道coords)。如何计算第一个和最后一个绿点之间的弧。第一个和最后一个绿色点位于距离B点(黑色段)指定距离处我希望所有绿点坐标都在阵列中。有人能帮我解决这个问题吗?

我稍微改变了你的形状:

事实:因为Ta和Tc是切线,所以OTaA和OTcC是垂直的,O是循环的中心


从上述事实中,我们可以发现并非每两对Ta和Tc都存在这样一个循环,但如果存在,OTa=OTc。所以你需要做的就是找到O。在找到O之后,你就有了一个循环的R和O(光线和中心),这样你就可以找到它表面的每个坐标。

我不确定你最终的目标是什么,但在我看来,你基本上想把“角”B弄圆

果不其然,圆圈是圆的。你要的不是圆,而是圆上的点。 我觉得你最终会用直线把这些点连接起来,近似成一个圆。显然,5点就足以满足您所需的拐角“圆度”

如果这是真的,为了使角圆,你只需要近似一个圆,那么贝塞尔曲线对你来说也很有趣。 A通过第三个定位点插值,以圆形方式连接两个点。在你的情况下,B将是锚定点。这种曲线的一个缺点是它不是一个圆,看起来会有所不同,但仍然会产生一个圆形。 优点是: 许多语言都有内置函数来绘制这些曲线。 某些边缘情况处理得更好,例如,如果所有三个点都在一条线上,相同,等等。对于圆解决方案,您必须自己处理这些情况

如何开始从Ta到Tc绘制点

要获取圆弧上的插值点(给定圆弧的中心,第一个点和最后一个点),请使用slerp:

问题归结为给定半径r、点B和方向BC和BA,求圆K的中心

遵循以下步骤:

  • 使用您找到的任何“两个平面向量之间的角度”算法(有很多种方法)查找BC和AB之间的角度φ
  • 计算弧包角ψ时使用

    ψ=2*arcin(cot(φ/2))

  • 计算沿弧结束处BC的距离s

    s=r*cot(φ/2)

  • 如果BC的方向为
    e_BC=(ex,ey)
    ,法线为
    n_BC=(ey,-ex)
    ,则弧M的末端为

    (mx,my)=(bx,by)+s*(ex,ey)

  • 圆心是

    (kx,ky)=(mx,my)+r*(nx,ny)

  • 现在,以N=4的角度增量将点M绕K旋转,以获得绿点

    i-th点:i=1..4

    gx=kx+(mx-kx)*cos((i/4)*ψ)+(my-ky)*sin((i/4)*ψ)

    gy=ky-(mx-kx)*sin((i/4)*ψ)+(my-ky)*cos((i/4)*ψ)


  • 第一个点和最后一个点是切点吗?@AliAmiri是的,它们是切点。我认为这可能是离题的,因为这是关于数学的,应该被问到。请准确描述你有什么。线段是如何参数化的,以及它们被约束为与圆相切。这只是一个常规的寻找拐角B的圆角吗?谢谢!它帮助了我;)@如果有帮助,请使用3688059别忘了投票并将其标记为答案:)呃,我不明白。还在想办法-也许有人能帮我。我有切点,圆心,还有半径。问题是ABC可以有不同的角度和坐标。如何开始从Ta到Tc绘制点?为了“分割”当前弧,我使用了类似的东西:
    double angle=((degree*I/divider)*Math.PI/180.0)
    它可以工作,但如何从特定角度(从Ta点)开始?是@null我想使角B变圆。不幸的是,我不能使用贝塞尔曲线,因为我需要直接对点等进行额外控制@user3688059“额外控制”到底是什么意思?您可以在这条曲线上分布5个点,就像您对圆弧所做的那样。实际上更容易,因为整个算法都是基于插值的。在我提供的链接中,插值参数命名为t,将t设置为0、0.2、0.4、0.6、0.8、1,以获得分布在曲线上的5个点。我还为我的答案添加了关于如何获得圆弧上的点的信息,如果你有中心点和第一点和最后一点,它被称为slerp。