Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Направление осей координат при рисовании через GDI, Помогите разобраться! 
:(
    Опции темы
Волод
Дата 21.6.2005, 06:04 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Пытаюсь разобраться с понятием логической (ЛКС) и физической (ФКС) систем координат при использовани GDI-функций рисования типа Rectangle, Ellipse etc, однако я не могу разобраться, как точно определить текущее направление осей для этих ситем координат в режимах MM_ISOTROPIC, MM_ANISOTROPIC. Вот пример кода:

Код

SetMapMode(hdc, MM_ISOTROPIC);        //задали изотропный режим

//задаем размер ЛКС: 1000*1000 единиц, направление - слева-направо, снизу-вверх
SetWindowExtEx(hdc, 1000, 1000, NULL);                            

//задаем размер ФКС: cxClient*cyClient пикселей, направление слева-направо, сверху-вниз
SetViewportExtEx(hdc, cxClient, -cyClient,NULL);    

Rectangle(hdc, 0,0,500,-300);    //координаты задаются в логических единицах
Ellipse(hdc, 0,0,500,-300);        


Если я правильно все понимаю, то направление задается через знак аргумента функций SetWindow/SetViewportExtEx. Например, в приведенном примере ось Y ФКС направлена сверху-вниз, потому-что функции SetViewportExtEx передается отрицательный аргумент (-cyClient). Поэтому, чтобы нарисованная фигура была видна в клиентской области, следует вызвать функции рисования с отрицательным (логическим)Y-аргументом, который будет преобразован в положительный Y-параметр физической точки (пикселя), и соответственно попадет в клиенсткую область окна.
Моя логика работает и на таком коде:
Код

SetMapMode(hdc, MM_ISOTROPIC);    

SetWindowExtEx(hdc, 1000, -1000, NULL);                            
SetViewportExtEx(hdc, cxClient, -cyClient,NULL);    

Rectangle(hdc, 0,0,500,300);
Ellipse(hdc, 0,0,500,300);
 


Из примера видно, что я сделал одинаковым направление осей обеих систем координат. То есть по Y-оси и ЛКС, и ФКС возврастает СВЕРХУ-вниз, соответсвенно для вывода излбражений, начиная с левого верхнего угла, надо задавать положительные аргументы функции рисования.

Тогда, следуя этой же логике, я вновь задал одинаковое направление осей координат обеих систем, но по другому – так, чтобы по Y-оси ЛКС и ФКС возврастали СНИЗУ-вверх, вот код:
Код

SetMapMode(hdc, MM_ISOTROPIC);    

SetWindowExtEx(hdc, 1000, 1000, NULL);                            
SetViewportExtEx(hdc, cxClient, cyClient,NULL);    

Rectangle(hdc, 0,0,500,-300);
Ellipse(hdc, 0,0,500,-300);
 


Я ожидал, что теперь, задавая отрицательное значение Y-аргумента функции рисования, я таким образом нарисую фигуры в клиенсткой области, однако этого не произошло, и я сколько не бился, так и не смог понять почему smile...

  Вверх
Earnest
Дата 21.6.2005, 07:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Я тоже всегда путаюсь с этим делом, но знаю одно: направление осей ФКС не меняется, у дисплея ось Y всегда направлена вниз. Давая отрицательный знак, в любой из функций, вы меняете только направление логической оси.
Соответственно, в вашем последнем примере Y-оси координат направлены таки вниз.
А на экране ничего нет, так как отображаются только положительные Y.

Кроме направления и масштаба осей, есть еще точка совмещения вьюпорта и логической системы координат. Она устанавливается функциями SetViewport|WIndowOrg.

А еще мне кажется, что тема немного не на месте. Это уже к модератору...


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0404 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.