66 lines
1.9 KiB
PHP
66 lines
1.9 KiB
PHP
|
<?php
|
||
|
|
||
|
|
||
|
/**
|
||
|
* @param Moon[] $moons
|
||
|
*/
|
||
|
function calculateVelocity(array $moons)
|
||
|
{
|
||
|
foreach ($moons as $i => $base_moon) {
|
||
|
foreach ($moons as $j => $target_moon) {
|
||
|
if ($i === $j) {
|
||
|
// same planet
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
$velocity_x = $base_moon->getVelocity()->getX();
|
||
|
$velocity_y = $base_moon->getVelocity()->getY();
|
||
|
$velocity_z = $base_moon->getVelocity()->getZ();
|
||
|
if ($base_moon->getX() > $target_moon->getX()) {
|
||
|
--$velocity_x;
|
||
|
} elseif ($base_moon->getX() < $target_moon->getX()) {
|
||
|
++$velocity_x;
|
||
|
}
|
||
|
if ($base_moon->getY() > $target_moon->getY()) {
|
||
|
--$velocity_y;
|
||
|
} elseif ($base_moon->getY() < $target_moon->getY()) {
|
||
|
++$velocity_y;
|
||
|
}
|
||
|
if ($base_moon->getZ() > $target_moon->getZ()) {
|
||
|
--$velocity_z;
|
||
|
} elseif ($base_moon->getZ() < $target_moon->getZ()) {
|
||
|
++$velocity_z;
|
||
|
}
|
||
|
$base_moon->getVelocity()->setX($velocity_x)->setY($velocity_y)->setZ($velocity_z);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param Moon[] $moons
|
||
|
*/
|
||
|
function updateCoordinates(array $moons)
|
||
|
{
|
||
|
foreach ($moons as $moon) {
|
||
|
$moon->setX($moon->getX() + $moon->getVelocity()->getX());
|
||
|
$moon->setY($moon->getY() + $moon->getVelocity()->getY());
|
||
|
$moon->setZ($moon->getZ() + $moon->getVelocity()->getZ());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param Moon[] $moons
|
||
|
* @return float|int
|
||
|
*/
|
||
|
function calculateEnergy(array $moons)
|
||
|
{
|
||
|
$energy = 0;
|
||
|
foreach ($moons as $moon) {
|
||
|
$pot = abs($moon->getX()) + abs($moon->getY()) + abs($moon->getZ());
|
||
|
$velocity = $moon->getVelocity();
|
||
|
$kin = abs($velocity->getX()) + abs($velocity->getY()) + abs($velocity->getZ());
|
||
|
$energy += $pot * $kin;
|
||
|
}
|
||
|
|
||
|
return $energy;
|
||
|
}
|