Как программировать плавный поворот модели

  В программе «Стереометрические модели» поворот векторной графики делается вручную - включается режим вращения, указывается точка поворота и затем, двигая появившуюся метку, модель можно поворачивать и менять её размер.
  Однако, процесс этот, хоть и удобный, но не очень равномерный, кроме того иногда хочется, чтобы модель не меняла свой размер, а только очень-очень плавно поворачивалась в нужном направлении.

  Запускать плавный поворот в нужную сторону было бы удобно, нажимая клавиши  <  и  > на клавиатуре компьютера. А останавливать вращение можно было бы, нажимая любую из этих клавиш.
  Некую сложность в программировании таких действий составляет то, что Визуал Бейсик не поддерживает рекурсию. То есть, к одной и той же подпрограмме невозможно обратиться напрямую – нажимая клавишу, с тем, чтобы она сначала начала цикл поворотов, а при повторном нажатии остановилась.
  Поэтому пришлось использовать флаг FT – целочисленную переменную, обрывающую счёт.
 
  Режим плавного поворота задаётся флагом Ftim. Он устанавливается в единицу при клике по кнопке <cls>, этот же клик стирает ненужную при плавном повороте метку. Цифра на кнопке «Плотность» (переменная CV) задаёт шаг поворота и тем самым регулирует скорость вращения.
В приведённом ниже тексте используется ещё один флаг - FTa. Этот флаг используется для организации плавного вращения модели вокруг произвольно выбранного отрезка.
  Посмотреть клип с плавными поворотами вокруг вертикальной оси и вокруг выбранного отрезка можно тут - (клип делается, но пока не готов)
__________
   

Public Sub Vtim(M As Integer) 'плавный поворот модели <188 >190
Dim dU As Single
  If Ftim = 0 Then Exit Sub
  If Ftim = 1 Then Ftim = 2: Utim = 0:
  FT = 1
  dU = (CV + 1) / 8: dU = dU * (189 - M): Maa = 1:
  If Form1.Command64.Caption = 8 Then Call SNggT(56, 56):
5  If FTa = 1 Then Call Act10(1): GoTo 7:
  If Form1.Command64.Caption = 8 Then Call Act10(1): GoTo 6:
  Utim = Utim + dU: If Utim > 90 And dU > 0 Then FT = 0: Exit Sub
  If Utim < -90 And dU < 0 Then FT = 0: Exit Sub
   Saa = Sin(Utim * pi180): Caa = Cos(Utim * pi180)
6  Form1.Picture1.Line (1, 1)-(Kw, Kh), C240, BF: Call VPrun(2)
7   DoEvents: Sleep 50:
   If FT = 2 Then FT = 3: Exit Sub
  GoTo 5:
End Sub
'=====================================
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) 'горячие клавиши
Dim K As Integer, K1 As Integer
   K = KeyCode
   If FT = 1 And (K = 188 Or K = 190) Then FT = 2: Exit Sub:
End Sub
'=====================================
Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer) 'горячие клавиши
Dim K As Integer, K1 As Integer
Static FTo As Integer
   K = KeyCode
   If FTo = 2 Then FTo = 0: FT = 0:
   If FT = 1 And (K = 188 Or K = 190) Then FT = 2: FTo = 2: Exit Sub:
   If Ftim > 0 And (K = 188 Or K = 190) Then Call Vtim(K): Text2 = " стоп": Exit Sub:


Оператор DoEvents разрешает прерывания, после чего нужна пауза, чтобы программа успела закончить свои текущие дела.
А чтобы работала пауза, в начале блока делается такая надпись -
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)


Рецензии