Вернуться наверх
aco.ifmo.ru photonic
вернуться в оглавление предыдущая глава предыдущий параграф следующий параграф следующая глава


4.3. Установка системы координат

Для установки системы координат используются следующие функции базового класса CDC:

virtual int CDC::SetMapMode (int nMapMode) - определяет направления осей координат и логические единицы измерения для данной системы координат. Возможные значения параметра nMapMode:
MM_TEXT (установлен по умолчанию) - 1 логическая единица = 1 пиксель. Ось y направлена вниз.
MM_HIMETRIC - 1 логическая единица = 0.01 мм. Ось y направлена вверх.
MM_LOMETRIC - 1 логическая единица = 0.1 мм. Ось y направлена вверх.
MM_TWIPS - 1 логическая единица = 1/1440 дюйма = 0.176 мм. Ось y направлена вверх.
MM_ANISOTROPIC - величина логической единицы и направления осей координат устанавливается отдельно для x и y с помощью функций SetWindowExt и SetViewPortExt
MM_ISOTROPIC - величина логической единицы и направления осей координат устанавливается с помощью функций SetWindowExt и SetViewPortExt, но масштаб по x и y всегда одинаковый (1:1).

virtual CPoint CDC::SetViewportOrg (int x, int y) - осуществляет перенос начала координат физической области вывода. Параметры:
(x, y) - физические координаты точки, которую нужно сделать началом координат.
virtual CPoint CDC::SetWindowOrg (int x, int y)- осуществляет перенос начала координат в логической системе координат. Параметры:
(x, y) - логические координаты точки, которую нужно сделать левым верхним углом области вывода.
virtual CSize CDC::SetVieportExt (int сx, int сy) - осуществляет настройку размеров физической области вывода. Если изначально система координат была установлена таким образом, что ось y направлена вниз, можно "перевернуть" ее, задав отрицательное значение по оси y . Параметры:
сx, сy - новые значения размеров по осям.
virtual CSize CDC::SetWindowExt (int сx, int сy) - осуществляет установку логической системы координат. Параметры:
сx, сy - новые значения размеров по осям.

Пример установки системы координат для рисования графика с одинаковым масштабом по осям

Такая система координат удобна для рисования графика с одинаковым масштабом по осям (например, точечные диаграммы). Для рисования точечных диаграмм было бы удобно задать максимальные значения по осям (1, 1), но при рисовании все координаты округляются до целого значения, поэтому приходится вводить коэффициент масштабирования (например 100) и задавать соответствующий масштаб по осям и соответствующие координаты при рисовании. Чтобы оставить немного места для подписей к осям можно задать максимальные значения (105, 105).

CRect rect;	
// получить контекст устройства
CPaintDC dc(this);	
// получить размеры области вывода
GetClientRect(rect);	
// установить систему координат с одинаковым масштабом по x и y
dc.SetMapMode(MM_ISOTROPIC);	
// установить максимальные значения по осям координат
dc.SetWindowExt(105,105);
// коэффициент масштабирования	
int scale=100;
// перевернуть направление оси y 
dc.SetViewportExt(rect.Width(), -rect.Height() );	
// установить начало координат в центр окна
dc.SetViewportOrg(rect.Width()/2, rect.Height()/2 );	
// рисование графика 
polynom.Draw(dc, scale);

Пример установки системы координат для рисования графика с неодинаковым масштабом по осям

Такая система координат удобна для рисования графика с неодинаковым масштабом по осям (например, графики поперечных аберраций). Масштаб по осям также как и предыдущем примере умножается на 100. Чтобы оставить немного места для подписей к осям можно задать максимальные значения (max_dx*105, max_ro*105). Еще одно отличие этого примера заключается в том, что рисование происходит не в самом окне, а на одном из элементов этого окна - m_Frame.

CRect rect;	
// получить контекст устройства
CDC* pDC=m_Frame.GetDC();	
// получить размеры области вывода
m_Frame.GetClientRect(rect);	
// установить систему координат с неодинаковым масштабом по x и y
pDC->SetMapMode(MM_ANISOTROPIC);	
// установить максимальные значения по осям координат
// max_dx - максимальная величина поперечной аберрации
// max_ro=1 - максимальное значение зрачковой координаты 
pDC->SetWindowExt(max_dx*105, max_ro*105);	
// коэффициент масштабирования	
int scale=100;
//  перевернуть направление оси y 
pDC->SetViewportExt(rect.Width(), -rect.Height() );	
// установить начало координат в центр окна
pDC->SetViewportOrg(rect.Width()/2, rect.Height()/2 );
// рисование графика 
polynom.Draw(pDC, scale);

Пример установки системы координат для рисования линзы

Такая система координат удобна для рисования линзы, оптической системы и т.д. При такой системе координат сохраняется соотношение масштабов по x и y, но для прямоугольного окна максимальная величина по осям будет разной. При этом размер по осям задается по максимальной из двух величине: ширине или высоте окна. Для линзы скорее всего определяющей будет высота окна, а для оптической cиcтемы - ширина окна, которая складыватся исходя из суммы всех осевых расстояний. При такой системе координат точка (0,0) находится в центре окна по y и в левом уголу по x. При рисовании линзы надо задавать координаты ее вершины (точки начала рисования).

CRect rect;	
// получить контекст устройства
CDC* pDC=m_Frame.GetDC();	
// получить размеры области вывода
m_Frame.GetClientRect(rect);
// установить систему координат с одинаковым масштабом по x и y
pDC->SetMapMode(MM_ISOTROPIC);
// высота окна вычисляется исходя из максимальной световой высоты на поверхностях
float win_h=max(m_lens_h1,m_lens_h2)*2.5;
// ширина окна вычисляется исходя из толщины линзы
float win_d=m_lens_d*5;
// установить максимальные значения по осям координат
pDC->SetWindowExt(win_d*100, win_h*100);	
// коэффициент масштабирования	
int scale=100;
// перевернуть направление оси y 
pDC->SetViewportExt(rect.Width(), -rect.Height() );	
// установить начало координат в центр окна по y и в левый угол по x  
pDC->SetViewportOrg(0, rect.Height()/2 );	
// рисование лизы 
lens.Draw(pDC, scale);