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

5

我将从能够帮助我描述问题的图像开始:

我有两个相连的线段AB和BC(我知道它们的坐标)。 如何计算第一个绿点和最后一个绿点之间的弧度。 第一个和最后一个绿点位于距离B点(黑色线段)指定的距离处。 我希望将所有绿色点的坐标存储在数组中。 有人可以帮我解决这个问题吗?


第一个和最后一个点是切点吗? - Lrrr
@AliAmiri 是的,它们是。 - user3688059
2
我认为这可能与编程无关,因为它涉及数学问题,应该在http://math.stackexchange.com/上提问。 - Yu Hao
请准确描述您所拥有的内容。线段是如何参数化的?它们是否被限制为切线于一个圆?这只是一个常规的寻找角落圆角的程序吗? - John Alexiou
3个回答

5
问题归结为给定半径r、点B和方向BC和BA,找到圆K的中心。按照以下步骤进行:
1. 使用任何“两个平面向量之间的夹角”算法找到BC和AB之间的角度φ(有许多方法)。 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个角度增量,将点M围绕K旋转,以获得绿色点:第i个点(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)*ψ)

第五步应该是(kx,ky) = (mx,my) + r*(mx,my)吗? - undefined
1
@ChanceSnow - 不,但是我写的也不对。我觉得我在最新的编辑中修正了它。 - undefined

1

我稍微改变了你的形状:

enter image description here

事实:由于Ta和Tc是切线,因此OTaA和OTcC是垂线,O是这个圆的中心。

根据上述事实,我们可以发现,并非对于每一对Ta和Tc都存在这样一个圆,但是如果存在OTa = OTc,那么你需要做的就是找到O。找到O之后,你就有了一个圆的R和O(射线和中心),因此你可以找到其表面上的每一个坐标。


谢谢!它对我有帮助 ;) - user3688059
如果这篇回答有帮到您,请不要忘记点赞并标记为答案 :) - Lrrr
额,我不明白。还在努力弄清楚 - 或许有人可以帮帮我。我有切点、圆心和半径。问题是ABC可能有不同的角度和坐标。如何从Ta到Tc开始绘制点?为了“分割”当前弧,我使用类似于:double angle = ((degree * i / divider) * Math.PI / 180.0) 的东西,它可以工作,但如何从特定角度(从Ta点)开始呢? - user3688059

0
我不确定你的最终目标是什么,但在我看来,你基本上想要使“角落”B变成圆形。
显然,圆形是圆的。你并不是要求圆形,而是要求圆上的点。我有一种感觉,你最终会连接这些点,用直线来近似表示一个圆。显然,5个点对于你想要的“圆度”已经足够了。
如果这是真的,你只是为了使角落变圆而近似表示一个圆,那么贝塞尔曲线对你也可能很有用。二次贝塞尔曲线通过第三个锚点插值地以圆弧方式连接两个点。在你的情况下,B将是该锚点。这条曲线的缺点是它不是一个圆,并且看起来会不同,但仍然会产生一个圆形。
优点是: 许多语言都有内置函数来绘制这些曲线。 一些边缘情况处理得更好,例如如果所有三个点在一条直线上,或者相同等。使用圆解决方案时,你必须自己处理这些情况。
“我如何从Ta到Tc开始绘制点?”
使用slerp获取弧上的插值点(给定弧的中心,第一个和最后一个点): http://en.wikipedia.org/wiki/Slerp

1
是的 @null,我想把角落变成圆形。不幸的是,我不能使用贝塞尔曲线,因为我需要直接在点上进行额外的控制等操作。 - user3688059
@user3688059,您所说的“额外控制”是什么意思?您可以像对弧线一样在此曲线上分配5个点。这实际上更容易,因为整个算法都基于插值。在我提供的链接中,插值参数被命名为t,将t设置为0、0.2、0.4、0.6、0.8、1即可在曲线上分布5个点。我还在我的答案中添加了有关如何在弧上获取这些点的信息,只要您有中心点和第一个和最后一个点,它就被称为slerp。 - null

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接