如何找到连接两个线段的弧?
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 和方向 BC 和 BA.
按照以下步骤操作:
- 使用任何 "angle between two planar vectors" 算法在 BC 和 AB 之间找到角度 φ你会发现(有很多方法)。
用
计算圆弧包含角ψ
ψ = 2*arcsin(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 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)*ψ)
我将从帮助我描述问题的 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 和方向 BC 和 BA.
按照以下步骤操作:
- 使用任何 "angle between two planar vectors" 算法在 BC 和 AB 之间找到角度 φ你会发现(有很多方法)。
用
计算圆弧包含角ψψ = 2*arcsin(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 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)*ψ)