У меня есть прямоугольная карта, хранящаяся в виде многомерного массива (т. Е. $map[row][col]
), и я должен отследить, какие квадраты видит игрок, расположенные в любом месте на этой карте.
Видимость игрока круговая с неизвестным радиусом (но указывается во время выполнения), и мне нужны только целочисленные решения.
Я знаю, что формула окружности
x^2 + y^2 <= r^2
, но как я могу сохранить все?
Мне нужны эти значения, так как я могу "показать" квадраты карты.
Лучше всего будет многомерный массив (т. Е. __$sol[x][y]__
).
Это фрагмент кода, который я использую.Это не исправлено, поскольку предполагается, что зрение - это квадрат, а не круг.
Расчет квадрата
$this->vision_offsets_2 = array();
//visibility given as r^2
$mx = (int)(sqrt($this->viewradius2));
$mxArr = range($mx * -1, $mx + 1);
foreach ($mxArr as $d_row)
{
foreach ($mxArr as $d_col)
{
$this->vision_offsets_2[] = array($d_row, $d_col);
}
}
Вот как я применяю это
foreach($player as $bot)
{
foreach($visibility as $offset)
{
$vision_row = $offset[0] + $bot[0];
$vision_col = $offset[1] + $bot[1];
if(isset($map[$vision_row][$vision_col]))
{
if( $map[$vision_row][$vision_col] == UNSEEN) {
$map[$vision_row][$vision_col] = LAND; }
}
}
}
Здесь вы можете найти вид бота: как вы видите, это не идеальный круг.
Как я могу отследить его?Кстати, в этом примере радиус ^ 2 равен 55, оранжевый круг - игрок, коричневые квадраты - видимые.