三次Bezier曲线

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

作业三:三次Bezier曲线
1. 设计要求:
1.在程序窗口中建立坐标系
2.输入控制点,绘制出三次Bezier曲线
3.四个控制点间依次用细线连接
4.在程序窗口显示四个控制点的位置并标出
2. 设计思路:
先在草稿纸上算出三次Bezier曲线的函数表达式:
(0≤u≤1)
=a×+b×+c×u+d
其中a、b、c、d的值为:
a=(-) + 3 × - 3 × +
b=3× - 6 × + 3 ×
c=(-3) × + 3 ×
d=
将、、、中的(x,y)坐标值分别代入a、b、c、d中得到、、、和、、、则:
=×+×+×u+ (1)
=×+×+×u+ (2)
根据以上结果(1)和(2)编程求得当u取不同值时所得到的点P(u)。

再将各点用线连接起来即可拟合三次Bezier曲。

3. 设计过程:
以下是用VB编三次Bezier曲线时的源代码:
其中显示四个控制点的思路是将控制点在x和y方向的坐标值都增大1,然后再与控制点用粗实线连接起来。

这样一来在窗口中显示的即为一个较大的实点。

Function drawcs() '此模块为建立坐标系
Dim k As Integer
PictDraw.DrawWidth = 1: PictDraw.FontSize = 9 '设置线宽和字体 PictDraw.Line (-400, 0)-(400, 0), RGB(100, 100, 100)
PictDraw.Line (0, -300)-(0, 300), RGB(100, 100, 100)
For k = (-360) To 360 Step 40
PictDraw.Line (k, -5)-(k, 0): PictDraw.CurrentX = k - 20: PictDraw.CurrentY = 5: PictDraw.Print k
Next k
For k = (-280) To -40 Step 40
PictDraw.Line (5, k)-(0, k): PictDraw.CurrentX = -40: PictDraw.CurrentY = k - 10: PictDraw.Print (-1) * k
Next k
For k = (40) To 280 Step 40
PictDraw.Line (5, k)-(0, k): PictDraw.CurrentX = -40: PictDraw.CurrentY = k - 10: PictDraw.Print (-1) * k
Next k
End Function
Private Sub Form_Load()
PictDraw.AutoRedraw = True
PictDraw.ScaleWidth = 800
PictDraw.ScaleHeight = 600
Text1.Text = -300: Text2.Text = -250: Text3.Text = 300: Text4.Text = -250
Text5.Text = -300: Text6.Text = 250: Text7.Text = 300: Text8.Text = 250 '作为初始值,便于测试
drawcs
End Sub
Private Sub cmdCancle_Click()
PictDraw.Cls
drawcs '清除屏幕后,重建坐标系
End Sub
Private Sub delet_Click() '此模块为清除输入框中的值 Text1.Text = ""
Text2.Text = ""
Text3.Text = ""
Text4.Text = ""
Text5.Text = ""
Text6.Text = ""
Text7.Text = ""
Text8.Text = ""
End Sub
Private Sub cmdDraw_Click() '此模块为画三次Bezier曲线
Dim px(4) As Double '定义控制点的x坐标的数组
Dim py(4) As Double '定义控制点的y坐标的数组
Dim a1, b1, c1, d1 As Double '定义x系数
Dim a2, b2, c2, d2 As Double '定义y系数
Dim x, y, u As Double '定义曲线中的自变量u和变量x,y Dim i As Integer
If (Not IsNumeric(Text1) Or Not IsNumeric(Text2) Or Not IsNumeric(Text3) Or Not IsNumeric(Text4) _
Or Not IsNumeric(Text5) Or Not IsNumeric(Text6) Or Not IsNumeric(Text7) Or Not IsNumeric(Text8)) Then
Text1.Text = "": Text2.Text = ""
Text3.Text = "": Text4.Text = ""
Text5.Text = "": Text6.Text = ""
Text7.Text = "": Text8.Text = ""
Text1.SetFocus '判断输入框中的字符是否为数字,如果为数字执行else开始画图
Else
px(0) = Text1.Text: py(0) = Text2.Text
px(1) = Text3.Text: py(1) = Text4.Text
px(2) = Text5.Text: py(2) = Text6.Text
px(3) = Text7.Text: py(3) = Text8.Text
PictDraw.FontSize = 18 '设置字体,为显示输入的四个点设置字体大小
PictDraw.CurrentX = px(0): PictDraw.CurrentY = (-1) * py(0): PictDraw.Print "P"; 0
For i = 0 To 2
PictDraw.DrawWidth = 1
PictDraw.Line (px(i), (-1) * py(i))-(px(i + 1), (-1) * py(i + 1)), RGB(0, 0, 255): PictDraw.Print "P"; i + 1
Next i
For i = 0 To 3
PictDraw.DrawWidth = 7
PictDraw.Line (px(i), (-1) * py(i))-(px(i) + 1, (-1) * py(i) - 1)
Next i
a1 = -px(0) + 3 * px(1) - 3 * px(2) + px(3) '计算x和y的参数 b1 = 3 * px(0) - 6 * px(1) + 3 * px(2)
c1 = -3 * px(0) + 3 * px(1)
d1 = px(0)
a2 = -py(0) + 3 * py(1) - 3 * py(2) + py(3)
b2 = 3 * py(0) - 6 * py(1) + 3 * py(2)
c2 = -3 * py(0) + 3 * py(1)
d2 = py(0)
For u = 0 To 1 Step 0.001 '每当u增加0.001求一次x和y x = a1 * u * u * u + b1 * u * u + c1 * u + d1 '求x的值
y = (-1) * (a2 * u * u * u + b2 * u * u + c2 * u + d2) '求y的值 If u = 0 Then
PictDraw.CurrentX = x '设置画线起点
PictDraw.CurrentY = y
Else
PictDraw.DrawWidth = 2
PictDraw.Line -(x, y), RGB(255, 0, 0) '连点成线
End If
Next u
End If
End Sub
Private Sub cmdEnd_Click() '退出窗口程序
End
End Sub
4. 设计截图:
图四.三次Bezier曲线截图。

相关文档
最新文档