-
-
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…
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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