Движение по прямой

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
SeRRg
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 343
Зарегистрирован: 25.11.2003 (Вт) 20:14
Откуда: Тюмень!

Движение по прямой

Сообщение SeRRg » 07.12.2003 (Вс) 14:55

Я понимаю, что уже всех тут достал своими глупыми вопросами, :)
но у меня они появляются снова и снова: :)
Мне нужно, чтобы один объект (н-р пикчурбокс) двигался
по данной линии от его центра до данной точки с
постоянной скоростью (причем у точек известны координаты)
Ничего другого, кроме
a.x = a.x+(a.x - b.x) / 100
a.y = a.y+(a.y - b.y) / 100
в голову не приходит. Но здесь скорость зависит
от расстояния между точками. :(
Подскажите, плз, как реализовать напис. выше.
VB - это звучит!

Dagobert
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 141
Зарегистрирован: 21.12.2002 (Сб) 6:48
Откуда: Russia

Сообщение Dagobert » 08.12.2003 (Пн) 7:11

Я так понял, что это всё выполняется в цикле. Тогда, может, просто рассчитать смещение по X по Y вне цикла, и сохранить их в отдельных переменных.

Код: Выделить всё
dX = (a.x - b.x)/100
dY = (a.Y - b.Y) /100


Есть ещё вариант: Получить уравнение прямой, (Y от X или X от Y), и изменяя одну координату рассчитывать другую.

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

Сообщение Kostyan » 09.12.2003 (Вт) 7:08

Вот тебе пример:

Помести на форму Picturebox и вставь этот код

Код: Выделить всё
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 = Picture1.Left: y1 = Picture1.Top
a = 0
Do While (Picture1.Left <> X) Or (Picture1.Top <> Y)
  Picture1.Left = CLng(x1 * (1 - a) + X * a)
  Picture1.Top = CLng(y1 * (1 - a) + Y * a)
  a = a + 0.001 ' от него зависит скорость
  DoEvents
Loop
End Sub


теперь щелкни мышкой на форме в любом месте и Picturebox прибежит к ней :)

Тут скорость перемещения зависит от приращения коэфициента a, а не от расстояния как у тебя.

SeRRg
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 343
Зарегистрирован: 25.11.2003 (Вт) 20:14
Откуда: Тюмень!

Сообщение SeRRg » 09.12.2003 (Вт) 15:43

2Dagobert: Твой первый вариант не подходит, т.к. направление в
каждом витке цикла может меняться.
Про второй не знаю, тестирую: вспоминаю,
что такое уравнение прямой :)

2Kostyan: Вот это ближе к истине,(если не будет других вариантов,
скорее всего буду использовать его)
НО: У тебя тоже скорость зависит от расстояния кликанья мышки,
чем ближе, тем медленее бегает :) . Или это мне кажется :)
Пусть немного, но все же...
Последний раз редактировалось SeRRg 10.12.2003 (Ср) 12:38, всего редактировалось 1 раз.
VB - это звучит!

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

Сообщение Kostyan » 10.12.2003 (Ср) 5:42

2Dagobert:
Второй способ неподходит, потому что ты предлагаешь использовать каноническое уравнение прямой, т.е. y=F(x). Теперь предположим такой вариант, когда координата x не меняется, движение идет только по вертикали... пример:

For x = x1 To x2
y = F(x)
Next

Т.к. x1=x2 то тело цикла ни разуне выполнится и объект останется в исходном положении.
Именно поэтому нужно использовать параметрическое уравнение прямой
x=x0 + a*t
y=y0 + b*t
что я и сделал в своем примере (правда немного доработав).

v-adix
Постоялец
Постоялец
 
Сообщения: 490
Зарегистрирован: 14.11.2002 (Чт) 15:11

Сообщение v-adix » 10.12.2003 (Ср) 17:19

насчет скорости. сначала надо сделать процедуру Wait (нужен Timer)

Sub Wait(hm as integer)
timer1.interval=hm
timer1.enabled=true
while timer1.enabled=true
doevents
wend
end sub

Private Sub Timer1_Timer()
timer1.enabled=false
End Sub


Потом в цикле передвигаем пикчербокс, и вычисляем, сколько ждать перед каждым Move. В цикле делаем Wait сколько_ждать

Max!
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 502
Зарегистрирован: 03.04.2003 (Чт) 22:08
Откуда: Литва

Сообщение Max! » 11.12.2003 (Чт) 0:03

Тогда как написать алгоритм чтобы PictureBox бегал за PictureBox тоесть один упр. с клавы пользователем а другой догоняет ! :wink:
Max!

Max!
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 502
Зарегистрирован: 03.04.2003 (Чт) 22:08
Откуда: Литва

Сообщение Max! » 13.12.2003 (Сб) 4:13

Тук тук! Есть кто здесь?
Max!

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

Сообщение Kostyan » 15.12.2003 (Пн) 6:02

2 v-adix:
Ну что за навящивая идея усложнять всё что под руку попадет... Зачем забивать отлично работающюу программу какими-то ненужными процедурами, контролами и т.п. Я абсолютно не вижу смысла в использовании ещё каких-либо задерживающих процедур (аля Wait). Ясно же сказано
Скорость задается приращением коэфициента a.

2 Max!:
Всё тоже самое. Как только первый сдвинули, запускаешь процедуру перемещения вторго (x1:y1 - координаты 2-го pictureboxa, x2:y2 - координаты 1-го pictureboxa).


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

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

Сейчас этот форум просматривают: AhrefsBot, Yandex-бот и гости: 5

    TopList  
cron