Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Нарисовать оси координат


Автор: keeper1 19.11.2010, 16:53
Пришлось создавать еще одну тему...
В общем вопрос такой.
Надо разработать программу для построения графика функции с осями координат по заданным во внешнем файле точкам.
Считывает из файла моя прога нормально, выводит на экран значения в ListBox, затем рисует график по точкам с помощью LineTo.
НО!
Не знаю,как задать и нарисовать оси координат графически, чтобы начало отсчета было в нижнем левом углу а не в верхнем левом как пол умолчанию.
Подскажите,пожалуйста
Вот так рисую графику:
Код

CClientDC MyDC(GetDlgItem(IDC_STATIC1)); 

CRect Rect; 
CWnd *pWnd = MyDC.GetWindow();  

pWnd->GetClientRect( &Rect ); 

CPen Pen(PS_SOLID, 2, RGB(0,0,255)); 
MyDC.SelectObject(&Pen); 
for(i=0;i<n-1;i++)
MyDC.LineTo( px[i], px[i+1] );    

Автор: Proxin 19.11.2010, 17:03
Ищите низ MyDC.

Автор: keeper1 19.11.2010, 17:16
Что значит низ?

Автор: Proxin 20.11.2010, 01:58
Bottom либо Height, точно не помню.

Автор: keeper1 20.11.2010, 10:56
А поподробнее? Как именно это надо сделать?Из ваших объяснений почти ничего неясно

Автор: keeper1 20.11.2010, 20:28
Ну подскажите мне кто-нибудь по-нормальному,пожалуйста!

Автор: Earnest 22.11.2010, 09:50
Цитата(keeper1 @  19.11.2010,  17:53 Найти цитируемый пост)
Считывает из файла моя прога нормально, выводит на экран значения в ListBox, затем рисует график по точкам с помощью LineTo.

Интересно, что ты будешь делать, если эти px будут, скажем, плавающими числами от 0 до 1. Или, наоборот, очень большими, так что в экран не влезут. Выход: пересчитывать координаты. Т.е. отображать области определения и значения функции в экранные координаты, с помощью простеньких линейных преобразований. Тут и с осями все наладится. где надо, там и сделаешь 0.
Можно еще поиграться с SetViewOrigin и прочими установками системы координат DC, но лучше ручками: во-первых, через задание координат DC не универсально (все те же действительные числа), во-вторых, лучше поймешь.

Автор: Dreamer_0x01 30.11.2010, 13:14
keeper1, 
Цитата(keeper1 @  19.11.2010,  16:53 Найти цитируемый пост)
Надо разработать программу для построения графика функции с осями координат по заданным во внешнем файле точкам.


Если это то, что требуется в задании, то замена ориентации осей совершенно не нужна и стандартных функций рисования хватит тут за глаза.
А пересчитать значения координат - простейшая задача примерно на уровне 6 класса начальной школы ;)
Если уж совсем приспичило, то ты можешь поменять режим вывода с помощью функции SetMapMode(), в этих режимах есть как раз ориентированные как тебе нужно. Но если тебе требуется только то, что ты написал, то это лишнее телодвижение.


У тебя не сделана очень важная вещь - не отделено физичекое пространство координат от экранного.
Если на входе получаешь данные в физических коордиатах, их надо преобразовывать в экранные.
Если же уже получаешь сразу в экранных, то тогда вообще ничего преобразовывать не нужно.
А формулы преобразования, как я говорил, гораздо проще, чем кажутся. Вспомни уроки геометрии в шестом классе школы.
Смотри приложенный рисунок.
Здесь Уэ, Хэ - экранные координаты, а Уф,Хф - физические.
Чтобы построить график, сначала нужно определиться с границами построения - теми, которые у тебя будут крайними значениями.
Им будут соответствовать координаты на экране. 
Соответственно крайние значения физических координат задаем как Хф1,Хф2,Уф1,Уф2.
А экранные задаем как Хэ1,Хэ2,Уэ1,Уэ2. Причем экранные задаем именно в экранной системе координат, см. рисунок.

Тогда любую точку физического пространства можно перевести на экран по следующим формулам:

Хэ = Хэ1 + (Хэ2 - Хэ1) * (Хф - Хф1) / (Хф2 - Хф1);
Уэ = Уэ2 - (Уэ2 - Уэ1) * (Уф - Уф1) / (Уф2 - Уф1).

Все, и не надо думать о направлении осей!

Но если и это лень делать - поищи, в инете масса готовых dll, которые рисуют графики.
Например, вот тут есть dll для построения графиков, для построения выделяешь массивы и заполняешь физическими координатами, задаешь области рисования, запускаешь еще пару функций, и графи строется в указанном окне:

http://svsft.com/index.php?content=graphicscppdll


Прикладываю рисунок, поясняющий преобразование физических координат в экранные:

 user posted image

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)