我编写了一个计算程序(vb)。最后的计算结果可以画成一个三维的曲面图,图形之中的每一个点是计算的结果。现在的问题是:
   1。不知道怎样画才能呈现一个三维的效果。
   2。望我画出的图形能够让用户转动,从不同的角度看,就像在3dmax之中看一个3D模型一样。
   不知道怎样做才能实现这样的效果,望得到大家的帮助,谢谢大家!

解决方案 »

  1.   

    什么样的曲线图,曲线方程是什么?否则怎么给你画!?Private CenterX As Integer
    Private CenterY As Integer
    Private Const Size = 40
    Private CurX As Integer
    Private CurY As Integer
    Private CurZ As Integer
    Private MoveTo As Integer
    Private Const MOVE_LEFT = 0
    Private Const MOVE_RIGHT = 1
    Private Const MOVE_UP = 2
    Private Const MOVE_DOWN = 3
    Private Const MOVE_FORWARD = 4
    Private Const MOVE_BACKWARD = 5
    Public Sub EraseBlock()
    X = CurX: y = CurY: Z = CurZ
    xs = (CenterX + X * Size) - Z * (Size / 2)
    Ys = (CenterY - y * Size) + Z * (Size / 2)
    Line (xs, Ys)-(xs + Size, Ys - Size), BackColor, BF
    Line (xs - Size / 2, Ys + Size / 2)-(xs + Size / 2, Ys - Size / 2), BackColor, BF
    For i = 0 To Size / 2
    Line (xs - i, Ys + i)-(xs - i, Ys + i - Size - 1), BackColor
    Line (xs - i + Size, Ys + i)-(xs - i + Size, Ys + i - Size), BackColor
    Next
    End Sub
    Public Sub DrawBlock()
    Line (CenterX, CenterY)-(CenterX + Size * 6, CenterY - Size * 6), vbBlue, B
    Line (CenterX, CenterY)-(CenterX - Size * 6 / 2, CenterY + Size * 6 / 2), vbBlue
    Line (CenterX, CenterY - Size * 6)-(CenterX - Size * 6 / 2, CenterY + Size * 6 / 2 - Size * 6), vbBlue
    Line (CenterX + 1, CenterY - 1)-(CenterX + Size * 6 - 1, CenterY - Size * 6 + 1), RGB(0, 60, 0), BF
    For i = 1 To Size * 6 / 2 - 1
    Line (CenterX - i + 1, CenterY + i)-(CenterX - i + Size * 6, CenterY + i), RGB(0, 60 + i * 2, 0)
    NextFor i = 0 To Size * 6 / 2 - 1
    Line (CenterX - i - 1, CenterY + i)-(CenterX - i - 1, CenterY + i - Size * 6 + 1), RGB(0, 60 + i * 2, 0)
    Next
    Label1.Caption = "X : " & CurX & vbCrLf & "Y : " & CurY & vbCrLf & "Z : " & CurZ & vbCrLf
    X = CurX: y = CurY: Z = CurZ
    col = 10 + Z * 20
    xs = (CenterX + X * Size) - Z * (Size / 2)
    Ys = CenterY + Z * (Size / 2)
    For i = 0 To Size / 2
    Line (xs - i, Ys + i)-(xs - i + Size, Ys + i), vbBlack
    Next
    Ys = (CenterY - y * Size) + Z * (Size / 2)
    Line (xs - Size / 2 + 1, Ys + Size / 2 - 1)-(xs + Size / 2 - 1, Ys - Size / 2 + 1), RGB(col + 120, 0, 0), BF
    Line (xs + 1, Ys - 1)-(xs + Size - 1, Ys - Size + 1), RGB(col, 0, 0), BF
    For i = 0 To Size / 2
    Line (xs - i, Ys + i)-(xs - i + Size, Ys + i), RGB(col + i * 8, 0, 0)
    Line (xs - i, Ys + i)-(xs - i, Ys + i - Size), RGB(col + i * 8, 0, 0)
    Line (xs - i + Size, Ys + i)-(xs - i + Size, Ys + i - Size), RGB(col + i * 8, 0, 0)
    Next
    Line (CenterX - Size * 6 / 2, CenterY + Size * 6 / 2)-(CenterX + Size * 6 / 2, CenterY - Size * 6 / 2), vbBlue, B
    Line (CenterX + Size * 6, CenterY)-(CenterX + Size * 6 - Size * 6 / 2, CenterY + Size * 6 / 2), vbBlue
    Line (CenterX + Size * 6, CenterY - Size * 6)-(CenterX + Size * 6 - Size * 6 / 2, CenterY + Size * 6 / 2 - Size * 6), vbBlue
    End Sub
    Private Sub cmdDemo_Click()
    Select Case cmdDemo.Caption
    Case "DEMO ON"
    Timer1.Enabled = True
    cmdDemo.Caption = "DEMO OFF"
    Case Else
    Timer1.Enabled = False
    cmdDemo.Caption = "DEMO ON"
    End Select
    End SubPrivate Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    Select Case KeyCode
    Case vbKeyLeft
    If CurX > 0 Then
    EraseBlock
    CurX = CurX - 1
    DrawBlock
    End If
    Case vbKeyRight
    If CurX < 5 Then
    EraseBlock
    CurX = CurX + 1
    DrawBlock
    End If
    Case vbKeyUp
    If Shift = 0 Then
    If CurY < 5 Then
    EraseBlock
    CurY = CurY + 1
    DrawBlock
    End If
    ElseIf Shift = 1 Then
    If CurZ > 0 Then
    EraseBlock
    CurZ = CurZ - 1
    DrawBlock
    End If
    End If
    Case vbKeyDown
    If Shift = 0 Then
    If CurY > 0 Then
    EraseBlock
    CurY = CurY - 1
    DrawBlock
    End If
    ElseIf Shift = 1 Then
    If CurZ < 5 Then
    EraseBlock
    CurZ = CurZ + 1
    DrawBlock
    End If
    End If
    End Select
    End Sub
    Private Sub Form_Load()
    Move 0, 0, Screen.Width, Screen.Height
    Show
    Label1.Move Picture1.ScaleWidth - Label2.Width, 0
    Label2.Move Picture1.ScaleWidth - Label2.Width, Label1.Height * 4
    Picture1.Move ScaleWidth - Picture1.Width, 0
    CenterX = ScaleWidth / 4
    CenterY = ScaleHeight / 1.5
    DrawBlock
    End Sub
    Private Sub Timer1_Timer()
    Randomize
    d = Int(Rnd * 11)
    If d > 5 And MoveTo < 4 Then MoveTo = RandomMove
    EraseBlock
    Select Case MoveTo
    Case MOVE_DOWN
    If CurY > 0 Then CurY = CurY - 1 Else: MoveTo = RandomMove
    Case MOVE_UP
    If CurY < 5 Then CurY = CurY + 1 Else: MoveTo = RandomMove
    Case MOVE_RIGHT
    If CurX < 5 Then CurX = CurX + 1 Else: MoveTo = RandomMove
    Case MOVE_LEFT
    If CurX > 0 Then CurX = CurX - 1 Else: MoveTo = RandomMove
    Case MOVE_BACKWARD
    If CurZ > 0 Then CurZ = CurZ - 1 Else MoveTo = RandomMove
    Case MOVE_FORWARD
    If CurZ < 5 Then CurZ = CurZ + 1 Else: MoveTo = RandomMove
    End Select
    DrawBlock
    End Sub
    Private Function RandomMove() As Integer
    Randomize
    Dim d As Integer
    d = Int(Rnd * 6)
    RandomMove = d
    End Function
      

  2.   

    学习……学习……
    Thank you!
      

  3.   

    用direct就是了,有现成的函数调用
      

  4.   

    谢谢大家的帮助。我的回复如下:
     1。针对cuizm(射天狼) ,谢谢你的代码。我的方程式比较复杂,由于不止一个,是用好多步算出来的。不过你可以理解成空间的一条线段就可以了,比如在x,y,z坐标轴的情况下的线段的一点是(1,1,1)另一点是(10,10,10),这样子考虑就简单一些,望能给出能在vb窗体之中呈现出一个三维效果的这样的线段。希望能有一个x,y,z笛卡儿坐标系,在此坐标系之中有这样的一条线段。如果能再给出能从不同的角度观赏这条线段的代码,那么就更好了。
     2。针对totti0115(keke) ,谢谢你的提示。我也考虑过用这个,可是我还从未用过,不知道首先要往vb 之中加入什么控件,要用什么样的语句呢?比如就实现能画出这样的一条线段。
      

  5.   

    针对cuizm(射天狼) :另外。。不好意思,,,,能否把你上面给我的代码加几个说明语句??????我看得有一点。
      

  6.   

    在部件中引用directx7.0或更高的版本
    再声明
    1。先建立directdraw对象
    dim dx as new directx7
    dim ddrew as directdraw7
    set ddraw=dx.directdrawcreate("")
    2。建立协作层
    实现的方法是调用directdraw对象的setcooperativelevel函数
    定义为object.setcooperativelevel(hdl as long,flags as const_ddsclflags)
    hdl为程序的窗口句柄,flags为运行的方式
    函数的调用为
    DDraw.SetCooperativeLevel Me.hWnd,DDSCL_EXCLUSIVE OR_DDSCL_FULLSCREEN
    3。设置显示的模式
    用函数setdisplaymode函数实现
    4。建立一个平面的对象
    用贴图的效果来实现3D的效果
      

  7.   

    谢谢totti0115(keke) 的帮助,我马上去试!
    Cuizm(射天狼) 你好,我上面的回复你有没有看到呢?能给我继续的帮助吗?为了你阅读的方便,我把它粘贴过来。如下:
    1。针对cuizm(射天狼) ,谢谢你的代码。我的方程式比较复杂,由于不止一个,是用好多步算出来的。不过你可以理解成空间的一条线段就可以了,比如在x,y,z坐标轴的情况下的线段的一点是(1,1,1)另一点是(10,10,10),这样子考虑就简单一些,望能给出能在vb窗体之中呈现出一个三维效果的这样的线段。希望能有一个x,y,z笛卡儿坐标系,在此坐标系之中有这样的一条线段。如果能再给出能从不同的角度观赏这条线段的代码,那么就更好了。希望能得到大家的帮助,谢谢!!!
      

  8.   

    使用opengl
    你看看这篇文章
    http://www.yesky.com/20020627/1618051.shtml
    VB中利用OpenGL绘制三维地质构造图
      

  9.   

    Cuizm(射天狼) 你好,我上面的回复你有没有看到呢?能给我继续的帮助吗?为了你阅读的方便,我把它粘贴过来。如下:
    1。针对cuizm(射天狼) ,谢谢你的代码。我的方程式比较复杂,由于不止一个,是用好多步算出来的。不过你可以理解成空间的一条线段就可以了,比如在x,y,z坐标轴的情况下的线段的一点是(1,1,1)另一点是(10,10,10),这样子考虑就简单一些,望能给出能在vb窗体之中呈现出一个三维效果的这样的线段。希望能有一个x,y,z笛卡儿坐标系,在此坐标系之中有这样的一条线段。如果能再给出能从不同的角度观赏这条线段的代码,那么就更