Форум: "Прочее";
Текущий архив: 2012.03.25;
Скачать: [xml.tar.bz2];
ВнизCanvas.Rectangle Найти похожие ветки
← →
upc (2011-11-29 17:22) [0]Почему эта процедура рисует нижнюю и правую сторону не ровно по заданным координатам, а со смещением на единицу вверх и влево соответственно?
← →
@!!ex © (2011-11-29 17:26) [1]Код покажи как рисуешь.
← →
clickmaker © (2011-11-29 17:26) [2]Потому что
Remarks
The rectangle that is drawn excludes the bottom and right edges
(c) MSDN
← →
MBo © (2011-11-29 17:26) [3]Так ей положено
The rectangle that is drawn excludes the bottom and right edges
Кроме того, не рисуется последняя точка LineTo.
Одна из причин - чтобы избежать двойной прорисовки при состыковке.
← →
upc (2011-11-29 17:29) [4]
> @!!ex
так и рисую одной строчкой - Canvas.Rectangle();
> MBo
Я понял, что раз она так рисует, то ей так положено, но зачем так сделано? Ведь логично, на мой взгляд, что бы рисовалось строго по координатам.
← →
upc (2011-11-29 17:50) [5]Кстати, что примечательно, кажется такая же методика используется и, например, в движке GLScene при рисовании параллелепипедов. То есть логика то какая-то есть в этом деле, но какая? вот что меня интересует.
← →
Компромисс (2011-11-29 17:52) [6]upc (29.11.11 17:50) [5]
до конца дочитали MBo © (29.11.11 17:26) [3] ?
← →
upc (2011-11-29 17:53) [7]
> Компромисс (29.11.11 17:52) [6]
если вы про
> Одна из причин - чтобы избежать двойной прорисовки при состыковке.
то я так понял это относится к
> Кроме того, не рисуется последняя точка LineTo.
а не к рисованию границ прямоугольника.
Причем там состыковка?
← →
Медвежонок Пятачок © (2011-11-29 17:54) [8]То есть логика то какая-то есть в этом деле, но какая? вот что меня интересует.
Логика логическая. Получить координаты один раз.
Затем нарисовать текст и рамку.
Используя одни и те же координаты.
И рамка не перекрывает текст.
← →
upc (2011-11-29 17:57) [9]> Медвежонок Пятачок
Какой еще текст?
← →
Anatoly Podgoretsky © (2011-11-29 17:59) [10]> MBo (29.11.2011 17:26:03) [3]
Так это не кординаты, а размер
← →
Медвежонок Пятачок © (2011-11-29 18:00) [11]Какой еще текст?
текстовый.
← →
upc (2011-11-29 18:05) [12]Я вас не понимаю: ни о каком тексте речи не шло.
← →
Компромисс (2011-11-29 18:09) [13]
> Причем там состыковка?
Попробуйте нарисовать шахматную доску в двух циклах.
← →
upc (2011-11-29 19:04) [14]С помощью Canvas.Rectangle?
← →
MBo © (2011-11-29 19:57) [15]
//без перекрытия
Canvas.Rectangle(0, 0, 20, 20);
Canvas.Rectangle(20, 0, 40, 20);
//с перекрытием
Canvas.Rectangle(50, 0, 71, 20);
Canvas.Rectangle(70, 0, 90, 20);
//FillRect всегда исключает низ и правую сторону
Canvas.Brush.Color := clGray;
Canvas.FillRect(Rect(90, 0, 110, 20));
SetGraphicsMode(Canvas.Handle, GM_ADVANCED);
Canvas.FillRect(Rect(110, 0, 130, 20));
Canvas.Brush.Style := bsClear;
//а Rectangle в расширенном режиме не исключает
Canvas.Rectangle(130, 0, 150, 20);
SetGraphicsMode(Canvas.Handle, GM_COMPATIBLE);
Canvas.Brush.Style := bsClear;
//вот пример нехорошей двойной отрисовки
Canvas.Pen.Mode := pmnotXor;
Canvas.Rectangle(150, 0, 171, 20);
Canvas.Rectangle(170, 0, 190, 20);
← →
Компромисс (2011-11-30 10:30) [16]MBo © (29.11.11 19:57) [15]
ИМХО такой пример не может быть правильным. Всегда можно вместо Rectangle(X1, Y1, X2, Y2) написать X1, Y1, X2-1, Y2-1). Выигрыш именно в том, чтобы не вычитать 1. То есть X2, Y2 равны X1, Y1 c предыдущей операции (итерации цикла обычно).
← →
MBo © (2011-11-30 13:09) [17]>Компромисс
Это ни правильно, ни неправильно - просто демонстрация нескольких случаев
← →
Компромисс (2011-11-30 13:22) [18]MBo © (30.11.11 13:09) [17]
Да, я понял. Но она не поясняет, зачем вообще авторы придумали, чтобы нижняя и правая границы исключались при GM_ADVANCED.
← →
Григорьев Антон © (2011-11-30 14:09) [19]Для того, чиобы X2-X1 давало ширину прямоугольника в пикселях. Если прорисовывать точно по координатам, то ширина будет на единицу больше, чем X2-X1.
Это общий подход работы WinAPI с типом RECT. Везде, где он появляется, подразумевается, что правая и нижняя стороны в прямоугольник не включены. Например, функция GetWindowRect возвращает прямоуголник с учётом этого правила. Единственное мне исключение - создание прямоугольных регионов, это подробно разбирается в книге Феня Юаня.
← →
Anatoly Podgoretsky © (2011-11-30 14:43) [20]
> Ведь логично, на мой взгляд, что бы рисовалось строго по
> координатам
Это на твой взгляд, а на взгляд микрософта правильнее размеры.
← →
Компромисс (2011-11-30 14:54) [21]Lazarus был исправлен, чтобы не отличаться от Delphi насчет Rectangle
http://bugs.freepascal.org/view.php?id=8342
← →
cyber-pilot (2011-11-30 15:04) [22]Цитата вот от сюда http://delphikingdom.com/quintana/quintana.asp?ItemID=15
"Такой пересчёт координат прямоугольника используется в Windows везде, не только непосредственно при выводе графики. Например, если задать окну прямоугольник (0, 0, 300, 150), то для правой стороны будет X=299, для нижней – Y=149. Это связано с расчётом ширины и высоты прямоугольника. Если бы прямоугольники рисовались по «честным» координатам, то ширина рассчитывалась бы по формуле X2-X1+1. Необходимость добавления единицы здесь не сразу очевидна, но рассмотрим ситуацию на простом примере. Возьмём прямоугольник с координатами (7, 7, 8, 8). Очевидно, что он имеет размер 2x2, хотя 8-7=1. Именно поэтому приходится добавлять единицу. Но кто-то из разработчиков Windows решил, что каждый раз добавлять единицу накладно, вместо этого лучше не рисовать правый столбец и нижнюю строку пикселей у прямоугольника. Теперь высота рассчитывается по формуле Y2-Y1, ширина – X2-X1. Можно спорить о том, удобно ли это, но GDI Windows реализована именно так, и в своих программах это необходимо учитывать".
← →
абизяна (2011-11-30 15:19) [23]
> cyber-pilot (30.11.11 15:04) [22]
> Возьмём прямоугольник с координатами (7, 7, 8, 8). Очевидно,
> что он имеет размер 2x2, хотя 8-7=1.
Программисту очевидно - не программисту, скорее нет. Всё дело в том, что в начале был ноль. Вывод - в Microsoft программистов нету.
← →
Компромисс (2011-11-30 15:25) [24]абизяна (30.11.11 15:19) [23]
Да, я тоже удивился. Почему использовали (7, 7, 8, 8) вместо (0, 0, 1, 1)?
← →
Anatoly Podgoretsky © (2011-11-30 15:35) [25]> cyber-pilot (30.11.2011 15:04:22) [22]
Неправильно, будет ширина 300 и высота 150
← →
Anatoly Podgoretsky © (2011-11-30 15:38) [26]> Компромисс (30.11.2011 15:25:24) [24]
Тогда придется использовать вторую фунцию, функцию установки координат, да и
вообще в этом случае первых два параметра лишнии.
Rectangle(1, 1) или Rectangle(2, 2)
← →
Компромисс (2011-12-01 09:38) [27]Anatoly Podgoretsky © (30.11.11 15:38) [26]
Я бы создал Rectangle(left, top, width, height). Он ИМХО проще для понимания домохозяек и никаких +/-1 не надо
← →
Компромисс (2011-12-01 09:40) [28]
> Тогда придется использовать вторую фунцию, функцию установки
> координат, да и
> вообще в этом случае первых два параметра лишнии.
> Rectangle(1, 1) или Rectangle(2, 2)
Я не имел в виду, что первые два параметра всегда 0. ИМХО странно объяснять "очевидные" вещи на больших числах. Они бы еще Rectangle(234252, 56373, 234253, 56374) использовали! :)
← →
абизяна (2011-12-01 15:32) [29]
> Возьмём прямоугольник с координатами (7, 7, 8, 8). Очевидно,
> что он имеет размер 2x2, хотя 8-7=1.
В том-то и дело, что нормально (7,7,8,8) вполне понятно и 7,7 и 8,8 включительно - ясно, что 2X2. А по Гейтсу 7,7 включительно, но 8,8 не включительно, чтобы было 2X2 нужно задавать (7,7,9,9). В этом и есть дурдом, хотя конечно, если об этом знаешь, то всё-равно, однако - "осадок, то остался".
← →
Anatoly Podgoretsky © (2011-12-01 16:56) [30]Перепишешь виндоус и как будешь оправдываться за потерю производительности?
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2012.03.25;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.004 c