Страницы

Поиск по вопросам

четверг, 6 июня 2019 г.

Поиск клеток в радиусе от заданной

Вход - X,Y,R. Соответственно, координаты центра и радиус. Надо найти все, что внутри круга с такими параметрами. Есть большое подозрение на быдлокод: function getCellsByRadius($x,$y,$r){ for($i=floor($y-$r);$i<=ceil($y+$r);$i++){//высота квадрата со стороной 2r. Искомый круг точно не больше. for($j=floor($x-$r);$j<=ceil($x+$r);$j++){//ширина квадрата со стороной 2r $distance = sqrt(pow(($j - $x),2)+pow(($i - $y),2));//расстояние до каждой точки квадрата if($distance<$r){ $this->cells[$j][$i]='#999'; } } } $this->cells[$x][$y]='#f00'; } Помогите, пожалуйста, разбыдлокодить. =( P.S. можно проверять расстояние до точек, которые внутри квадрата +-r, но все ромба x+r,y x-r,y x,y+r x,y-r Но мне кажется, что лишняя проверка этого ромба может только усугубить ситуацию. Еще можно проверять только для четверти, а потом размножать на весь круг. Но опять же, поворот может дорого обойтись.


Ответ

function getCellsByRadius($x,$y,$r,$ccircle,$ccenter){ $r2 = $r * $r; for($i=floor($y-$r);$i<=ceil($y+$r);$i++){ $dxmax2 = $r2 - ($y - $i) * ($y - $i); if ($dxmax2 < 0) continue; $dxmax = sqrt($dxmax2); $lower = floor($x-$dxmax); $upper = ceil($x+$dxmax); for($j=$lower;$j<=$upper;$j++){ $this->cells[$j][$i]=$ccircle; } } $this->cells[$x][$y]=$ccenter; } (Не уверен, что код правильный, я не знаток php. Может, где-то надо объявить локальные переменные.)

Комментариев нет:

Отправить комментарий