Теорема Пифагора, чтобы проверить, находится ли клетка внутри радиуса - PullRequest
1 голос
/ 22 мая 2019

У меня есть размеры матрицы и заданная ячейка с радиусом .

Итак, давайте посмотрим на этот пример:

Matrix

Матрица имеет 5 строк и 6 столбцов . Нам дают клетку (2, 3) с радиусом 2 . Он оказывает воздействие и уничтожает все предметы в определенном радиусе ( ячейка воздействия затенена черная , а другие ячейки в радиусе затенены серый ). Я обнаружил, что могу использовать теорему Пифагора , чтобы проверить, находится ли клетка внутри радиуса:

if (Math.Pow(targetRow - row, 2) + Math.Pow(targetColumn - col, 2) <= radius * radius)
{
    matrix[row, col] = 1; 
}

Я не понимаю, почему это работает, и я был бы очень признателен, если бы вы могли мне это объяснить. Я пытался отладить, но до сих пор не понимаю.

Ответы [ 2 ]

2 голосов
/ 22 мая 2019

Я не уверен, что можно объяснить больше, чем теорема Пифагора, только уравнение для круга x^2 +y^2 = r^2.

Таким образом, в цикле вы оцениваете, попадает ли оцененная точка в круг.

Pythagorean Theorem in Circles

Проверьте, помогает ли это: Теорема Пифагора в кругах

2 голосов
/ 22 мая 2019

Это работает, потому что вы можете думать о радиусе как о гипотенузе прямоугольного треугольника, и, если центр круга находится в начале координат (0, 0) системы координат, координаты x и y являются две другие стороны (катети).

enter image description here

Теперь давайте назовем две катетии a и b и гипотенузу c. Тогда у нас следующее уравнение верно:

c 2 = a 2 + b 2 ( теорема Пифагора )

В вашем случае a и b равны targetRow - row, а targetColumn - col и c равны radius.

Я не знаю, как реализовано Math.Pow, но оно работает на удвоениях и довольно дорого. Посчитайте с целыми числами.

int dr = targetRow - row;
int dc = targetColumn - col;
if (dr * dr + dc * dc <= radius * radius)
{
    matrix[row, col] = 1; 
}

Примечание: расстояние, рассчитанное по теореме Пифагора, равно евклидову расстоянию :

d евклидов = & radic; (dx 2 + dy 2 )

Это подходит для вашей проблемы. Но есть и другие способы определения расстояния. Особенно в матрице.

Такси в Манхэттене сначала проезжает вдоль оси север-юг, затем поворачивает на прямой угол и едет вдоль оси восток-запад, чтобы достичь цели. Это Taxicab geometry . Самый короткий путь называется Манхэттенское расстояние :

d Манхэттен = | dx | + | dy |

На шахматной доске короли и королевы могут двигаться горизонтально, вертикально и вдоль диагоналей. Минимальное расстояние при этих обстоятельствах называется Чебышевское расстояние или Шахматное расстояние

d Чебышев = max (| dx |, | dy |)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...