回 帖 发 新 帖 刷新版面

主题:请教:VB画二维曲线

新手,请各位大侠多帮忙!我遇到一个题目,数据都有了,VB编程遇到了困难。数据是(2.34,8765.9)(3.67,11754.6)(4.99,13398.6)(6.32,14146.6)(7.64,14376.8)(8.97,14335.7)(10.30,14179.5)(11.62,13966.4)(12.95,13653.4)(14.27,13094.5)(15.59,12046.9)怎样用VB连成平滑曲线,急着用,谢谢各位高手了

回复列表 (共7个回复)

沙发

连成平滑曲线
这是一个“插值”算法的问题。

vb总体思路应该是这样:

读入数据组,同时分析出两个方向的最大值和最小值。对最大值和最小值扩大范围到有一定余量的“整数”
按扩大范围后的最大值、最小值设定图片框度量单位。
如果原始数据是无序的,对原始数据按照某一座标(一般按横坐标)排序。
画坐标系
标注坐标系
按数据顺序对相邻两点之间插值,并描点

板凳

谢了,请教高手,能不能给个实例,我想速成一下,快交了,急用

3 楼

既然快交了,我就不好说了。

4 楼

我曾经做过,完全符合你的要求

你试试,在窗体我用text1(i),text2(i)放数据,text3放n的值,即需要连接的点的个数。

Private Sub PublicDraw(n As Integer, x() As Double, y() As Double, Picture1 As PictureBox)
'n 为点数,x() y()存贮点坐标
'其中 x(0 To n - 1), y(0 To n - 1)
Dim h() As Double, p() As Double, aa() As Double, bb() As Double, dd() As Double, mm() As Double

ReDim h(1 To n - 1), p(1 To n - 1)
ReDim aa(1 To n - 2), bb(1 To n - 2), dd(1 To n - 2)
ReDim mm(0 To n - 1)

Picture1.ScaleMode = 6

For i = 1 To n - 1: h(i) = x(i) - x(i - 1): Next
For i = 1 To n - 1: p(i) = (y(i) - y(i - 1)) / h(i): Next
For i = 1 To n - 2: dd(i) = (n - 1) * (p(i + 1) - p(i)): Next
aa(1) = 2 * (h(1) + h(2))
For i = 2 To n - 2: aa(i) = 2 * (h(i) + h(i + 1)) - h(i) * h(i) / aa(i - 1): Next
bb(1) = dd(1)
For i = 2 To n - 2: bb(i) = dd(i) - h(i) * bb(i - 1) / aa(i - 1): Next
mm(0) = 0
mm(n - 1) = 0
mm(n - 2) = bb(n - 2) / aa(n - 2)
For i = 1 To n - 3: mm(i) = (bb(i) - h(i + 1) * mm(i + 1)) / aa(i): Next
For i = 0 To n - 1: Picture1.Circle (x(i), y(i)), 0.5, vbRed: Next

Dim xxx As Double, ff As Double
For i = 0 To n - 2
For xxx = x(i) To x(i + 1) Step 0.01
ff = (mm(i) / ((n - 1) * h(i + 1))) * ((x(i + 1) - xxx) ^ 3) + _
      (mm(i + 1) / ((n - 1) * h(i + 1))) * ((xxx - x(i)) ^ 3) + _
      ((y(i) - mm(i) * h(i + 1) * h(i + 1) / (n - 1)) / h(i + 1)) * (x(i + 1) - xxx) + _
      ((y(i + 1) - mm(i + 1) * h(i + 1) * h(i + 1) / (n - 1)) / h(i + 1)) * (xxx - x(i))
Picture1.PSet (xxx, ff)
Next xxx
Next i

End Sub
Private Sub Command1_Click()
Picture1.AutoRedraw = True
Picture1.Cls
Dim n As Integer
n = Val(Text3.Text)
Dim x() As Double, y() As Double
ReDim x(0 To n - 1), y(0 To n - 1)
For i = 0 To n - 1
x(i) = Val(Text1(i).Text)
y(i) = Val(Text2(i).Text)
Next
Call PublicDraw(n, x(), y(), Picture1)
End Sub

5 楼

以上单位刻度是毫米。



(2.34,8765.9)(3.67,11754.6)(4.99,13398.6)(6.32,14146.6)(7.64,14376.8)(8.97,14335.7)(10.30,14179.5)(11.62,13966.4)(12.95,13653.4)(14.27,13094.5)(15.59,12046.9)

你给横坐标×10,纵坐标÷100,这样曲线就好看了。

6 楼



[img]http://hiphotos.baidu.com/lihua%5F073/pic/item/17b2e2954051c158d1135ec3.jpg[/img]
还不会贴图,放在我的百度空间里了,顺便大家教我一下贴图,谢谢。

7 楼

拜谢楼上老师!!!

我来回复

您尚未登录,请登录后再回复。点此登录或注册