1. 부드러운 움직임(Smooth movement)


폼에 커맨드박스와 타이머를 배치하고, 타이머의 Interval를 1로두시고 코드 편집으로 돌아갑니다.


Private Sub Timer1_Timer()

Command1.Left = Command1.Left + 0.1 * (4000 - Command1.Left)

'개체의 X축 = 개체의 X축 + 속도 * (종착 X축지점 - 개체의 X축)

End Sub


코드를 보시면 먼저 괄호 안의 식부터 계산됩니다. 종착 X축지점인 4000에서 0만큼 뺍니다. (Command1.Left의 초기값이 0이라고 가정) 그 후에 4000이란 값이 나와서 10으로 나누어 400이란 값을 가집니다. 그리고 다시 실행되어 4000에서 400을 뺀 3600에다 10을 나누고 그 값에다 400을 더해 760이란 값을 가집니다. 다시 4000에서 760을 빼고 10을 나누고 760을 더하죠. (760 + 324) 이렇게 점점 이동할수록 값이 작아져 자연스러운 움직임을 가집니다. 속도가 크면 클수록 도착하는 속도는 빨라집니다.



2. 파동(Wave)


Dim 주기 As Integer

Dim 진폭 As Integer

Dim 파장 As Integer

Dim 시간 As Integer


Private Sub Command1_Click()

    Timer1.Enabled = True

End Sub


Private Sub Form_Load()

    진폭 = 50 '파형의 중심에서 최대 높이까지의 길이, 최소 길이

    파장 = 200 '골과 골 사이의 거리

    시간 = 0

    주기 = 2 '한 파장만큼의 거리를 이동하는데 필요한 시간

End Sub


Private Sub Timer1_Timer()

    Command1.Left = Command1.Left + 10

    Command1.Top = 진폭 * Sin(2 * 3.141592 * 시간 / 주기 - 2 * 3.141592 * Command1.Left / 파장) + 200

    '여기서 200은 초기 Y 좌표, 파동 공식을 그대로 가져옴

    'y = Asin(2π/T*t - 2π/A*x)

     시간 = 시간 + 0.05

End Sub


<파동 공식>


3. 원 그리기(Draw a Circle)



Dim 각도 As Integer

Dim 반지름 As Integer

Dim 호도 As Integer


Private Sub Command1_Click()

    Timer1.Enabled = True

End Sub


Private Sub Form_Load()

    반지름 = 1050

End Sub


Private Sub Timer1_Timer()

    각도 = 각도 + 10

    If 각도 > 360 Then: 각도 = 0 '오버플로 방지, 360을 넘어갈 때 0으로 초기화


    호도 = 각도 * 3.141592 / 180

    Command1.Left = 1000 + 반지름 * Sin(호도) '초기 X 좌표 + 반지름 * sin(호도)

    Command1.Top = 1000 + 반지름 * Cos(호도) '초기 Y 좌표 + 반지름 * cos(호도)

End Sub



4. 포물선 운동(Parabolic motion)




Dim 중력가속도 As Integer

Dim 초기각도 As Integer

Dim 초기속도 As Integer

Dim 벡터X As Integer

Dim 벡터Y As Integer


Private Sub Form_Load()

    초기속도 = 100

    초기각도 = 60

    중력가속도 = 1

    벡터X = 초기속도 * Cos(초기각도 * 3.141592 / 180) '초기 수평속도

    벡터Y = -초기속도 * Sin(초기각도 * 3.141592 / 180) '초기 수직속도

End Sub


Private Sub Timer1_Timer()

    벡터Y = 벡터Y + 중력가속도

    Command1.Left = Command1.Left + 벡터X

    Command1.Top = Command1.Top + 벡터Y

End Sub


<포물선 운동>




5. 충돌(Collision)



Dim 반발계수 As Integer
Dim A공질량 As Integer
Dim B공질량 As Integer
Dim A초기속력 As Integer
Dim B초기속력 As Integer

'충돌감지함수 출처: http://cafe.naver.com/gogoomas/5435 / 고구마(hananthony) 
Public Function 충돌감지(X1 As Long, Y1 As Long, W1 As Long, H1 As Long, X2 As Long, Y2 As Long, W2 As Long, H2 As Long) As Boolean
Dim Distance As Long, Temp As Long

Distance = (((W1 / 2) + X1) - ((W2 / 2) + X2)) ^ 2 + (((H1 / 2) + Y1) - ((H2 / 2) + Y2)) ^ 2
Temp = (W1 + W2) / 2

If Distance < Temp ^ 2 Then 충돌감지 = True
End Function

Private Sub Form_Load()
    A공질량 = 700
    A초기속력 = 1
    B공질량 = 200
    B초기속력 = -30
    반발계수 = 1
End Sub

Private Sub Timer1_Timer()
    If A.Left < 0 Or A.Left > 8650 Then
        A초기속력 = -A초기속력
    End If
    If B.Left < 0 Or B.Left > 8650 Then
        B초기속력 = -B초기속력
    End If
    
    If 충돌감지(A.Left, A.Top, A.Width, A.Height, B.Left, B.Top, B.Width, B.Height) Then
        A초기속력 = (A공질량 - 반발계수 * B공질량) / (A공질량 + B공질량) * A초기속력 + (B공질량 + 반발계수 * B공질량) / (A공질량 + B공질량) * B초기속력
        B초기속력 = (A공질량 + 반발계수 * A공질량) / (A공질량 + B공질량) * A초기속력 + (B공질량 - 반발계수 * A공질량) / (A공질량 + B공질량) * B초기속력
    End If
    A.Left = A.Left + A초기속력
    B.Left = B.Left + B초기속력
End Sub



'수학' 카테고리의 다른 글

비주얼베이직6 움직임에 관한 수학공식 정리  (4) 2012.10.03