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

How to find arc that connects two segments?

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

我有两个相连的线段 AB 和 BC(我知道坐标)。如何计算第一个和最后一个绿点之间的弧。第一个和最后一个绿点位于距 B 点(黑色段)指定距离处。 我想要数组中所有绿点的坐标。谁能帮我解决这个问题?

我稍微改变了你的形状:

事实:因为Ta和Tc相切所以OTaA和OTc C是垂线,O是圆心。

由以上事实可知,并不是每两对Ta和Tc都存在这样的循环,但如果存在的话OTa = OTc。所以你需要做的就是找到 O。找​​到 O 后你就有了一个循环的 R 和 O(射线和中心)所以你可以找到它表面上的每个坐标。

我不确定你最终的目标是什么,但在我看来你基本上想要进入 "corner" B 轮。

果然一圈是圆的。您不是要圆圈,而是要圆圈上的点。 我有一种感觉,你最终会用直线连接这些点来近似一个圆。显然 5 分足以达到你想要的 "roundness" 个角落。

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

How can i start drawing points from Ta to Tc?

要获取圆弧上的插值点(给定圆弧的中心、第一个点和最后一个点),请使用 slerp: http://en.wikipedia.org/wiki/Slerp

问题归结为在给定半径 r 的情况下找到圆心 K,点 B 和方向 BCBA.

按照以下步骤操作:

  1. 使用任何 "angle between two planar vectors" 算法在 BCAB 之间找到角度 φ你会发现(有很多方法)。
  2. 计算圆弧包含角ψ

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

  3. 计算沿BC的距离s,弧结束

    s = r*cot(φ/2)

  4. 如果BC的方向是e_BC=(ex,ey),法线是n_BC=(ey,-ex)那么圆弧的终点M

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

  5. 圆心为

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

  6. 现在以N=4个角度增量旋转点MK 获得绿点

    i-th point: 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)*ψ)