Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
15-1322588271
Dennis I. Komarov
2011-11-29 21:37
2012.03.25
Google AdSense или...


2-1323178100
1234567890
2011-12-06 17:28
2012.03.25
значение неинициализированной переменной целого типа


1-1289813557
cr@nk
2010-11-15 12:32
2012.03.25
Delphi и RDP


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


2-1323635690
Bobermaner
2011-12-12 00:34
2012.03.25
Работа с COM-портом.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский