среда, 7 января 2009 г.

Почему прямоугольники не включают в себя конечную точку?

Это перевод Why are RECTs endpoint-exclusive? Автор: Реймон Чен.

Потому что с такими прямоугольниками (и линиями) значительно проще работать.

Например, ширина прямоугольника при этом равна right - left, а высота: bottom - top. Если бы прямоугольники включали бы в себя обе точки (и начальную и конечную), тогда везде появлялась бы эта назойливая +1.

Прямоугольники без конечной точки также корректно масштабируются.

Например, пусть у вас есть два прямоугольника (0,0)-(100,100) и (100,100)-(200,200). Эти два прямоугольника едва касаются друг друга в углах. Теперь предположим, что вы увеличиваете их в два раза, поэтому они становятся (0,0)-(200,200) и (200,200)-(400,400). Заметим, что они всё ещё едва касаются друг друга в углах. А также, что длина каждой стороны увеличилась с 100 до 200.

А теперь предположим, что концевая точка у нас учитывается. Тогда прямоугольники должны были бы быть (0,0)-(99,99) и (100,100)-(199,199). А после увеличения они становятся (0,0)-(198,198) и (200,200)-(398,398). Заметьте, что они больше не касаются друг друга, потому что пропущена точка (199,199). Заметьте также, что теперь сторона квадрата равна 199 пикселей вместо 200.

При межпиксельных вычислениях возникает аналогичная проблема.

"Но это же глупо - кто вообще делает масштабирование или межпиксельные вычисления?".

Ну, масштабирование используется чаще, чем вы думаете. В дополнение к очевидному zoom in/out, оно также используется при печати (поскольку в принтерах используется 300dpi, а мониторы имеют гораздо меньшее разрешение) и при проецировании в GDI (ScaleWindowExtEx, StretchBlt). А межпиксельные вычисления используюся при сглаживании (anti-aliasing).

Я извиняюсь перед Alvy Ray, но я думаю, что лучше всего думать о пикселях, как о живущих между экранными координатами, а не ровно по ним. Например, вот рисунок пикселя, который живёт между (10,10) и (11,11) (другими словами, этот пиксель - прямоугольник (10,10)-(11,11)).

Один пиксель
При такой интерпретации, исключение концевой точки становится ещё более естественным. Например, вот прямоугольник (10,10)-(13,12):

Прямоугольник три на два
Заметьте, что он начинается в (10,10) и заканчивается (13,12) - ровно как и говорят его координаты.

1 комментарий:

  1. Странно, что кому-то это не понятно и надо писать статьи объясняющие это.

    ОтветитьУдалить

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку.

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

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

Примечание. Отправлять комментарии могут только участники этого блога.