Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Векторное движение шейпа (объекта) / 8 сообщений из 8, страница 1 из 1
06.11.2011, 14:05
    #37513280
jabers
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Векторное движение шейпа (объекта)
Здравствуйте.
Вчера задался такой целью:
У меня на форме есть 2 шейпа (А и Б), и шейп (А) должен двигаться (или достичь координат) шейпа (Б). ( см. пункт 1 на рис. )


Движение должно быть не скачком, а плавным.
Собственно проблема и стоит в том, КАК описать код движения.

Код: plaintext
1.
2.
A.x = A.x +  10 
A.y = A.y +  10 
не подходит ровно также, как и A.move
Так, как в таком случае шейп будет двигаться с одинаковым приращениям по осям (45 градусов). Это подохдит, если шейп (Б) на диагонали.
А что делать, если он стоит как показано в пункте 2 (см. рис.)?
Шейп (А) просто улетит в никуда.

Я знаю, что можно как-то использовать вектор...но в голову ни 1 реализация не приходит.
Спасибо
...
Рейтинг: 0 / 0
06.11.2011, 14:55
    #37513321
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Векторное движение шейпа (объекта)
jabers,

а в чем проблема использовать разное заранее вычисленное приращение?
...
Рейтинг: 0 / 0
06.11.2011, 15:05
    #37513336
jabers
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Векторное движение шейпа (объекта)
Проблемы то нет, только каким образом оно высчитывается.
...
Рейтинг: 0 / 0
06.11.2011, 15:45
    #37513357
BelowZero
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Векторное движение шейпа (объекта)
jabers,

jabers,

исходя из чистой математики, а не программирования, вертикальный вектор у тебя будет (конечная позиция).y - (начальная позиция).y
горизонтальная соответственно (конечная позиция).х - (начальная позиция).х
например, тебе нужно, чтобы объект двигался с определённой скоростью(10), то длина ветора, направленного к конечной точке, будет 10. отсюда находишь коэффициэнт k=(((конечная позиция).х - (начальная позиция).х) 2 +((конечная позиция).y - (начальная позиция).y) 2 ):10
тогда
A.x = А.х + (конечная позиция).х - (начальная позиция).х*k
A.y = A.y + (конечная позиция).y - (начальная позиция).у*K
...
Рейтинг: 0 / 0
06.11.2011, 15:49
    #37513364
BelowZero
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Векторное движение шейпа (объекта)
k=(((конечная позиция).х - (начальная позиция).х)2+((конечная позиция).y - (начальная позиция).y)2):10 2
A.x = (А.х + (конечная позиция).х - (начальная позиция).х):k
A.y = (A.y + (конечная позиция).y - (начальная позиция).у):K
...
Рейтинг: 0 / 0
06.11.2011, 17:28
    #37513452
jabers
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Векторное движение шейпа (объекта)
А можете переписать это в код? Если есть Точка А и B
Я не совсем понимаю формулы.
...
Рейтинг: 0 / 0
06.11.2011, 18:00
    #37513478
BelowZero
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Векторное движение шейпа (объекта)
jabers,

что-то типа того
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
Option Explicit
Dim ax
Dim ay
Dim bx
Dim by
Dim k
Private Sub Form_Load()
Dim vektor


Label1.Left =  20 
Label1.Top =  100 
ax = Label1.Left
ay = Label1.Top
bx =  200 
by =  1000 
vektor =  100 
k = ((by - ay) * (by - ay) + (bx - ax) * (bx - ax)) / vektor / vektor
End Sub

Private Sub Timer1_Timer()
Label1.Left = Label1.Left + bx / k
Label1.Top = Label1.Top + by / k
If Label1.Left = bx Then
Timer1.Enabled = True
End If
End Sub
...
Рейтинг: 0 / 0
06.11.2011, 18:12
    #37513495
BelowZero
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Векторное движение шейпа (объекта)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
Option Explicit
Dim ax
Dim ay
Dim bx
Dim by
Dim k
Private Sub Form_Load()
Dim vektor


Label1.Left =  20 
Label1.Top =  100 
ax = Label1.Left
ay = Label1.Top
bx =  200 
by =  1000 
vektor =  100 
k = ((by - ay) * (by - ay) + (bx - ax) * (bx - ax)) ^  0 . 5  / vektor
End Sub

Private Sub Timer1_Timer()
Label1.Left = Label1.Left + bx / k
Label1.Top = Label1.Top + by / k
If Label1.Left > bx Then эздесь можешь додумать, как сделать постановку координат более точной. здесь будет немного различаться
Timer1.Enabled = False
End If
End Sub
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Векторное движение шейпа (объекта) / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]