Skip to content

Instantly share code, notes, and snippets.

@nikiforov-org
Last active August 25, 2019 20:00
Show Gist options
  • Save nikiforov-org/5c224f6af7f5adeff28d14bb3e3d8e9b to your computer and use it in GitHub Desktop.
Save nikiforov-org/5c224f6af7f5adeff28d14bb3e3d8e9b to your computer and use it in GitHub Desktop.
Задача №1. Необходимо написать функцию hasCollision() на php, которая проверяет, пересекается ли заданный круг хотя бы с одним кругом из списка. Круг - это индексный массив, содержащий три элемента типа int [ x, y, radius ], где x и y - координаты центра круга. Посмотреть решение в песочнице: http://sandbox.onlinephpfunctions.com/code/b5e8581940…
<?php
/**
* Задача №1
*
* Необходимо написать функцию hasCollision() на php, которая проверяет,
* пересекается ли заданный круг хотя бы с одним кругом из списка.
* Круг - это индексный массив, содержащий три элемента типа int [ x, y, radius ],
* где x и y - координаты центра круга.
*/
/**
* Решение.
*
* Представим себе две окружности на плоскости. Чтобы они не пересекались,
* необходимо, чтобы сумма их радиусов была меньше расстояния до их центров.
* Из курса школы нам известно, что расстояние между двумя точками на плоскости
* вычисляется по формуле sqrt((x2-x1)^2 + (y2-y1)^2).
* Для удобства вычислений, преобразуем неравенство к виду
* (xi-x1)^2 + (yi-y1)^2 <= (Ri+R1)^2 (пересекаются)
*
* Посмотреть решение в песочнице: http://sandbox.onlinephpfunctions.com/code/b5e858194052f771cf11139dbd75b1b98683083d
*/
function hasCollision(array $circle, array $circlesLists): bool {
$x1 = $circle[0];
$y1 = $circle[1];
$R1 = $circle[2];
foreach ($circlesLists as $circle_i) {
$xi = $circle_i[0];
$yi = $circle_i[1];
$Ri = $circle_i[2];
$sqDistance_i = ($xi - $x1) * ($xi - $x1) + ($yi - $y1) * ($yi - $y1);
$sqRadiusSum_i = ($Ri + $R1) * ($Ri + $R1);
if ($sqDistance_i <= $sqRadiusSum_i) {
return true;
}
}
return false;
}
/**
* Проверка
*/
$circle = [4, 4, 3];
$circlesLists0 = [
[10, 10, 4], // не пересекается
[3, 10, 2], // не пересекается
];
$circlesLists1 = [
[3, 10, 2], // не пересекается
[8, 3, 2], // пересекается
];
?>
$circlesLists0 - <?=hasCollision($circle, $circlesLists0) ? 'пересекаются' : 'не пересекаются'?>;
$circlesLists1 - <?=hasCollision($circle, $circlesLists1) ? 'пересекаются' : 'не пересекаются'?>;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment