Оставить программу движения на экране точки, оставляющей светящийся след - VB

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

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

Составить программу движения на экране точки, оставляющей светящийся след, которая движется по орбите увеличивающегося: а)квадрата; б)окружности; в) треугольника.

Решение задачи: «Оставить программу движения на экране точки, оставляющей светящийся след»

textual
Листинг программы
Private Type Vec
    X As Double
    Y As Double
End Type
Private Const Speed As Single = 0.05
Private Const RelCount As Long = 70
Dim WithEvents cboType As ComboBox
Dim WithEvents tmrTimer As Timer
Dim Pt As Vec, Rel() As Vec, Dir As Vec, Size As Double
 
Private Sub Iteration()
    Dim flip As Boolean
    Pt.X = Pt.X + Dir.X: Pt.Y = Pt.Y + Dir.Y
    If Pt.X > 1 Then Pt.X = 1: flip = True
    If Pt.Y > 1 Then Pt.Y = 1: flip = True
    If Pt.X < -1 Then Pt.X = -1: flip = True
    If Pt.Y < -1 Then Pt.Y = -1: flip = True
    Select Case cboType.ListIndex
    Case 0: If flip Then Dir = Rot(Dir, 1.5707963267949)
    Case 1: If flip Then Dir = Rot(Dir, 2.0943951023932)
    Case 2: Pt = Rot(Pt, Speed)
    End Select
End Sub
Private Function ToScreen(Pt As Vec) As Vec
    ToScreen.X = Pt.X * Me.ScaleWidth / 4 * Size + Me.ScaleWidth / 2
    ToScreen.Y = Pt.Y * Me.ScaleHeight / 4 * Size + Me.ScaleHeight / 2
End Function
Private Function Rot(Pt As Vec, Ang As Double) As Vec
    Rot.X = Pt.X * Cos(Ang) - Pt.Y * Sin(Ang)
    Rot.Y = Pt.X * Sin(Ang) + Pt.Y * Cos(Ang)
End Function
Private Sub UpdateRel()
    Dim i As Long
    For i = RelCount - 1 To 1 Step -1: Rel(i) = Rel(i - 1): Next
End Sub
Private Sub StartRel()
    Dim i As Long
    Rel(0) = ToScreen(Pt)
    For i = 1 To RelCount - 1: Rel(i) = Rel(0): Next
End Sub
Private Sub cboType_Click()
    Select Case cboType.ListIndex
    Case 0: Pt.X = -1: Pt.Y = -1: Dir.X = Speed: Dir.Y = 0
    Case 1: Pt.X = 0: Pt.Y = -1: Dir.X = Speed: Dir.Y = 0: Dir = Rot(Dir, -1.0471975511966)
    Case 2: Pt.X = 0: Pt.Y = -1: Dir.X = 0: Dir.Y = 0
    End Select
    StartRel
    Me.Cls
End Sub
Private Sub Form_Load()
    Me.ScaleMode = vbPixels: Me.BackColor = 0: Me.DrawWidth = 3
    ReDim Rel(RelCount - 1): Size = 1
    Set cboType = Me.Controls.Add("VB.Combobox", "cboType")
    cboType.AddItem "ГЉГўГ*äðГ*ГІ": cboType.AddItem "ÒðåóãîëüГ*ГЁГЄ": cboType.AddItem "Êðóã"
    cboType.ListIndex = 1: cboType.Visible = True
    Set tmrTimer = Me.Controls.Add("VB.Timer", "tmrTimer")
    tmrTimer.Interval = 32: tmrTimer.Enabled = True
End Sub
Private Sub tmrTimer_Timer()
    Dim i As Long
    Static sz As Long
    Size = (Sin(sz * 6.28318530717959E-03)) / 2 + 1
    sz = (sz + 1) Mod 1000
    Iteration
    UpdateRel
    Rel(0) = ToScreen(Pt)
    For i = RelCount - 2 To 0 Step -1
        Me.Line (Rel(i + 1).X, Rel(i + 1).Y)-(Rel(i).X, Rel(i).Y), 255 * (RelCount - i - 2) / RelCount
    Next
End Sub

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

11   голосов , оценка 4 из 5
Похожие ответы