Изменение ракурса в векторной графике

  В программе «Стереометрические модели» возможно вращение геометрической модели вокруг вертикальной оси http://youtu.be/je9SSSN0Wks
  Модель возникает как чертеж, выполненный в косоугольной проекции, и вращается путём движения мышью большого кружочка, так, как показано на иллюстрации красной стрелкой.
  Можно приспособить эту же программу и для показа более сложных моделей, представляющих интерес для людей, обучающихся рисованию. Художественная модель, в отличие от более простого чертежа, состоит из множества линий и точек. Кроме того, было бы хорошо не только вращать модель вокруг вертикальной оси, но и наклонять её вверх или вниз, представляя её зрителю в разных ракурсах.

  Проще всего это сделать поворотом вокруг горизонтальной оси, которая будет параллельна оси Х. Пусть ось поворота отстоит от фронтальной плоскости на величину Zo, а от основания – на величину Yo, так, как это показано на иллюстрации.
  Для поворота модели нажимаем одновременно клавиши «Ctrl», «R» и  «Sift». Причём «Sift» нажимаем для поворота в ракурсе вверх и не нажимаем при повороте вниз. Поворот осуществляется на 1 градус, поэтому ракурс меняется достаточно плавно.
  Zo берётся как половина расстояния от оси X до верхней кромки рисунка, а значение Yo может изменяется от 10 до 100 пикселей в зависимости от цифры, выставленной на кнопке «Плотность».

  Поворот на угол Uo делается с использованием формул для вычисления синуса и косинуса суммы двух углов. Ниже приводится текст подпрограммы, осуществляющей поворот стереометрической модели в ракурсе.

Public Sub SXYZR(MM As Integer) 'поворот модели вокруг оси, проходящей паралельной оси X
Dim I, L , N, M As Integer,   S As String, V, Yo As Single
Dim Y, Z, R, Zo, Uo As Single 'положение оси и угол поворота
Dim SU, CU, SU1, CU1, SU2, CU2 As Single
   If NPv = 0 Then Form1.Text2 = " массив G пуст": Exit Sub
   Uo = pi180: If MM = 3 Then Uo = -Uo 'R-верхняя часть модели удаляется, нижняя приближается
   SU = Sin(Uo): CU = Cos(Uo): Zo = YYo / 2: Yo = (CV + 1) * 10 'глубина расположения оси по Y
   For I = 1 To NPv:
     L = Pvv(I, 0): If L = 0 Then GoTo 5 'L-логотип эл-та 1-точка 2,3-прямая 4-плоскость 5,6-сечение
     Y = Pvv(I, 2) / 10: Z = Pvv(I, 3) / 10:
  GoSub 9: Pvv(I, 2) = (Y + Yo) * 10: Pvv(I, 3) = (Z + Zo) * 10:
     Select Case L: Case 1, 5, 6: GoTo 5:
       Case 2, 3: Y = Pvv(I, 5) / 10: Z = Pvv(I, 6) / 10:
               GoSub 9: Pvv(I, 5) = (Y + Yo) * 10: Pvv(I, 6) = (Z + Zo) * 10:
       Case 4: Y = Pvv(I, 5) + Yo: Z = Pvv(I, 6) + Zo: GoSub 9: Pvv(I, 5) = Y: Pvv(I, 6) = Z:
     End Select
5     Next I:
  Form1.Text1 = "": Form1.Text2 = " модель повёрнута"
  Form1.Picture1.Line (1, 1)-(Kw, Kh), C240, BF: Call VPrun(1): Exit Sub
 
9     Z = Z - Zo: Y = Y - Yo: 'поворот координат
  R = Y * Y + Z * Z: R = Sqr(R): If R < 0.1 Then Return:
  SU1 = Z / R: CU1 = Y / R:
  SU2 = SU * CU1 + CU * SU1: CU2 = CU * CU1 - SU * SU1:
  Z = SU2 * R: Y = CU2 * R:
  Return:
End Sub
'==============


Рецензии