java 圆弧坐标_如何使用贝塞尔曲线最佳逼近几何圆弧?

我正在回答这个古老的问题(这应该属于数学,因此编写公式会很糟糕)并进行一些演示 .

假设P0和P3是弧的初始和最终点,P1和P2是Bézier曲线的控制点,x是角度除以2的度量 . 假设x小于pi / 2 .

设PM段P0P3和PH的中点为弧的中点 . 为了逼近弧线,我们希望Bézier曲线在P0中开始,通过PH,在P3中结束,并且与P0和P3中的弧相切 .

(点击“运行代码片段”来显示图 . 诅咒到imgur仍然不支持SVG . )

P0

P1

P2

P3

PE

PH

PM

设PE为P0和P3中与圆弧相切的线的交点 . 为了使曲线与弧相切,P1必须位于P0PE段上,P2必须位于P3PE上 . 设k为P0P1 / P0PE的比值(也等于P3P2 / P3PE):

P1 =(1-k)P0 k PE P2 =(1-k)P3 k PE

我们还有以下(做一些比例):

PM =(P0 P3)/ 2 PH = PM / cos(x)= PM sec(x)=(P0 P3)sec(x)/ 2 PE = PH / cos(x)= PM sec(x)^ 2 =(P0 P3)sec(x)^ 2/2

为了简化我们的计算,我认为所有的矢量点都是基于中心的,但最终它并不重要 .

通用的4点Bézier曲线由公式给出

C(t)= t ^ 3 P3 3(1 - t)t ^ 2 P2 3(1 - t)^ 2 t P1(1 - t)^ 3 P0

我们必须有C(1/2)= PH,所以

C(1/2)=(P0 3 P1 3 P2 P3)/ 8 =((P0 P3)3(1 - k)P0 3 k PE 3(1 - k)P3 3 k PE)/ 8 =(( P0 P3)3(1 - k)(P0 P3)6 k PE)/ 8 =(P0 P3)(1 3(1 - k)3 k sec(x)^ 2)/ 8

所以,这是我们的等式(乘以8)来找到k:

8 C(1/2)= 8 PH =>(P0 P3)(4 - 3 k 3 k sec(x)^ 2)= 4(P0 P3)sec(x)

让我们摆脱向量(P0 P3),我们得到:

4 - 3 k 3 k sec(x)^ 2 = 4 sec(x)=> 3 k(sec(x)^ 2 - 1)= 4(sec(x) - 1)=> k = 4/3 (秒(x)1)

现在您知道了控制点的放置位置 . 万岁!

如果你有x = pi / 4,你将得到k = 0.552 ......你可能已经看到了这个值 .

处理椭圆弧时,您所要做的就是相应地缩放点的坐标 .

如果你必须处理更大的角度,我建议将它们分成更多的曲线 . 这实际上是一些软件在绘制弧时所做的事情,因为计算Bézier曲线有时比使用正弦和余弦更快 .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值