2016-12-03 4 views
1

Я создаю игру. Игроки игры должны оставаться на площади. Я хотел бы уведомить их о своем расстоянии до ближайшей точки на периметре площади и остановить их, если это расстояние станет 0.Найти ближайший пункт границы в квадрате

Мне нужно найти расстояние от данной точки от ближайшей точки до ближайшей точки границы.

У меня есть квадрат. Центр этого квадрата равен (0, 0). Это означает, что верхний правый угол находится на (1/2 стороны, 1/2 стороны), а нижний левый угол находится на (- 1/2 стороны, - 1/2 стороны). Поскольку карта сжимается во время игры, я должен сохранить это значение абстрактным.

Учитывая точку, X и Y, как я могу найти ближайшую координатную точку, чтобы измерить расстояние от нее?

Ответы на Psuedocode или Java будут оценены.

Спасибо!

+0

Добро пожаловать в переполнение стека! Похоже, вы просите о помощи на дому. Хотя у нас нет проблем с самим собой, обратите внимание на эти [dos and don'ts] (http://meta.stackoverflow.com/questions/334822/how-do-i-ask-and-answer-homework-questions/338845 # 338845), и соответственно отредактируйте свой вопрос. –

+0

@JoeC На самом деле, это для игры, которую я создаю. Игроки должны оставаться на этой площади, и я хотел бы уведомить их о своем расстоянии до границы и не дать им покинуть ее, если расстояние станет слишком низким. –

+0

OK. Тем не менее, многие из них по-прежнему применяются. –

ответ

3

Вышеупомянутое решение кажется чрезмерно сложным.

Первое, что следует заметить, это то, что кратчайшее расстояние от любого края до точки всегда будет линией, смежной от этого края до точки. Поэтому я всегда рассчитывал расстояние от каждого края, а затем выбирал самый короткий для отображения. Это должен быть простой расчет.

наименьшее расстояние от верхнего края: (ш * 1/2) - yposition

наименьшее расстояние от левого края: xposition - (-w * 1/2)

наименьшее расстояние от правого края: (ж * 1/2) - xposition

наименьшее расстояние от нижнего края: yposition - (-w * 1/2)

ш общая ширина площади.

Это правда? Вы поняли эту идею. Вы хотите, чтобы все расстояния были положительным числом, что, я думаю, выше, но может быть неправильным.

+0

Вы имеете в виду (1/2), как в половине длины, или на самом деле 1/2? –

+0

1/2 длина стороны. –

+0

Итак, поскольку ваш квадрат сжимается, вы делаете 1/2 * w, а w - ширину квадрата. –

2

Предположим, что ваш квадрат выровнен с осями координат. (Если нет, сначала поверните всю проблему). Затем разбивают плоскость на девять частей: внутри квадрата, сверху и слева от квадрата, непосредственно выше, и т.д .:

 .  . 
     .  . 
     .  . 
     |  | 
    1 | 2 | 3 
...-----+------+-----... 
     |  | 
    4 | 5 | 6 
     |  | 
...-----+------+-----... 
    7 | 8 | 9 
     |  | 
     .  . 
     .  . 
     .  . 

Затем классифицировать вашу точку путем сравнения координат с линиями, которые образуют квадрат. Если точка попадает в области 1, 3, 7 или 9, то ближайшая точка на квадрате является соответствующей вершиной. Если он попадает в области 2, 4, 6 или 8, ближайшая точка - это проекция на соответствующую сторону. (Просто замените соответствующую координату в точке координатой стороны.) В области 5 вам нужно решить, какая сторона ближе всего. Это можно сделать простым вычитанием соответствующей координаты. Как только ближайшая сторона будет идентифицирована, замените координату, и все будет готово.

Поскольку область 5 является наиболее сложным (и самое непосредственное отношение к вашему вопросу), вот как я бы это сделать:

Пусть точка имеет координаты (X, Y) и стороны квадрата быть координаты y = Y верх, y = Y нижний, и аналогичным образом для x. Затем сравните | X - X оставил |, | X - X право |, | Y - Y топ | и | Y - Y нижний | чтобы решить, что ближе. Скажите, что это верх. Тогда ближайшая точка на квадрате (X, Y top), а расстояние между точкой и стороной - это просто Y-Y top |

В моем описательном описании я просто использовал абсолютные значения для области 5, но вы можете избежать абсолютных значений, изменив соответствующие вычитания. (Какие из них следует отменить, зависит от того, как работают оси координат.) Я также проигнорировал проблему для классификации точки. Вы просто должны быть последовательны в отношении знаков повсюду.

+0

Это намного проще, чем другие ответы в другом месте! Спасибо за ответ, оцените его :) –

Смежные вопросы