Геометрия для продвинутых

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Лёха_Virus
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 168
Зарегистрирован: 24.03.2003 (Пн) 17:13
Откуда: Анграск

Геометрия для продвинутых

Сообщение Лёха_Virus » 01.04.2004 (Чт) 18:01

Здравствуйте!
Задача такова: переместить шейп из точки (X0,Y0) в точку (X,Y).
Весь код (ниже) работает, шейп движется, только вот иногда не останавливается по заданному ограничению. Дело в том что при достаточно малых приращениях ограничение не срабатывает:
при dx стремящимся к 0 shape.left стремится к shape.left (аналогично shape.top при dy->0).Т.е. движения по одому из направлений практически нет, и шейп благополучно уезжает...
Может подскажете, как обойти данную проблему... или алгоритм какой-нить подкините другой...
Спасибо.

Вот код:
'берём в событии маусдаун координаты
Private Sub Form1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
'определяем угол поворота (угол между вектором движения и осью OY)
ang = Atn((Abs(shape.left - X) / Abs(shape.top - Y)))
'определяем приращения движения (т.е. скорость движения)
dx = Abs(Sin(ang) * 10)
dy = Abs(Cos(ang) * 10)
'определяем знак приращения (по сути направление движения)
If shape.left > X Then dx = dx * (-1)
If shape.top > Y Then dy = dy * (-1)
end sub
'в таймере двигаем шейп
Private Sub Timer1_Timer()
shape.left= shape.left + dx
shape.top = shape.top + dy
'проверяем приехал ли шейп в точку (либо проехал её) (вот это самое ограничение)
If Sgn(dx) * (shape.left - X) >= 0 And Sgn(dy) * (shape.top - Y) >= 0 Then Timer1.Enabled = False
end sub

Kostyan
Постоялец
Постоялец
 
Сообщения: 439
Зарегистрирован: 20.09.2002 (Пт) 4:14
Откуда: Россия, Уссурийск

Сообщение Kostyan » 02.04.2004 (Пт) 0:57

Можно гораздо проще и быстрее:
Код: Выделить всё
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim x1 As Long, y1 As Long, a As Double
x1 = Shape1.Left: y1 = Shape1.Top
a = 0
Do While (Shape1.Left <> X) Or (Shape1.Top <> Y)
  Shape1.Left = CLng(x1 * (1 - a) + X * a)
  Shape1.Top = CLng(y1 * (1 - a) + Y * a)
  a = a + 0.001 ' от него зависит скорость
  DoEvents
Loop
End Sub

Вот и всё.
Нет ничего невозможного для человека с интеллектом.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 19

    TopList  
cron