Gistrec

[TEST] Передвижение объекта по кривой

Feb 10th, 2017
297
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 3.98 KB | None | 0 0
  1. <?
  2. // Координаты центра (вокруг чего разбросаны предметы)
  3. public $center = new Vector2($x, $z);
  4.  
  5. // Данные о предмете (у каждого предмета свои координаты старта, конца, и центральной точки)
  6. public $itemData =array(/* ItemNumber => arraz(
  7.                                startPosition  => Vector2,
  8.                                finishPosition => Vector2,
  9.                                middlePosition => Vector2),
  10.                                t => integer */
  11.                         );
  12.  
  13. /**
  14. * Получение 'центральной' точки для каждого предмета
  15. *
  16. * @param integer $number номер предмета в массиве $itemData
  17. * @param Vector2 $startCenter
  18. * @param Vector2 $finishCenter
  19. */
  20. public function getSecondPosition($number, $startCenter, $finishCenter) {
  21.     $itemData = $this->itemData[$number]; // Не буду писать функцию, которая перенесет все переменные из массива сюды, но она тут должна быть
  22.     // Получение двух возможных центральных точек
  23.     // Одна будет выше, другая будет ниже
  24.     // Дальше с помощью формулы будем искать с какой стороны (какую именно точку нужно использовать) для движения
  25.  
  26.     // Формула прямой  z = kx + m
  27.     $k = ($finishCenter->z - $startCenter->z) / ($finishCenter->x - $startCenter->x); // Расчет угового коэффициента
  28.     $m = ($finishCenter->x * $startCenter->z - $startCenter->x * $finishCenter->z) / ($finishCenter->x - $startCenter->x); // Расчет смещение
  29.     $centerLine = new Vector2(/*X =>*/ $startCenter->x + $finishCenter->x / 2 + 0.2, /* Z =>*/ $startCenter->z + $finishCenter->z / 2 + 0.2); // Нахождение точки около центра, чтобы получить функцию - перпендикулярную к прямой (старт -> финиш)
  30.     $d = $centerLine->z + 1 / $k * $centerLine->x; // Из теорем о перпендикулярных прямых
  31.     // Наша формулка z = -1/k * x + d
  32.  
  33.     // Дальше ищем ту точку, она должна быть на расстоянии ~ 25% от длины линии (старт -> финиш)
  34.     $length = 0.25 * sqrt(pow($startCenter->x - $finishCenter->x, 2) + pow($startCenter->z - $finishCenter->z, 2));
  35.  
  36.     for ($i = 0, $dz = 0; ($dz + $i) < $length; $i=+0.1){
  37.         // Собсно вычисляем точку
  38.         continue;
  39.     }
  40.     $middlePosition = new Vector2(/*X =>*/ $centerLine->x + $i, /* Z =>*/ $centerLine->z + (-1 * $k * $i));
  41.     $this->itemData[$number]['middlePosition'] = $middlePosition;
  42. }
  43.  
  44. /**
  45. * Определяем скорость по оси X и Y  для каждого предмета
  46. * Уже после обновления параметра t
  47. *
  48. * @param integer $number номер предмета в массиве $itemData
  49. * @param Vector2 $item - там координаты предмета
  50. */
  51. public function updateItem($number, $item){
  52.     $itemData = $this->itemData[$number]; // Не буду писать функцию, которая перенесет все переменные из массива сюды, но она тут должна быть
  53.     $newX = pow(1 - $t, 2) * $startPosition->x + 2 * (1 - $t) * $t * $finishPosition->x + pow($t, 2) * $middlePosition->x;
  54.     $newZ = pow(1 - $t, 2) * $startPosition->z + 2 * (1 - $t) * $t * $finishPosition->z + pow($t, 2) * $middlePosition->z;
  55.  
  56.     $nowX = $item->x;
  57.     $nowZ = $item->z;
  58.  
  59.     $speedX = ($newX - $nowX) * $speed; //TODO speed???
  60.     $speedZ = ($newY - $nowZ) * $speed;
  61.  
  62.     // Ну и типо дальше присваиваем скорость предмету :)
  63. }
  64.  
  65. ?>
Advertisement
Add Comment
Please, Sign In to add comment