Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?
- // Координаты центра (вокруг чего разбросаны предметы)
- public $center = new Vector2($x, $z);
- // Данные о предмете (у каждого предмета свои координаты старта, конца, и центральной точки)
- public $itemData =array(/* ItemNumber => arraz(
- startPosition => Vector2,
- finishPosition => Vector2,
- middlePosition => Vector2),
- t => integer */
- );
- /**
- * Получение 'центральной' точки для каждого предмета
- *
- * @param integer $number номер предмета в массиве $itemData
- * @param Vector2 $startCenter
- * @param Vector2 $finishCenter
- */
- public function getSecondPosition($number, $startCenter, $finishCenter) {
- $itemData = $this->itemData[$number]; // Не буду писать функцию, которая перенесет все переменные из массива сюды, но она тут должна быть
- // Получение двух возможных центральных точек
- // Одна будет выше, другая будет ниже
- // Дальше с помощью формулы будем искать с какой стороны (какую именно точку нужно использовать) для движения
- // Формула прямой z = kx + m
- $k = ($finishCenter->z - $startCenter->z) / ($finishCenter->x - $startCenter->x); // Расчет угового коэффициента
- $m = ($finishCenter->x * $startCenter->z - $startCenter->x * $finishCenter->z) / ($finishCenter->x - $startCenter->x); // Расчет смещение
- $centerLine = new Vector2(/*X =>*/ $startCenter->x + $finishCenter->x / 2 + 0.2, /* Z =>*/ $startCenter->z + $finishCenter->z / 2 + 0.2); // Нахождение точки около центра, чтобы получить функцию - перпендикулярную к прямой (старт -> финиш)
- $d = $centerLine->z + 1 / $k * $centerLine->x; // Из теорем о перпендикулярных прямых
- // Наша формулка z = -1/k * x + d
- // Дальше ищем ту точку, она должна быть на расстоянии ~ 25% от длины линии (старт -> финиш)
- $length = 0.25 * sqrt(pow($startCenter->x - $finishCenter->x, 2) + pow($startCenter->z - $finishCenter->z, 2));
- for ($i = 0, $dz = 0; ($dz + $i) < $length; $i=+0.1){
- // Собсно вычисляем точку
- continue;
- }
- $middlePosition = new Vector2(/*X =>*/ $centerLine->x + $i, /* Z =>*/ $centerLine->z + (-1 * $k * $i));
- $this->itemData[$number]['middlePosition'] = $middlePosition;
- }
- /**
- * Определяем скорость по оси X и Y для каждого предмета
- * Уже после обновления параметра t
- *
- * @param integer $number номер предмета в массиве $itemData
- * @param Vector2 $item - там координаты предмета
- */
- public function updateItem($number, $item){
- $itemData = $this->itemData[$number]; // Не буду писать функцию, которая перенесет все переменные из массива сюды, но она тут должна быть
- $newX = pow(1 - $t, 2) * $startPosition->x + 2 * (1 - $t) * $t * $finishPosition->x + pow($t, 2) * $middlePosition->x;
- $newZ = pow(1 - $t, 2) * $startPosition->z + 2 * (1 - $t) * $t * $finishPosition->z + pow($t, 2) * $middlePosition->z;
- $nowX = $item->x;
- $nowZ = $item->z;
- $speedX = ($newX - $nowX) * $speed; //TODO speed???
- $speedZ = ($newY - $nowZ) * $speed;
- // Ну и типо дальше присваиваем скорость предмету :)
- }
- ?>
Advertisement
Add Comment
Please, Sign In to add comment