您好,欢迎来到Unity之家!   unity.jb51.net 
  • 首 页
  • 你问我答
  • 当前位置:首页 > 学习培训 > Unity入门 >
    简单介绍,如何绘制Bezier曲线
    时间:2014-12-27 14:12 来源:互联网 作者:网络 浏览:收藏 挑错 推荐 打印

    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


    (责任编辑:脚印)
    免责声明:Unity之家部分内容来源于互联网,如有侵权,请联系我们,本站将立即进行处理。