用vb怎么能把两点用光滑的曲线连接起来!? 哪位大侠能告诉我用vb怎么能把两点用光滑的曲线连接起来!? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Google 函数拟合,贝塞尔曲线,多次平滑。 两个点,我们可以用一个二次曲线来拟和。假设 f(x) = ax^2+bx+c,将两点坐标代入,可以求得 a、b、c。那么在 x1~x2之间,取得足够多的 f(x),并且把这些线段连起来,就是光滑的曲线。通常情况下,二次曲线拟和效果不好,我们可以换更高次的曲线,比如三次曲线。至于根据曲线采样作图,则有很多办法,最简单的是 VB 的 Line 方法。 http://so.csdn.net/search?t=thread&q=%E6%9B%B2%E7%BA%BF%E6%8B%9F%E5%90%88 三次样条.rar y = a * sin x + r + b将点代入。 y = a * sin (x + r) + b将点代入。 三次样条.rar 这个文件早就没有了啊,哈哈 三次样条曲线是用的较多的通过点的方式,绘制出来的曲线平滑,符合自然规律。http://download.csdn.net/source/1894278 我没有积分,也不是VIP无法下载,该怎么办? 以下将LZ的数据用三次样条.rar中的VB工程运行所得的图形: Option Explicit Dim Xi() As Single, Yi() As Single, u1(40000) As Single, v1(40000) As Single Dim a() As Single, b() As Single, c() As Single, dx() As Single, dy() As Single Dim qx() As Single, qy() As Single Dim num As Integer Dim ii As Long Const PP = 100Function hypot(ByVal X As Single, ByVal Y As Single) hypot = Sqr(X ^ 2 + Y ^ 2)End FunctionSub tspLine(ByVal n As Integer, ByVal ch As Integer, ByVal tx1 As Single, ByVal tx2 As Single, ByVal ty1 As Single, ByVal ty2 As Single) Dim tt As Single, bx3 As Single, bx4 As Single, by3 As Single, by4 As Single Dim cx As Single, cy As Single, t(100) As Single, px(100) As Single, py(100) As Single Dim u(3) As Single, v(3) As Single, i As Integer num = 0 For i = 1 To n t(i) = hypot(Xi(i) - Xi(i - 1), Yi(i) - Yi(i - 1)) Next i Select Case ch Case 0 '抛物条件 u(0) = (Xi(1) - Xi(0)) / t(1): u(1) = (Xi(2) - Xi(1)) / t(2) u(2) = (u(1) - u(0)) / (t(2) + t(1)) tx1 = u(0) - u(2) * t(1) u(0) = (Yi(1) - Yi(0)) / t(1): u(1) = (Yi(2) - Yi(1)) / t(2) u(2) = (u(1) - u(0)) / (t(2) + t(1)) ty1 = u(0) - u(2) * t(1) u(0) = (Xi(n) - Xi(n - 1)) / t(n): u(1) = (Xi(n - 1) - Xi(n - 2)) / t(n - 1) u(2) = (u(0) - u(1)) / (t(n) + t(n - 1)) tx2 = u(0) + u(2) * t(n) u(0) = (Yi(n) - Yi(n - 1)) / t(n): u(1) = (Yi(n - 1) - Yi(n - 2)) / t(n - 1) u(2) = (u(0) - u(1)) / (t(n) + t(n - 1)) ty2 = u(0) + u(2) * t(n) Case 1 '夹持条件 a(0) = 1: c(0) = 0: dx(0) = tx1: dy(0) = ty1 a(n) = 1: b(n) = 0: dx(n) = tx2: dy(n) = ty2 Case 2 '自由条件 a(0) = 2: c(0) = 1 dx(0) = 3 * (Xi(1) - Xi(0)) / t(1): dy(0) = 3 * (Yi(1) - Yi(0)) / t(1) a(n) = 2: b(n) = 1 dx(n) = 3 * (Xi(n) - Xi(n - 1)) / t(n): dy(n) = 3 * (Yi(n) - Yi(n - 1)) / t(n) Case 3 '循环条件 a(0) = 2: c(0) = 1 dx(0) = 3 * (Xi(1) - Xi(0)) / t(1) - (t(1) * (Xi(2) - Xi(1)) / t(2) - Xi(1) + Xi(0)) / (t(1) + t(2)) dy(0) = 3 * (Yi(1) - Yi(0)) / t(1) - (t(1) * (Yi(2) - Yi(1)) / t(2) - Yi(1) + Yi(0)) / (t(1) + t(2)) a(n) = 2: b(n) = 1 dx(n) = 3 * (Xi(n) - Xi(n - 1)) / t(n) dx(n) = dx(n) + (Xi(n) - Xi(n - 1) - t(n) * (Xi(n - 1) - Xi(n - 2)) / t(n - 1)) / (t(n) + t(n - 1)) dy(n) = 3 * (Yi(n) - Yi(n - 1)) / t(n) dy(n) = dy(n) + (Yi(n) - Yi(n - 1) - t(n) * (Yi(n - 1) - Yi(n - 2)) / t(n - 1)) / (t(n) + t(n - 1)) End Select '计算方程组系数阵和常数阵 For i = 1 To n - 1 a(i) = 2 * (t(i) + t(i + 1)): b(i) = t(i + 1): c(i) = t(i) dx(i) = 3 * (t(i) * (Xi(i + 1) - Xi(i)) / t(i + 1) + t(i + 1) * (Xi(i) - Xi(i - 1)) / t(i)) dy(i) = 3 * (t(i) * (Yi(i + 1) - Yi(i)) / t(i + 1) + t(i + 1) * (Yi(i) - Yi(i - 1)) / t(i)) Next i '采用追赶法解方程组 c(0) = c(0) / a(0) For i = 1 To n - 1 a(i) = a(i) - b(i) * c(i - 1): c(i) = c(i) / a(i) Next i a(n) = a(n) - b(n) * c(i - 1) qx(0) = dx(0) / a(0): qy(0) = dy(0) / a(0) For i = 1 To n qx(i) = (dx(i) - b(i) * qx(i - 1)) / a(i) qy(i) = (dy(i) - b(i) * qy(i - 1)) / a(i) Next i px(n) = qx(n): py(n) = qy(n) For i = n - 1 To 0 Step -1 px(i) = qx(i) - c(i) * px(i + 1) py(i) = qy(i) - c(i) * py(i + 1) Next i '计算曲线上点的坐标 For i = 0 To n - 1 bx3 = (3 * (Xi(i + 1) - Xi(i)) / t(i + 1) - 2 * px(i) - px(i + 1)) / t(i + 1) bx4 = ((2 * (Xi(i) - Xi(i + 1)) / t(i + 1) + px(i) + px(i + 1)) / t(i + 1)) / t(i + 1) by3 = (3 * (Yi(i + 1) - Yi(i)) / t(i + 1) - 2 * py(i) - py(i + 1)) / t(i + 1) by4 = ((2 * (Yi(i) - Yi(i + 1)) / t(i + 1) + py(i) + py(i + 1)) / t(i + 1)) / t(i + 1) tt = 0 While (tt <= t(i + 1)) cx = Xi(i) + (px(i) + (bx3 + bx4 * tt) * tt) * tt cy = Yi(i) + (py(i) + (by3 + by4 * tt) * tt) * tt u1(num) = cx: v1(num) = cy: num = num + 1: tt = tt + 0.5 Wend u1(num) = Xi(i + 1): v1(num) = Yi(i + 1): num = num + 1 Next iEnd SubPrivate Sub Form_Load() ReDim Xi(PP) ReDim Yi(PP) ReDim a(PP) ReDim b(PP) ReDim c(PP) ReDim dx(PP) ReDim dy(PP) ReDim qx(PP) ReDim qy(PP) Dim i As Long ii = 0 Picture1.Scale (-5, 450)-(16, 250) Xi(0) = 1 Yi(0) = 306 Xi(1) = 2 Yi(1) = 409 Xi(2) = 3 Yi(2) = 306 Xi(3) = 4 Yi(3) = 409 Xi(4) = 5 Yi(4) = 306 Xi(5) = 6 Yi(5) = 409 Xi(6) = 7 Yi(6) = 306 Xi(7) = 8 Yi(7) = 409 Xi(8) = 9 Yi(8) = 306 Xi(9) = 10 Yi(9) = 409 Xi(10) = 11 Yi(10) = 306 Xi(11) = 12 Yi(11) = 409 Xi(12) = 13 Yi(12) = 306 Xi(13) = 14 Yi(13) = 409 For i = 1 To 13 Load Shape1(i) Shape1(i).Visible = True Next Picture1.ForeColor = RGB(200, 200, 200) Picture1.Line (Picture1.ScaleLeft, 0)-(Picture1.ScaleLeft + Picture1.ScaleWidth, 0) Picture1.Line (0, Picture1.ScaleTop)-(0, Picture1.ScaleTop + Picture1.ScaleHeight) Picture1.ForeColor = RGB(255, 0, 0) For i = 0 To 13 Shape1(i).Left = Xi(i) - Shape1(i).Width / 2 Shape1(i).Top = Yi(i) + Shape1(i).Height / 2 Next i For i = 0 To 3 Picture1.PSet (Xi(i), Yi(i)) Next i tspLine 13, 2, 0, 0, 0, 0 Picture1.PSet (u1(0), v1(0)) For i = 1 To num - 1 Picture1.Line -(u1(i), v1(i)) Next iEnd Sub 此代码是来自VBGood坛友ymismy提供的三次样条工程. 兄弟,在我机器上运行怎么没有结果,你这Shape1是怎么加上去的!? 给你下载链接,你说我点了,这个连接的文件根本不是,给你代码你问:在我机器上运行怎么没有结果,你这Shape1是怎么加上去的!?,这些都在预料之中.Shape1是怎么加上去的:见图: 这个问题应该可以用最小二乘拟合。LZ好运气,前两天刚刚弄完这方面的程序。建议LZ看看数值分析。开始部分就有。不过手头程序是C的,需要的话可以留邮箱。要转成VB需要时间。 Shape1是在PictureBox上绘制出来的.不能用双击鼠标方法添加. 送分100分:很简单的问题,关于KeyDown KeyPress KeyUp这三个事件的响应问题 关于图片填充的问题 数组很大溢出了怎么办? 收藏夹恢复了,散分! 如何用winsock控件进行远程数据库访问? 问一个小的很的程序 请问关于调试Com+组件 如何定义一全局变量,在每个窗体中都可以引用! 一个ado的疑问,请大家解释 急,急,急!如何把FLEXGRID的数据导出到EXCEL表中! 关于窗体子类化 多年VB+Sql Server编程经验,求长沙的工作机会。
将点代入。
将点代入。
http://download.csdn.net/source/1894278
以下将LZ的数据用三次样条.rar中的VB工程运行所得的图形:
Dim Xi() As Single, Yi() As Single, u1(40000) As Single, v1(40000) As Single
Dim a() As Single, b() As Single, c() As Single, dx() As Single, dy() As Single
Dim qx() As Single, qy() As Single
Dim num As Integer
Dim ii As Long
Const PP = 100
Function hypot(ByVal X As Single, ByVal Y As Single)
hypot = Sqr(X ^ 2 + Y ^ 2)
End FunctionSub tspLine(ByVal n As Integer, ByVal ch As Integer, ByVal tx1 As Single, ByVal tx2 As Single, ByVal ty1 As Single, ByVal ty2 As Single)
Dim tt As Single, bx3 As Single, bx4 As Single, by3 As Single, by4 As Single
Dim cx As Single, cy As Single, t(100) As Single, px(100) As Single, py(100) As Single
Dim u(3) As Single, v(3) As Single, i As Integer
num = 0
For i = 1 To n
t(i) = hypot(Xi(i) - Xi(i - 1), Yi(i) - Yi(i - 1))
Next i
Select Case ch
Case 0 '抛物条件
u(0) = (Xi(1) - Xi(0)) / t(1): u(1) = (Xi(2) - Xi(1)) / t(2)
u(2) = (u(1) - u(0)) / (t(2) + t(1))
tx1 = u(0) - u(2) * t(1)
u(0) = (Yi(1) - Yi(0)) / t(1): u(1) = (Yi(2) - Yi(1)) / t(2)
u(2) = (u(1) - u(0)) / (t(2) + t(1))
ty1 = u(0) - u(2) * t(1)
u(0) = (Xi(n) - Xi(n - 1)) / t(n): u(1) = (Xi(n - 1) - Xi(n - 2)) / t(n - 1)
u(2) = (u(0) - u(1)) / (t(n) + t(n - 1))
tx2 = u(0) + u(2) * t(n)
u(0) = (Yi(n) - Yi(n - 1)) / t(n): u(1) = (Yi(n - 1) - Yi(n - 2)) / t(n - 1)
u(2) = (u(0) - u(1)) / (t(n) + t(n - 1))
ty2 = u(0) + u(2) * t(n)
Case 1 '夹持条件
a(0) = 1: c(0) = 0: dx(0) = tx1: dy(0) = ty1
a(n) = 1: b(n) = 0: dx(n) = tx2: dy(n) = ty2
Case 2 '自由条件
a(0) = 2: c(0) = 1
dx(0) = 3 * (Xi(1) - Xi(0)) / t(1): dy(0) = 3 * (Yi(1) - Yi(0)) / t(1)
a(n) = 2: b(n) = 1
dx(n) = 3 * (Xi(n) - Xi(n - 1)) / t(n): dy(n) = 3 * (Yi(n) - Yi(n - 1)) / t(n)
Case 3 '循环条件
a(0) = 2: c(0) = 1
dx(0) = 3 * (Xi(1) - Xi(0)) / t(1) - (t(1) * (Xi(2) - Xi(1)) / t(2) - Xi(1) + Xi(0)) / (t(1) + t(2))
dy(0) = 3 * (Yi(1) - Yi(0)) / t(1) - (t(1) * (Yi(2) - Yi(1)) / t(2) - Yi(1) + Yi(0)) / (t(1) + t(2))
a(n) = 2: b(n) = 1
dx(n) = 3 * (Xi(n) - Xi(n - 1)) / t(n)
dx(n) = dx(n) + (Xi(n) - Xi(n - 1) - t(n) * (Xi(n - 1) - Xi(n - 2)) / t(n - 1)) / (t(n) + t(n - 1))
dy(n) = 3 * (Yi(n) - Yi(n - 1)) / t(n)
dy(n) = dy(n) + (Yi(n) - Yi(n - 1) - t(n) * (Yi(n - 1) - Yi(n - 2)) / t(n - 1)) / (t(n) + t(n - 1))
End Select
'计算方程组系数阵和常数阵
For i = 1 To n - 1
a(i) = 2 * (t(i) + t(i + 1)): b(i) = t(i + 1): c(i) = t(i)
dx(i) = 3 * (t(i) * (Xi(i + 1) - Xi(i)) / t(i + 1) + t(i + 1) * (Xi(i) - Xi(i - 1)) / t(i))
dy(i) = 3 * (t(i) * (Yi(i + 1) - Yi(i)) / t(i + 1) + t(i + 1) * (Yi(i) - Yi(i - 1)) / t(i))
Next i
'采用追赶法解方程组
c(0) = c(0) / a(0)
For i = 1 To n - 1
a(i) = a(i) - b(i) * c(i - 1): c(i) = c(i) / a(i)
Next i
a(n) = a(n) - b(n) * c(i - 1)
qx(0) = dx(0) / a(0): qy(0) = dy(0) / a(0)
For i = 1 To n
qx(i) = (dx(i) - b(i) * qx(i - 1)) / a(i)
qy(i) = (dy(i) - b(i) * qy(i - 1)) / a(i)
Next i
px(n) = qx(n): py(n) = qy(n)
For i = n - 1 To 0 Step -1
px(i) = qx(i) - c(i) * px(i + 1)
py(i) = qy(i) - c(i) * py(i + 1)
Next i
'计算曲线上点的坐标
For i = 0 To n - 1
bx3 = (3 * (Xi(i + 1) - Xi(i)) / t(i + 1) - 2 * px(i) - px(i + 1)) / t(i + 1)
bx4 = ((2 * (Xi(i) - Xi(i + 1)) / t(i + 1) + px(i) + px(i + 1)) / t(i + 1)) / t(i + 1)
by3 = (3 * (Yi(i + 1) - Yi(i)) / t(i + 1) - 2 * py(i) - py(i + 1)) / t(i + 1)
by4 = ((2 * (Yi(i) - Yi(i + 1)) / t(i + 1) + py(i) + py(i + 1)) / t(i + 1)) / t(i + 1)
tt = 0
While (tt <= t(i + 1))
cx = Xi(i) + (px(i) + (bx3 + bx4 * tt) * tt) * tt
cy = Yi(i) + (py(i) + (by3 + by4 * tt) * tt) * tt
u1(num) = cx: v1(num) = cy: num = num + 1: tt = tt + 0.5
Wend
u1(num) = Xi(i + 1): v1(num) = Yi(i + 1): num = num + 1
Next i
End SubPrivate Sub Form_Load()
ReDim Xi(PP)
ReDim Yi(PP)
ReDim a(PP)
ReDim b(PP)
ReDim c(PP)
ReDim dx(PP)
ReDim dy(PP)
ReDim qx(PP)
ReDim qy(PP)
Dim i As Long
ii = 0
Picture1.Scale (-5, 450)-(16, 250)
Xi(0) = 1
Yi(0) = 306
Xi(1) = 2
Yi(1) = 409
Xi(2) = 3
Yi(2) = 306
Xi(3) = 4
Yi(3) = 409
Xi(4) = 5
Yi(4) = 306
Xi(5) = 6
Yi(5) = 409
Xi(6) = 7
Yi(6) = 306
Xi(7) = 8
Yi(7) = 409
Xi(8) = 9
Yi(8) = 306
Xi(9) = 10
Yi(9) = 409
Xi(10) = 11
Yi(10) = 306
Xi(11) = 12
Yi(11) = 409
Xi(12) = 13
Yi(12) = 306
Xi(13) = 14
Yi(13) = 409
For i = 1 To 13
Load Shape1(i)
Shape1(i).Visible = True
Next
Picture1.ForeColor = RGB(200, 200, 200)
Picture1.Line (Picture1.ScaleLeft, 0)-(Picture1.ScaleLeft + Picture1.ScaleWidth, 0)
Picture1.Line (0, Picture1.ScaleTop)-(0, Picture1.ScaleTop + Picture1.ScaleHeight)
Picture1.ForeColor = RGB(255, 0, 0)
For i = 0 To 13
Shape1(i).Left = Xi(i) - Shape1(i).Width / 2
Shape1(i).Top = Yi(i) + Shape1(i).Height / 2
Next i
For i = 0 To 3
Picture1.PSet (Xi(i), Yi(i))
Next i
tspLine 13, 2, 0, 0, 0, 0
Picture1.PSet (u1(0), v1(0))
For i = 1 To num - 1
Picture1.Line -(u1(i), v1(i))
Next i
End Sub
见图:
不过手头程序是C的,需要的话可以留邮箱。要转成VB需要时间。
Shape1是在PictureBox上绘制出来的.不能用双击鼠标方法添加.