三维表面图形控件是建立在OpenGL基础上的控件,给定zij=f(xi,yj)离散数据,可以绘制三维表面图形。三维图形的表面可以使用不同的颜色、光照、纹理,也可以控制其绕x、y、z轴旋转,还可以通过随时间而改变控件中的数据,制作随时间变化的动态图形。三维表面图形控件包含的文件有:matview45.ocx,gl3d20.dll,CqmImg32.dll,Visdp32.dll。
☆ Amplifier:放大倍数。
☆ AutoZScale=True/False:是否自动计算Z的最小和最大值。
☆ AxisesColor:坐标轴颜色。
☆ BackColor:背景颜色。
☆ FillIndex:颜色填充模式,取值为0,1,...9。
☆ InitOK:是否初始化成功。True成功,False失败,只读。
☆ InterpCols:插值列数。
☆ InterpRows:插值行数。
☆ isBatched:是否为批处理方式。
☆ isFilling:是否填充。
☆ isStopped:是否停止旋转。
☆ LightColor:光照颜色。
☆ LightxPos:光源位置x轴坐标。
☆ LightyPos:光源位置y轴坐标。
☆ LightzPos:光源位置z轴坐标。
☆ LineColor:绘图线颜色。
☆ MsDelay:旋转延时,单位毫秒。
☆ RotateAxis:旋转轴,取值"x", "y", "z"。
☆ showAxises:是否显示坐标轴。
☆ showLight:是否有光照。
☆ showTexture:是否显示纹理。
☆ ViewMode:显示模式,0直接利用数据绘图,1插值后绘图,2带颜色绘图,3曲面拟合绘图。
☆ xAngle:图形绕x轴的旋转角度,取值0--360。
☆ yAngle:图形绕y轴的旋转角度,取值0--360。
☆ zAngle:图形绕z轴的旋转角度,取值0--360。
☆ zAxisMax:z轴最大值。
☆ zAxisMin:z轴最小值。
☆ Function AllocateMatrix(nRows as Long, nCols as Long) as Long
【功能】为nRows × nCols矩阵的显示分配内存控件。nRows和nCols分别为矩阵的行数和列数。
【返回】行数和列数的乘积。
☆ Function getBMPTexture(Filename as String) as Long
【功能】取得纹理图象,Filename给定图象文件名称。
【返回】成功返回1,失败返回0。
☆ Function getMatFile(Fname as String,Rows as Long,Cols as Long,Mat() as Single) as Integer
【功能】打开矩阵数据文件。
【参数】Rows返回矩阵的行数;Cols矩阵返回矩阵的列数;Mat()返回矩阵的数值。
【返回】失败返回0,成功返回1。
☆ Function getMatrixVal(i as Long, j as Long, Color As Long) as Single
【功能】取得矩阵中一点的颜色和数值。
【参数】i和j分别为输入参数,即矩阵的行号和列号,起点为0。Color返回该点显示的颜色。
【返回】返回该点矩阵的数值。
☆ Function getNumofCols() as Long
【功能】取得矩阵的列数。
☆ Function getNumofRows() as Long
【功能】取得矩阵的行数。
☆ Function InterpVal(x as Single, y as Single) as Single
【功能】二维插值。给定插值点的坐标(x , y),计算插值结果。
【返回】插值结果。
☆ Sub MatrixDemo()
【功能】产生演示矩阵图形。
☆ Function MatrixShow(mat() as Single, nRows as Long, nCols as Long) as Integer
【功能】按矩阵的原始值显示矩阵。
【参数】输入mat()矩阵数值,nRows和nCols矩阵的行数和列数。
【返回】1成功,0失败。
☆ Function MatrixSurface(x() as Single, y() as Single, mat() as Single, nRows as Long, nCols as Long) as Integer
【功能】插值后矩阵显示。给定插值点x()和y()向量,和插值点数值mat(),以及矩阵的行数nRows和列数nCols,之后绘制数据图形。注意:x()的长度为nCols,y()的长度为nRows。【返回】1成功,0失败。
☆ Sub matrixValues(mat() as Single, x() as Single, y() as Single, nRows as Long, nCols as Long)
【功能】设置矩阵的数值。参考MatrixSurface。
☆ Sub Mesh()
【功能】曲面拟合显示矩阵。
☆ Function meshMatrix(mat() as Single, x() as Single, y() as Single, Rows as Long, Cols as Long) as Integer
【功能】曲面拟合显示矩阵。
【参考】MatrixSurface。
☆ Function OpenMatFile(Filename as String) as Long
【功能】打开矩阵数据文件。Filename给定数据文件名称。
【返回】成功大于0,失败小于或等于0。
☆ Sub Plot3D()
【功能】绘制三维图形。绘制方法由VideMode决定。
☆ Sub RotateXYZ()
【功能】旋转图形,绕哪个轴旋转由RotateAxis的值决定。
☆ Function setMatrixVal(i as Long, j as Long, Val as Single, Color as Long) As Single
【功能】设置矩阵中一点的数值和显示颜色。i , j 是矩阵的行号和列号,val是设置的数值,即高度,Color是该点显示时的颜色。
【返回】该点原来的高度值。
☆ Function showMatColor(mat() as Single, Color() as Long, nRow as Long, nCol as Long) as Integer
【功能】直接数据矩阵图形显示,并使用每点颜色矩阵来设置矩阵的图形的颜色。
☆ sub showValColor()
【功能】直接数据矩阵图形显示,并使用每点颜色矩阵。
【参考】showMatColor()。
☆ sub SleepMS(tMs as Long)
【功能】设置延时tMs,单位是毫秒。
☆ Sub Surface()
【功能】插值后矩阵数据图形显示。
【参考】matrixSurface。
☆ Sub ViewMat()
【功能】直接矩阵数据图形显示。
【参考】matrixShow。
☆ Click():鼠标单击事件。
☆ DblClick():鼠标双击事件。
☆ MouseMove(Button As Integer, Shift As Integer, X as Single, Y as Single):鼠标移动事件。
☆ MouseDown(Button As Integer, Shift As Integer, X as Single, Y as Single):鼠标按下键事件。
☆ MouseUp(Button As Integer, Shift As Integer, X as Single, Y as Single):鼠标按钮松开事件。
☆ ResizeGraph():控件改变尺寸事件。
一 向控件中置入数据
Public Function setMatData() As Long
Dim i As Long, j As Long, v As Single, C As Long, X As Single, Y As Single
With matShow1
.AllocateMatrix nMatCols, nMatRows
.MatrixAxisVal yMatVals, nMatRows, xMatVals, nMatCols
For i = 0 To nMatCols - 1
X = (CSng(i) / (nMatCols - 1) - 0.5) * 2
For j = 0 To nMatRows - 1
Y = (CSng(j) / (nMatRows - 1) - 0.5) * 2
v = (X * X + Y * Y) / 2
v = Sqr(v)
C = CLng(v * 255)
C = 255 - C + (255 - C) * 65536 + C * 256
.setMatrixVal i, j, zMatVals(j * nMatCols + i), C
Next j
Next i
.AutoZScale = True
.FillIndex = 10
.isBatched = False
.zAngle = DefaultAngle + 180
End With
setMatData = 1
End Function
二 放大和缩小图形
Private Sub idm_Zoom_Click()
If matShow1.Amplifier < 20 Then
matShow1.Amplifier = matShow1.Amplifier * 1.5
If Language = 0 Then
Label5.Caption = "Amplifier=" & matShow1.Amplifier
Else
Label5.Caption = "放大倍数=" & matShow1.Amplifier
End If
End If
End Sub
Private Sub idm_ZoomMinus_Click()
If matShow1.Amplifier > 0.2 Then
matShow1.Amplifier = matShow1.Amplifier / 1.5
If Language = 0 Then
Label5.Caption = "Amplifier=" & matShow1.Amplifier
Else
Label5.Caption = "放大倍数=" & matShow1.Amplifier
End If
End If
End Sub
三 动态改变数据
Private Sub idm_RandZ_Click()
isStop = True
matShow1.isStopped = True
If isColorChange = False Then
isColorChange = True
Dim N&, m&, i&, j&, z As Single, z1!, z2!
N = matShow1.getNumofRows
m = matShow1.getNumofCols
ReDim ma(0 To N * m) As Single
ReDim C(0 To N * m) As Long
z1 = matShow1.zAxisMin
z2 = matShow1.zAxisMax
For i = 0 To N - 1
For j = 0 To m - 1
z = matShow1.getMatrixVal(i, j, C(i * m + j))
ma(i * m + j) = z
Next j
Next i
Do While isColorChange
For i = 0 To N - 1
For j = 0 To m - 1
ma(i * m + j) = ma(i * m + j) + (Rnd - 0.5) * (z2 - z1) / 4
Call matShow1.setMatrixVal(i, j, ma(i * m + j), C(i * m + j))
Next j
Next i
DoEvents
matShow1.Plot3D
Else
isColorChange = False
End If
End Sub
四 三维图形绘制
本例绘制一个近似二维正态分布的图形,使用了插值后绘图(ViewMode=1),并且不同的XOY平面区域,对应图形的表面颜色也不同,绘图结果如图4.16所示。
Public Sub PlotData()
Dim i As Long, j As Long, v As Single, C As Long, X As Single, Y As Single
Dim nMatCols As Long, nMatRows As Long, DefaultAngle As Single
Me.ScaleMode = 3
DefaultAngle = 30
'产生三维数据
nMatCols = 25: nMatRows = 25
ReDim ymatvals(0 To nMatRows - 1) As Single
ReDim xmatvals(0 To nMatCols - 1) As Single
ReDim zmatvals(0 To nMatRows * nMatCols - 1) As Single
For i = 0 To nMatRows - 1
ymatvals(i) = CSng(i) / nMatRows
Next i
For i = 0 To nMatCols - 1
xmatvals(i) = CSng(i) / nMatCols
Next i
For i = 0 To nMatRows - 1
For j = 0 To nMatCols - 1
v = (xmatvals(j) - 0.5) * (xmatvals(j) - 0.5) * 25
v = v + (ymatvals(i) - 0.5) * (ymatvals(i) - 0.5) * 25
zmatvals(i * nMatCols + j) = Exp(-v)
Next j
Next i
'初始化绘图系统
matShow1.InitGraph
If matShow1.InitOK = False Then
Exit Sub
End If
With matShow1
.AllocateMatrix nMatCols, nMatRows
.MatrixAxisVal ymatvals, nMatRows, xmatvals, nMatCols
.isBatched = True
For i = 0 To nMatCols - 1
X = (CSng(i) / (nMatCols - 1) - 0.5) * 2
For j = 0 To nMatRows - 1
Y = (CSng(j) / (nMatRows - 1) - 0.5) * 2
v = (X * X + Y * Y) / 2
v = Sqr(v)
C = CLng(v * 255)
C = 255 - C + (255 - C) * 65536 + C * 256
.setMatrixVal i, j, zmatvals(j * nMatCols + i), C
Next j
Next i
.AutoZScale = True
.zAngle = 360 - 30
.FillIndex = 10
.InterpCols = 100: .InterpRows = 100
.ViewMode = 1
.Plot3D
End With
End Sub
绘图实例
|
三维图形绘制 |
加光照图形
|
颜色填充图形
|
|
加纹理图形 |
|
|
ChengBo Software Workshop
Email: chengbosoft@126.com