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

问题描述 投票:0回答:3

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

我有两个相连的线段 AB 和 BC(并且我知道坐标)。如何计算第一个和最后一个绿点之间的弧度。第一个和最后一个绿点位于距 B 点(黑色部分)指定距离的位置。 我想要数组中所有绿点的坐标。任何人都可以帮助我解决这个问题吗?

math 2d
3个回答
5
投票

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

pic

请按照以下步骤操作:

  1. 使用您找到的任何“两个平面向量之间的角度”算法找到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*(-ey,ex)

  6. 现在以N=4个角度增量将点M旋转约K以获得绿色点

    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)*ψ)


1
投票

我稍微改变了你的形状:

enter image description here

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

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


0
投票

我不确定你最终的目标是什么,但在我看来,你基本上是想进入“角落”B 轮。

果然圆是圆的。你要求的不是圆,而是圆上的点。 我有一种感觉,你最终会用直线将这些点连接起来,形成一个近似的圆。显然 5 个点足以满足您所需的角“圆度”。

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

如何开始从 Ta 到 Tc 绘制点?

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

© www.soinside.com 2019 - 2024. All rights reserved.