Прямоугольник - математическая проблема - PullRequest
2 голосов
/ 09 июля 2011

Я нашел что-то НЕ смешное с прямоугольниками:

Допустим, даны значения левой, верхней, правой и нижней координат, и все эти координаты предназначены для включения.

Итак, вычисление ширины выглядит так:

width = right - left + 1

Пока все логично. Но!

Ширина нуля (что иногда имеет смысл) должна храниться как:

right = left - 1

, который создает проблемы, когда речь идет о следующих операциях:

  • Сортировка координат прямоугольника (чтобы он шел слева направо, сверху вниз)
  • Циклический

Хорошо, конечно, эти вещи могут быть обработаны с помощью дополнительного кода для особого случая Width == 0, но, если серьезно, нет ли лучшего решения, стандартного шаблона или наилучшей практики для этого?

Edit:

В настоящее время я отказался от "сортировки" координат в моем коде и заменил ее утверждением о том, что прямоугольник должен быть оставлен -> вправо, вверх -> вниз, но серьезно ...

Ответы [ 5 ]

3 голосов
/ 09 июля 2011

Для решения этой проблемы большинство графических библиотек будут рисовать прямоугольники от левой координаты до, но не включая правую координату.Таким образом, если left = 10 и right = 20, то будут прорисованы десять пикселей с 10 по 19.

Вы можете думать об этом как о координате пикселя, относящейся не к освещенной части, а к линиям сетки между пикселей.

+---+---+---+
|   |   |   |
+---+---+---+
|   |   |   |
+---+---+---+
^   ^   ^   ^
0   1   2   3
2 голосов
/ 09 июля 2011

Если края (левый, правый, верхний, нижний) являются включающими, то по определению ширина (и высота) прямоугольника не может быть 0. Путем «включения» стороны (которая является пикселем) выповторяю, что он должен иметь ширину не менее 1 пикселя.

2 голосов
/ 09 июля 2011

Важно различать координаты и пиксели . Вы можете думать о системе координат как о невидимой сетке, которая работает между пикселями. Думая о координатах таким образом, если вы определите прямоугольник как {0, 3, 0, 5}, то вы получите 3 на 5 пикселей, как и ожидалось.

   |  |  |  |  |  |
0 -x--+--+--+--+--x-
   |  |  |  |  |  | 
1 -+--+--+--+--+--+-
   |  |  |  |  |  | <- pixels are rectangular areas between coordinate grid
2 -+--+--+--+--+--+-
   |  |  |  |  |  | 
3 -x--+--+--+--+--x-
   |  |  |  |  |  | 
   0  1  2  3  4  5
1 голос
/ 09 июля 2011

Сказать, что

все эти координаты предназначены для включения

означает, что на самом деле два разных прямоугольника , один внутри другого. Вот где тебя поймают: когда пишешь

width = right - left + 1

это действительно означает:

inner_width = outer_right - outer_left + thickness

где thickness - расстояние между соответствующими сторонами внутреннего и внешнего прямоугольников.

Итак, чтобы решить проблему в абстрактном математическом смысле, вам нужно рассмотреть два прямоугольника вместо одного.

1 голос
/ 09 июля 2011

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

Ваша область видимости - это прямоугольник, и даже если бы пригодилась нулевая ширина: нет такой вещи как прямоугольник с нулевой шириной.

Обычно все функции имеют контракты , и предварительное условие функции, которая говорит docalculation(par_rectangle), состоит в том, что par_rectangle на самом деле является прямоугольником.

Если вам нужен объект типа «прямоугольник» - , подобный , который может иметь нулевую ширину, вам сначала нужно определить его водонепроницаемость, и никогда не утверждать, что правила для прямоугольников будут применяться к вашему определению.

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