Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.03.25;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.006 c
15-1322655766
Тут был я
2011-11-30 16:22
2012.03.25
Ввод тел. номера в Вебмани.


2-1323308405
tj.nelson
2011-12-08 05:40
2012.03.25
Помогите разобратся с DayOfTheWeek


2-1323420041
bestolkov
2011-12-09 12:40
2012.03.25
Отображение графики


2-1323333273
TComponent
2011-12-08 12:34
2012.03.25
Вопрос про WinExec


2-1323262115
Kamilos
2011-12-07 16:48
2012.03.25
Картинка изменяла свой размер вместе с формой программы