浅谈图形软件中直线和曲线的基本构成(下)

这篇又拖了下,主要是动图一直没心情做,现在放假了才把它给补好,让大家久等了。

上篇中我们提到,对于图形软件来说,存储一根线,端点信息几乎成为了必要的组成部分。为此,不同的图形软件各显神通,让不同类型的曲线都满足上述条件。

其中,Adobe系列的产品用三次贝塞尔曲线进行拟合,而其算法相信大家都能很轻易地给搜索出来。相反,用圆弧去拟合贝塞尔曲线的文章却反倒不多见。以前我感到很困惑,圆弧不是更简单么?为什么更多的人喜欢反向拟合?如今,我做过图形编辑功能,就彻底明白了。

如上篇所言,贝塞尔曲线对生产并不友好,所以AutoCAD发明了另外一套曲线体系,谓之多段线。这个词虽然我个人不太喜欢,但它却把这种线支持首尾相接的特性给很好地体现出来。

为了让不懂CAD的朋友理解起来更方便,后面我会把它称作圆弧直线。

在这种线条中,不管它是圆弧还是直线,AutoCAD都会存储它的起点和终点。

 

然后为了确定最终的曲线形状,我们可以加入第3个点,当这个点在线段SE上时,曲线为直线,否则为圆弧。

这样看起来整个体系很完美了,但仔细思考一下会发现,同一条曲线,满足条件的“控制点”有无数个。如下图,弧线上任一位置的点确定的都是同一条圆弧。

像这种一个值对应多个解的情况,用到实际中并不方便。我们知道,SE两点确定下来之后,其圆心一定在SE的垂直平分线上。

所以我们完全可以改用一个纯数字的变量来描述它,比如圆心到连线的距离,距离为0时为直线,其它距离为圆弧,距离可以设定为有向,这样的话就可以让距离相等但不同侧的圆心也能有所区分。

AutoCAD别出心裁地为这一特性定制了一个变量,叫凸度(bulge),它等于圆弧的与圆心角的1/4的正切值

bulge=tan(angle/4)

 

这个定义可谓非常巧妙,我们知道正切值在0~pi/2区间是单调递增,并且值域为0到无穷大。然后圆心角的取值范围为0到2pi,除以4刚好让正切值既包含所有正数,又随着凸度的增大而增大。(事实上,只有当起点和终点完全重合,凸度才可以是无穷大)。

而另一个巧妙的地方,则是当圆弧为半圆的时候,其拱形的高度刚好等于半径,而此时的bulge=tan(pi/4)=1,跟我们半圆凸度为1的主观理解不谋而合。

凸度也有正负的定义,一般而言,当圆弧从起点到终点的旋转方向为正向(即y轴向上的坐标系下逆时针旋转)时定义为正,反之则定义为负。当凸度为0时,曲线为直线。

凸度为0时变为直线可以通过下面的动图来理解:当弧线慢慢趋于平直的时候,圆心到连线的距离越来越大,并且起点和终点跟圆心连线的夹角也越来越小。当弧线变平,起点和终点跟“圆心”的连线变成平行,夹角为0。

这种圆弧直线可以把图形软件和生产工具的冲突给很好的调和起来,可谓是图形界的一大创举。美中不足的是,它不支持非等比缩放(直线的情况除外),因为非等比缩放会把圆弧变成椭圆弧,而目前业界尚没有通过存储端点的方式来描述椭圆,所以在AutoCAD里面,这种线只能做等比缩放。

而贝塞尔曲线的弹性则强很多,不管如何,我们只要把端点和控制点进行缩放,得到的新曲线也正好是原曲线不等比缩放的结果。因此对于图形软件来说,贝塞尔曲线仍然是首选。

介绍完了圆弧直线这样的一个知识背景后,我们将重新回到微积分系列的教程当中。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值