三次Bezier曲线

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

k
-
20:
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() Dim px(4) As Double '清除屏幕后,重建坐标系 '此模块为清除输入框中的值
'计算 x 和 y 的参数
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 四. 设计截图: '退出窗口程序 '连点成线 '设置画线起点
3 2 3 2


(1) (2)
根据以上结果(1)和(2)编程求得当u取不同值时所得到的点P(u) 。再将各点 用线连接起来即可拟合三次Bezier曲。 三. 设计过程: 以下是用VB编三次Bezier曲线时的源代码: 其中显示四个控制点的思路是将控制点在x和y方向的坐标值都增大1,然后再与 控制点用粗实线连接起来。这样一来在窗口中显示的即为一个较大的实点。 Function drawcs() '此模块为建立坐标系
图四.三次Bezier曲线截图
机械 10904 班 刘佳来 2012.3.28
'定义控制点的 y 坐标的数组 '定义 x 系数 '定义 y 系数 '定义曲线中的自变量 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 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 '判断输入框中的字符是否为数字,
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 = PictDraw.CurrentY = 5: PictDraw.Print k Next k
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)
作业三:三次 Bezier 曲线
一. 设计要求: 1.在程序窗口中建立坐标系 2.输入控制点,绘制出三次Bezier曲线 3.四个控制点间依次用细线连接 4.在程序窗口显示四个控制点的位置并标出 二. 设计思路: 先在草稿纸上算出三次Bezier曲线的函数表达式: P(u)=(1 − u) P0 +3u(1 − u) P1 +3u
3 2 2
1 − u P2 +u P3

1

3
3 1 3 0 0 0 0 0
u3
u2
u 1
3 wenku.baidu.com 3 3 1 0
P0 P1 P2 P3
(0≤u≤1)
=a×u +b×u +c×u+d 其中a、b、c、d的值为: a=(-P0 ) + 3 × P1 - 3 × P2 + P3 b=3× P0 - 6 × P1 + 3 × P2 c=(-3) × P0 + 3 × P1 d=P0 将P0 、P1 、 P2 、 P3 中的(x,y)坐标值分别代入a、b、c、d中得到 a1 、b1 、c1 、d1 和a2 、b2 、c2 、d2 则: P(u)X=a1 ×u +b1 ×u +c1 ×u+d1 P(u)Y=a2 ×u +b2 ×u +c2 ×u+d2
'此模块为画三次 Bezier 曲线 '定义控制点的 x 坐标的数组
Dim py(4) As Double Dim a1, b1, c1, d1 As Double Dim a2, b2, c2, d2 As Double Dim x, y, u As Double Dim i As Integer
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
相关文档
最新文档