Создание поверхности по заданой функции - VB

Узнай цену своей работы

Формулировка задачи:

Помогите написать поверхность в Visual Basic по заданой функции

Решение задачи: «Создание поверхности по заданой функции»

textual
Листинг программы
  1. Option Explicit
  2.  
  3. Private Type Point
  4.     X As Single
  5.     Y As Single
  6.     z As Single
  7.     c As Long
  8. End Type
  9.  
  10. Private Const Segments As Long = 30     ' Количество сегментов поверхности
  11.  
  12. Dim Vertex() As Point                   ' Узлы поверхности
  13. Dim ort As Boolean                      ' Ортогональная/перспективная проеция
  14. Private Function GetPoint(X As Single, Y As Single) As Single   ' Получить узел поверхности
  15.    If Abs(X + Y) <= 2 Then GetPoint = X * X - 2 * Y * Y Else GetPoint = X - Y
  16.     'GetPoint = Sin(Sqr(X * X + Y * Y) * 4) ' Волны
  17. End Function
  18. Private Sub ChangeProjection()          ' Изменить тип проекции
  19.    ort = Not ort: Me.Caption = IIf(ort, "Ортогональная", "Перспективная"): Render Vertex
  20. End Sub
  21. Private Sub CreateSurface()             ' Создание поверхности
  22.    Dim X As Single, Y As Single, s As Single, i As Single
  23.     s = 4 / Segments: ReDim Vertex((Segments + 1) * (Segments + 1))
  24.     For X = -2 To 2 Step s: For Y = -2 To 2 Step s
  25.         Vertex(i).X = X: Vertex(i).Y = Y: Vertex(i).z = GetPoint(X, Y)
  26.         Vertex(i).c = Abs(Vertex(i).z) * 30: Vertex(i).c = RGB(Vertex(i).c, 0, 255 - Vertex(i).c): i = i + 1
  27.     Next: Next
  28. End Sub
  29. Private Function Rotate(Pt As Point, X As Single, Y As Single, z As Single) As Point ' Поворот точки
  30.    Dim cx As Single, sx As Single, cy As Single, sy As Single, cz As Single, sz As Single
  31.     sx = Sin(X): sy = Sin(Y): sz = Sin(z): cx = Cos(X): cy = Cos(Y): cz = Cos(z)
  32.     Rotate.X = Pt.X * (cz * cy + sz * sx * sy) + Pt.Y * (-sz * cy + cz * sx * sy) + Pt.z * (cx * sy)
  33.     Rotate.Y = Pt.X * (sz * cx) + Pt.Y * (cz * cx) - Pt.z * sx
  34.     Rotate.z = Pt.X * (-cz * sy + cy * sz * sx) + Pt.Y * (sz * sy + cz * sx * cy) + Pt.z * (cx * cy)
  35.     Rotate.c = Pt.c
  36. End Function
  37. Private Sub Render(Points() As Point)                    ' Рендеринг
  38.    Dim Pt As Point, i As Long, n As Long, col As Long, sw As Single, sh As Single, s As Long, s2 As Long
  39.     Me.Cls: sw = Me.ScaleWidth / 2: sh = Me.ScaleHeight / 2: s = Segments + 1: s2 = s * s
  40.     For n = 0 To UBound(Points)
  41.         Pt = Points(n): Pt.z = Pt.z + 10    ' Отодвигаем от себя поверхность на 10 единиц
  42.        If ort Then Pt.X = Pt.X / 7: Pt.Y = Pt.Y / 7 Else Pt.X = Pt.X / (Pt.z * 0.9): Pt.Y = Pt.Y / (Pt.z * 0.9)
  43.         If n Mod s Then Me.Line -(Pt.X * sw + sw, Pt.Y * sh + sh), Pt.c _
  44.         Else Me.PSet (Pt.X * sw + sw, Pt.Y * sh + sh)
  45.     Next
  46.     For n = 0 To UBound(Points)
  47.         i = ((n * s) Mod s2) + n \ s: Pt = Points(i): Pt.z = Pt.z + 10
  48.         If ort Then Pt.X = Pt.X / 7: Pt.Y = Pt.Y / 7 Else Pt.X = Pt.X / (Pt.z * 0.9): Pt.Y = Pt.Y / (Pt.z * 0.9)
  49.         If n Mod s Then Me.Line -(Pt.X * sw + sw, Pt.Y * sh + sh), Pt.c _
  50.         Else Me.PSet (Pt.X * sw + sw, Pt.Y * sh + sh)
  51.     Next
  52.     Me.Refresh
  53. End Sub
  54. Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
  55.     If KeyCode = vbKeyReturn Then ChangeProjection  ' Переключить проекцию
  56. End Sub
  57. Private Sub Form_Load()
  58.     Me.ScaleMode = vbPixels: Me.AutoRedraw = True: Me.BackColor = vbWhite: CreateSurface: ChangeProjection
  59. End Sub
  60. Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  61.     Static dx As Single, dy As Single
  62.     Dim i As Long, ax As Single, ay As Single, az As Single
  63.     If Button Then
  64.         ax = -(Y - dy) / 100: ay = (X - dx) / 100: If Shift Then az = ay: ax = 0: ay = 0    ' При Ctrl|Shift|Alt вращать по Z
  65.        For i = 0 To UBound(Vertex)
  66.             Vertex(i) = Rotate(Vertex(i), ax, ay, az)
  67.         Next
  68.         Render Vertex
  69.     End If
  70.     dx = X: dy = Y
  71. End Sub
  72. Private Sub Form_Resize()
  73.     Render Vertex
  74. End Sub

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.2 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы