三次Bezier曲线
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
三次Bezier曲线
一、程序设计功能:
1.设计绘图窗口,能实现数据的多次输入;
2.具有多次绘图功能,能实现不同数据的绘图;
3.具有清屏功能,在画完该次图形后,清除图像并重建坐标系,
4.具有数据完整性检测功能,当数据输入不完整时,通过弹窗提示用户数据输入不完整。
二、程序设计思想:
先在草稿纸上求出三次Bezier曲线的各坐标参数前的系数表达式:
a1 = -px(0) + 3 * px(1) - 3 * px(2) + px(3)
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)
然后根据三次Bezier曲线的特点来定义为以u为变量的函数,然后根据取点速率的不同来绘制相应四个顶点的曲线。
三、程序代码:
Private Sub Command1_Click()
Picture1.DrawWidth = 2
Picture1.FontSize = 12 '此处定义绘制坐标系时的字体大小,因为后面程序要用到字体设置,故此处字体设置要重新声明,不可用系统默认的字体,否则再次绘制图形时,坐标由于字体过大而很难看
Picture1.Scale (-300, 300)-(300, -300) '定义PictureBox坐标系
Picture1.Line (-300, 0)-(300, 0)
Picture1.Line (0, 300)-(0, -300) 'VB编译系统中,其默认的是在Form(窗体)中画图,当需要在其他属性框中画图时,需要加上其对应的属性框名称
Picture1.CurrentX = 270: Picture1.CurrentY = 40: Picture1.Print "X"
Picture1.CurrentX = 15: Picture1.CurrentY = 285: Picture1.Print "Y"
Picture1.FontSize = 9 '坐标上的数字字体小一些
For i = -280 To 280 Step 40
Picture1.Line (i, 0)-(i, 8)
Picture1.CurrentX = i - 12: Picture1.CurrentY = -5: Picture1.Print i
Next i
For j = -280 To -40 Step 40
Picture1.Line (0, j)-(8, j)
Picture1.CurrentX = -28: Picture1.CurrentY = j + 10: Picture1.Print j
Next j
For j = 40 To 280 Step 40
Picture1.Line (0, j)-(8, j)
Picture1.CurrentX = -28: Picture1.CurrentY = j + 10: Picture1.Print j
Next j
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
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
MsgBox "对不起!系统检测到数据输入不完整,请您输入完整后绘图。
谢谢配合!", , "友情提示"
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
Picture1.FontSize = 18 '设置字体,为显示输入的四个点设置字体大小
Picture1.CurrentX = px(0): Picture1.CurrentY = py(0): Picture1.Print "P"; 0 'P0单独打印
For i = 0 To 2
Picture1.DrawWidth = 1.5
Picture1.Line (px(i), py(i))-(px(i + 1), py(i + 1)), vbGreen: Picture1.Print "P"; i + 1 'P1,P2,P3用for循环打印
Next i
For i = 0 To 3 '绘制四个圆点,此处代码可优化,亦可用circle语句画小圆后填充颜色
Picture1.DrawWidth = 7
Picture1.Line (px(i), py(i))-(px(i) + 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.00001'每当u增加0.00001求一次x和y
x = a1 * u ^ 3 + b1 * u * u + c1 * u + d1 '求x的值
y = a2 * u ^ 3 + b2 * u * u + c2 * u + d2 '求y的值
If u = 0 Then
Picture1.CurrentX = x '设置画线起点
Picture1.CurrentY = y
Else
Picture1.DrawWidth = 3
Picture1.Line -(x, y), RGB(255, 0, 0)'连点成线
End If
Next u
End If
End Sub
Private Sub Command2_Click() '用于清空输入数据
Text1.Text = ""
Text2.Text = ""
Text3.Text = ""
Text4.Text = ""
Text5.Text = ""
Text6.Text = ""
Text7.Text = ""
Text8.Text = ""
End Sub
Private Sub Command3_Click() '清屏后再次绘制坐标系
Picture1.Cls
Picture1.DrawWidth = 2
Picture1.FontSize = 12 '此处定义绘制坐标系时的字体大小,因为后面程序要用到字体设置,故此处字体设置要重新声明,不可用系统默认的字体,否则再次绘制图形时,坐标由于字体过大而很难看
Picture1.Scale (-300, 300)-(300, -300) '定义PictureBox坐标系
Picture1.Line (-300, 0)-(300, 0)
Picture1.Line (0, 300)-(0, -300) 'VB编译系统中,其默认的是在Form(窗体)中画图,当需要在其他属性框中画图时,需要加上其对应的属性框名称
Picture1.CurrentX = 270: Picture1.CurrentY = 40: Picture1.Print "X"
Picture1.CurrentX = 15: Picture1.CurrentY = 285: Picture1.Print "Y"
Picture1.FontSize = 9
For i = -280 To 280 Step 40
Picture1.Line (i, 0)-(i, 8)
Picture1.CurrentX = i - 12: Picture1.CurrentY = -5: Picture1.Print i
Next i
For j = -280 To -40 Step 40
Picture1.Line (0, j)-(8, j)
Picture1.CurrentX = -28: Picture1.CurrentY = j + 10: Picture1.Print j
Next j
For j = 40 To 280 Step 40
Picture1.Line (0, j)-(8, j)
Picture1.CurrentX = -28: Picture1.CurrentY = j + 10: Picture1.Print j
Next j
End Sub
Private Sub Form_Load() '预输入数据,避免调试时多次输入数据,其随窗体运行而显示
Text1.Text = -260: Text2.Text = -230 '冒号用于多条语句并行书写,以减小代码所占空间
Text3.Text = 260: Text4.Text = -230
Text5.Text = 200: Text6.Text = 230
Text7.Text = -260: Text8.Text = 230
End Sub
VB程序运行结果图片展示:
第三次程序设计心得
在三次Bezier曲线的程序设计中,明白了计算机对于图行处理的能力是相当强的。
对于VB而言,其能根据取点速率的不同而精确确定相应图形的图像,能很好的满足人们在日常工作中的图像需求。
在本次程序设计中花费了大量时间在程序优化上,特别是在界面美化上。
因为我始终觉得一个良好的可执行程序不仅要具有精确计算的能力及绘图能力,还应该具有良好的用户体验界面,真正让用户在使用该程序时能有愉悦爽朗的心情。
这是我认为的CAD辅助设计的本质。
在具体界面美化过程中,我查找了大量的背景图片,最后选定了一张自然风景为背景。
因为一张好的背景图片不仅能给人良好的审美愉悦感,而且能让工作者在枯燥的工作中心生美意,同时能给予人心灵的绿意。
这是我在CAD 课程中所学到的课外知识。
作为机械工作人员,不仅要具有严谨的工作思维,还要具有良好的审美观。
这样才能让我们在工作中不缺乏美感,不感到枯燥,更不会让同学及朋友觉得我们思维机械。
我所追求的是那种轻松学习,快乐工作的愉悦感。