unity 控制点 贝塞尔曲线_简单介绍,如何绘制Bezier曲线

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之家部分内容来源于互联网,如有侵权,请联系我们,本站将立即进行处理。

你可能感兴趣的:(unity,控制点,贝塞尔曲线)