Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нарисовать оси координат 
:(
    Опции темы
keeper1
Дата 19.11.2010, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 19.11.2010

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



Пришлось создавать еще одну тему...
В общем вопрос такой.
Надо разработать программу для построения графика функции с осями координат по заданным во внешнем файле точкам.
Считывает из файла моя прога нормально, выводит на экран значения в 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] );    

PM MAIL   Вверх
Proxin
Дата 19.11.2010, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 363
Регистрация: 21.6.2008

Репутация: нет
Всего: 3



Ищите низ MyDC.
PM MAIL   Вверх
keeper1
Дата 19.11.2010, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 19.11.2010

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



Что значит низ?
PM MAIL   Вверх
Proxin
Дата 20.11.2010, 01:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 363
Регистрация: 21.6.2008

Репутация: нет
Всего: 3



Bottom либо Height, точно не помню.
PM MAIL   Вверх
keeper1
Дата 20.11.2010, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 19.11.2010

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



А поподробнее? Как именно это надо сделать?Из ваших объяснений почти ничего неясно
PM MAIL   Вверх
keeper1
Дата 20.11.2010, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 19.11.2010

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



Ну подскажите мне кто-нибудь по-нормальному,пожалуйста!
PM MAIL   Вверх
Earnest
Дата 22.11.2010, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

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


--------------------
...
PM   Вверх
Dreamer_0x01
Дата 30.11.2010, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



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


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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