Как вычислить траекторию на PHP?
1.
Виталий (04.01.2012 / 19:43)
Простите, что в школьные времена прогуливал уроки по физике и теперь задаю столь глупые вопросы.
Вопрос относится не чисто к php. как таковой код я набросаю, мне необходим пинок в верную сторону.
И так задача:
У меня есть плоскость (500x500 пикселей).
На плоскости две точки, условно обозначим их точками
A и
B.
Задача заключается в том что точка
B должна двигаться к точки
A при чем при каждом запуске скрипта на шаг ближе (пусть это будет ~10px).
в общем сама задача как рассчитать траекторию в каком направлении двигаться точки
B по осям x и y?
Заранее благодарю вас за то что вы сидели на уроках
2.
Виталий (04.01.2012 / 19:56)
паходу все прогуливали
3.
ramzes (04.01.2012 / 20:09)
Координаты точек А и В то есть?
4.
Hennessy (04.01.2012 / 20:10)
У тебя есть координаты точки А? Есть координаты точки Б? Делай задачу, чтобы Б постепенно переходило к точке А. Вот и всё.
Добавлено через 00:28 сек.
Ну т.е. Зная координаты вычисления проводишь сколько нужно и т.д. и прибавляешь\убавляешь дистанцию.
5.
Виталий (04.01.2012 / 20:26)
Hennessy (4 Января 2012 / 20:10)
У тебя есть координаты точки А? Есть координаты точки Б? Делай задачу, чтобы Б постепенно переходило к точке А. Вот и всё.
Добавлено через 00:28 сек.
Ну т.е. Зная координаты вычисления проводишь сколько нужно и т.д. и прибавляешь\убавляешь дистанцию.
это сработает только запустив два цикла и сначала сдвинутся в сторону координаты x точки
Аа потом сдвигаться к точке y во вложеном цикле. но согласись получится некрасиво хоть и дойдет до цели.
я кажется понял что нужно делать. просто вычесть коефициент шага здесь и вступает еще один параметр скорости. думаю сейчас реализую.
6.
ramzes (04.01.2012 / 20:29)
$c[x] = ($a[x]<$b[x]) ? ($a[x]+5] : ($a[x]-5);
$c[y] = ($a[y]<$b[y]) ? ($a[y]+5] : ($a[y]-5);
$c[x] = ($c[x] > $b[x]) ? $b[x] : $c[x];
$c[y] = ($c[y] > $b[y]) ? $b[y] : $c[y];
координаты движения $c[x] и $c[y]
это так не думая, примерный вариант
7.
Виталий (04.01.2012 / 20:35)
6.
ramzes, прокрутил код в голове. поидее он пройдет по диагонале в сторону к точке A а потом тупо по прямой дойдет свой путь по оси на которую наткнулся.
не сойдет.
Добавлено через 01:33 сек.
что то в голове крутится но не могу разобратся что =/ печально
8.
Павел (04.01.2012 / 20:41)
7.
free, не держи в голове, рисуй. возьми листок и нарисуй, помогает.
9.
Виталий (04.01.2012 / 20:43)
8.
GingerBread, ууу.. два листка исписано вроде бы правильно но теперь понять что написал запара... хотел отсканить и скинуть но понял что сканер закидан )
10.
ramzes (04.01.2012 / 20:43)
7.
free, да, я там не учел кое что, а именно длинну шага.
вместо +5 надо задать длину шага
которую надо изначально высчитать, до старта, из расчета скажем, расстояние по оси Х от точки А до точки В деленное на кол-во шагов
и так же для оси У
примерно
11.
Виталий (04.01.2012 / 20:51)
10.
ramzes, не не не... если запустишь свой код, я это в уме сделал то получится что он идет по диагонали (в 45 градусов) в сторону точки
A пока не наткнется на вторую ось а по ней начнет шагать дальше последнии два условия в твоем коде. ведь согласись точка
A может находится не обязательно в 45 градусов.
я сейчас пытаюсь делить на 500 (ширина и высота плоскости) и находить соотношение осей.
Добавлено через 08:37 сек.
еще не пробовал но вот как то так по идее.
$aKx = $a['x'] / 500;
$bKx = $b['x'] / 500;
$aKy = $a['y'] / 500;
$bKy = $b['y'] / 500;
$speed = 5;
$cX = ($a['x'] < $b['x']) ? ($b['x']-($bKx*$speed)) : ($b['x']+($bKx*$speed));
$cY = ($a['y'] < $b['y']) ? ($b['y']-($bKy*$speed)) : ($b['y']+($bKy*$speed));
12.
Виталий (04.01.2012 / 21:14)
у меня почему то сервер падает когда я его запускаю
в чем проблема может быть? сижу на nginx'e
13.
ramzes (04.01.2012 / 21:15)
11.
free, с той поправкой про которую я в #10 говорил, он будет идти под любым углом в любое направление
вроде бы
ну ладно, мне лень думать)))
Добавлено через 01:39 сек.
free (4 Января 2012 / 21:14)
у меня почему то сервер падает когда я его запускаю
в чем проблема может быть? сижу на nginx'e
ты это в цикле запускаешь?)))
ясен пень падает)))) там пипец какой цикл получится
14.
Виталий (04.01.2012 / 21:18)
все разобрался.
Добавлено через 01:23 сек.
13.
ramzes, да не цикла нет. один шаг при обработке скрипта.
проблема была в подключении к бд.
15.
ramzes (04.01.2012 / 21:26)
14.
free, если я правильно понял, у тебя
$aKx = $a['x'] / 500;
$bKx = $b['x'] / 500;
$aKy = $a['y'] / 500;
$bKy = $b['y'] / 500;
При каждом шаге выполняется?
16.
Виталий (04.01.2012 / 21:42)
ну собственно да. оно вычисляет соотношение координаты от самого периметра плоскости )
все работает отлично.
17.
Дмитрий (04.01.2012 / 23:20)
Тут не только физика надо, теоретически вычисляешь расстояние между точками, по какой оси они будут передвигатся, делишь расстояние приближения на общее расстояние между точками и получишь соотношение сторон как то так...
18.
Дмитрий (05.01.2012 / 00:24)
<?php
#Допустим, координаты точки ОТПРАВЛЕНИЯ такие:
$Bx = 130; #по ширине
$By = 60; #по высоте
#Допустим, координаты точки НАПРАВЛЕНИЯ такие:
$Ax = 30; # по ширине
$Ay = 70; # по высоте
#Вычисляем координаты средней точки направления по ширине:
$Sx = ( ($Bx - $Ax) / 2 ) + $Ax; # получится ( (130 - 30) / 2 ) + 30 = 80
#Вычисляем координаты средней точки направления по высоте:
$Sy = ( ($By - $Ay) / 2 ) + $Ay; # получится ( (60 - 70) / 2 ) + 70 = 65
# Если коор. высоты средней точки больше коор. высоты точки отправления, значит двигаться надо вверх, в противном случае - вниз.
$Ry = ($Sy != $By) ? ( ($Sy > $By) ? 'вверх' : 'вниз' ) : '';
# Если коор. ширины средней точки больше коор. ширины точки отправления, значит двигаться надо влево, в противном случае - вправо
$Rx = ($Sx != $Bx) ? ( ($Sy > $By) ? 'влево' : 'вправо' ) : '';
# вычислять градус тупо некогда
$corner = 0;
# результат на экран
echo 'Двигаться нужно ' . $Rx . ' ' . $Ry . ' под углом ' . $corner . '°';
вычислять градус направления, расстояние между точками, количество шагов и координаты каждого шага тупо некогда
Этот скрипт отдаст:
Двигаться нужно влево вверх под углом 0°
19.
Виталий (05.01.2012 / 09:03)
18.
dima.london, спасибо, но я вчера разобрался уже.
URL:
https://visavi.net/topics/28066