纳金网

标题: 曲线的绘制-Bezier曲线 [打印本页]

作者: 王者再临    时间: 2014-12-28 16:21
标题: 曲线的绘制-Bezier曲线

    Bezier曲线,又有人叫贝赛尔曲线,贝兹曲线,在计算机绘图中经常被用到,由于前些天事件要用到这个,所以就研究了下。


有了参考资料,其实也不是很复杂。


    曲线的介绍(转自维基百科,见本文的最下方)

    初一看还是有些复杂的,其实贝兹曲线的绘制方法很简单,仔细看看一阶贝赛尔曲线,


    一阶贝赛尔曲线上的由两个点确定  P0 和P1,当t在0--->1区间上递增时,根据式(1)

   会得到多个点的坐标,其实这些的点就是一条直线上的点。

               B(t) = (1-t)P0 + tP1--------------------------------------(1)

          即:

               B(t).x = (1-t)P0.x + tP1.x

               B(t).y = (1-t)P0.y + tP1.y


       二阶贝赛尔曲线由3个点确定,它可以理解成是这样的一阶贝赛尔曲线:确定该一阶贝赛尔曲线的两个点是变化的。

      这两个点(设分别为Pm,Pn)是怎样变化的呢,这两个点又分别是(P0,P1)确定的一阶贝赛尔曲线和(P1,P2)确定的一阶贝赛尔

      曲线上的点。

            于是有了2阶贝赛尔曲线的公式

            Pm(t) = (1-t)P0 + tP1

            Pn(t)  = (1-t)P1 + tP2

            B(t)  = (1-t)Pm(t) + tPn(t) = (1-t)^2 P0 + 2(1-t)tP1+ t^2P2

        以此类推可以得到3阶贝赛尔曲线,是不是很简单?



     怎样绘制是不是很简单了?   


     绘制3阶段贝赛尔曲线的函数,这里用VB语言实现

       '函数说明: 画3阶贝塞尔曲线,该3阶贝塞尔曲线由3个点确定(原本该三阶曲线是由4个点确定的,不过这里把中间两 个 点合为一个点)

       输入:cp,用来控制贝塞尔曲线形状的3个点形成的数组

                   PointeOnCurve()数组用来记录曲线上的点,iPointsNum该曲线上的点的数目,也就是PointOnCureve数组的大小

                    iPointsNum越大,曲线越光滑。因为该算法的实质是通过这些点的连成的直线形成曲线。


     Private Type POINT_User
        X As Single
        Y As Single
      End Type

        Private Sub Draw3PointBezier(cp() As POINT_User, ByRef PointOnCurve() As POINT_User, ByVal iPointsNum As Integer)

        Dim dt, t As Single

        dt = 1# /( iPointsNum-1)
        Dim i As Integer


    For i = 0 To iPointsNum - 1
       t = i * dt
       PointOnCurve(i).X = (1 - t) ^ 3 * cp(0).X + 3 * t * (1 - t) * cp(1).X + t ^ 3 * cp(2).X
       PointOnCurve(i).Y = (1 - t) ^ 3 * cp(0).Y + 3 * t * (1 - t) * cp(1).Y + t ^ 3 * cp(2).Y
   
        ' If (i > 0) Then
        '           Picture_1.Line (Int(PointOnCurve(i).X), Picture_1.ScaleHeight - Int(PointOnCurve(i).Y)) _
        '           -(Int(PointOnCurve(i - 1).X), Picture_1.ScaleHeight - Int(PointOnCurve(i - 1).Y))
       '              End If
      Next i

End Sub



作者: tianhett    时间: 2014-12-28 22:45
涨姿势了。。。。。。。。
作者: HIDEOKOJIMA    时间: 2014-12-28 22:53
Thanks for sharing thís one !




欢迎光临 纳金网 (http://go.narkii.com/club/) Powered by Discuz! X2.5