Я пытаюсь построить прямоугольную сетку, которая может обернуться по краям. Любой, кто играет в видеоигры, вероятно, будет знаком с концепцией: зайдите достаточно далеко в одну сторону на карте мира, и вы вернетесь туда, где вы начали. Это создает определенные трудности при настройке окна просмотра, поскольку края могут прокручиваться на отрицательную территорию координат.Есть ли простой алгоритм «point in rect» для обходной карты?
Это достаточно легко принять отрицательные координаты и определить его реальную стоимость:
function GetRealCoords(value: TPoint): TPoint;
begin
result := ModPoints(AddPoints(value, MAP_SIZE), MAP_SIZE);
end;
где AddPoints и ModPoints просто применить +
и mod
операторов, соответственно, к каждой координате из двух входов, чтобы произвести выход стоимость.
Проблема заключается в переворачивании этой операции. Учитывая точку, в которой обе координаты являются положительными, и TRect, в котором значения Top и Left могут быть положительными или отрицательными, (а нижнее или правое может быть за пределами границ карты) и с MAP_SIZE, объявленным в глобальном масштабе, является существует ли какой-либо способ определить, попадает ли точка в территорию, охваченную прямоугольником просмотра, без необходимости запуска одного и того же расчета до четырех разных времен?
Ой! Я испытываю соблазн уменьшить это по общему принципу, только для удвоенного ** с ** заявлением. Сложнее читать. :( –
Я не согласен с аргументом удобочитаемости в этом случае, но я знаю о «с» догмой среди разработчиков Delphi. Я переписал бы это многословным способом. –
Намного лучше. Спасибо! –