MatView45.Ocx三维表面图形控件

MatView45三维表面图形控件下载

      三维表面图形控件是建立在OpenGL基础上的控件,给定zij=f(xi,yj)离散数据,可以绘制三维表面图形。三维图形的表面可以使用不同的颜色、光照、纹理,也可以控制其绕xyz轴旋转,还可以通过随时间而改变控件中的数据,制作随时间变化的动态图形。三维表面图形控件包含的文件有:matview45.ocxgl3d20.dllCqmImg32.dllVisdp32.dll

1  控件的属性

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

zAxisMaxz轴最大值。

zAxisMinz轴最小值。

2  控件的方法

Function AllocateMatrix(nRows as Long, nCols as Long) as Long

【功能】为nRows × nCols矩阵的显示分配内存控件。nRowsnCols分别为矩阵的行数和列数。

【返回】行数和列数的乘积。

 

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

【功能】取得矩阵中一点的颜色和数值。

【参数】ij分别为输入参数,即矩阵的行号和列号,起点为0Color返回该点显示的颜色。

【返回】返回该点矩阵的数值。

 

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()矩阵数值,nRowsnCols矩阵的行数和列数。

【返回】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()的长度为nColsy()的长度为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

3  控件的事件

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():控件改变尺寸事件。

 

4  编程举例

      向控件中置入数据

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

      Loop

   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

http://www.chengbosoft.com

Email: chengbosoft@126.com