Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сложный график с несколькими осями, как нарисовать? 
:(
    Опции темы
rsm
Дата 29.10.2005, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Нужно нарисовать график с двумя осями X и двумя Y (масштабы разные). Пример см. в аттаче. Как это реализовать? Нарисовать оси, штрихи делений и сами графики это я нарисую. А как рисовать цифры так, чтобы они не пересекались с осями графика?

Может быть кто-то встречал подобный пример? Заранее большое спасибо!

Присоединённый файл ( Кол-во скачиваний: 44 )
Присоединённый файл  graf.jpg 15,74 Kb
PM MAIL   Вверх
Coocky
Дата 29.10.2005, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Цитата(rsm @ 29.10.2005, 09:54)
А как рисовать цифры так, чтобы они не пересекались с осями графика?

smile
Не пойму вопроса..
CDC::DrawText, в котором для вывода задаешь прямоугольник. Координаты верхней точки его надо буде просто сместить относительно координат Х вниз, а левой точки влево, тносительно Y.
Какие проблемы?



--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
nikitao
Дата 29.10.2005, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

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



Может ,rsm,имеет ввиду что текст должен как бы облегать график?(хотя по рисунку не скажешь) smile


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
rsm
Дата 29.10.2005, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



См. аттач: слева - правильно, справа - криво. Как недопустить пересечения текста с линией?

Это сообщение отредактировал(а) rsm - 29.10.2005, 19:35

Присоединённый файл ( Кол-во скачиваний: 25 )
Присоединённый файл  num.png 0,56 Kb
PM MAIL   Вверх
nikitao
Дата 30.10.2005, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

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



rsm,а как должна висти себя твоя прога если случись так что линии графиков совсем рядом и не подписать так что бы она не пересекать одну из линий?

А так в теории у меня вот какие мысли(я просто пока в VC++ лузер):
1.Создаешь двумерный булев масcив размерами прямоугольника твоего текста.
2.Проверяешь "на цвет" прямоугольник в котором должен находится твой текст ,отмечая в массиве те пикселя которые по цвету не подходят.(просто график рисуется черным ,а фон серый)
3.Анализируешь массив и здвигаешь свой текст так чтобы цвет прямоугльника был везде был серым и снова к второму пункту.


ЗЫ Алгоритм из головы брал ,но доработав (ИМХО) можно что-то придумать smile

Это сообщение отредактировал(а) nikitao - 30.10.2005, 09:53


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
rsm
Дата 30.10.2005, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



nikitao
Не катит:
1. Еще сложнее.
2. Очень медленно.

2 all:
Пока что придумал только один метод. Рассмотрим создание осей У (оси Х строятся аналогично). Рисование идет слева направо.
1. Ищем самую длинную строку.
2. Ищем координату последней буквы самой длинной строки.
3. Исходя из этой координаты получаем начальные координаты для всех строк текста.
4. Рисуем все строки текста с заданным масштабом (с интервалами по У).
5. Рисуем осевую линию графика 1.
6. Повторяем шаги 1~5 для графика 2, предварительно сделав отступ от осевой линии графика 1.
Задача получается излишне сложная: нужно будет считать длину текста в пикселях с учетом размера шрифта, размеров экрана, масштаба графика. И одновременно следить за тем, чтобы текст разных осей не пересекался ни друг с другом, ни с осями.

Кто-нибудь может предложить что-то попроще?
PM MAIL   Вверх
nikitao
Дата 30.10.2005, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

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



rsm,а может не парится.Сделать текст ,напротив,под графиком,а при нажатии или наведении курсора на ту или иную надпись она на какое то время становится поверх графика или выезжает над курсором строка с ее полным содержанием.Это не то что тебе нужно,но зато тормозов и гемора точно не будет.(ИМХО) Это довольно элегантное решение этой задачи.

Это сообщение отредактировал(а) nikitao - 30.10.2005, 16:54


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
rsm
Дата 30.10.2005, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(nikitao @ 30.10.2005, 18:53)
а при нажатии или наведении курсора на ту или иную надпись она на какое то время становится поверх графика

С удовольствием так бы и сделал если бы не одно но: графики будут поступать на печать. А на листе бумаги поверх графика ничего не вылезет, сколько в него не тыкай.
PM MAIL   Вверх
takedo
Дата 31.10.2005, 08:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



rsm
Ты чё? Это ведь просто, если я правильно понял.
Берешь при инициализации своего графика делаешь следующее:
//TEXTMETRIC tm;
//dc.GetTextMetrics(&tm);
CString str;
CSize size;
str.Format(_T("%d"),-(INT_MAX-1));//например
size = dc.GetTextExtent(str);

И в зависимости от size делаешь вывод на график числа через TextOut или DrawText с соответствующими координатами, которые не позволят выехать куда не надо. Если и это не спасает, то воспользуйся dc.GetTextMetrics(&tm); там тоже кучу параметров можно взять о фонте. Проблем то нет! smile


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
Coocky
Дата 31.10.2005, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Цитата(rsm @ 29.10.2005, 19:35)
Как недопустить пересечения текста с линией?


Цитата(Coocky @ 29.10.2005, 15:31)
Не пойму вопроса..
CDC::DrawText, в котором для вывода задаешь прямоугольник. Координаты верхней точки его надо буде просто сместить относительно координат Х вниз, а левой точки влево, тносительно Y.
Какие проблемы?





--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
nikitao
Дата 31.10.2005, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

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



Coocky,проблема вот в чем:График не прямая и он может "извеваться" и "загибаться"=>точку графика которую мы надписываем не будет пересекать,а вот какую то другую-легко=>надо придумать алгоритм который проверяет не залезает ли надпись на любую точку графика.Они уже придуманы(см выше),но они тормаза и очень сложны в реализации,нужно что-то проще.

smile ЗЫ Пиведи мне человека который хаял MFC ,я его .... да голыми руками... smile smile


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
takedo
Дата 1.11.2005, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата
а вот какую то другую-легко=>надо придумать алгоритм который проверяет не залезает ли надпись на любую точку графика

Да вы чё, в натуре?! smile smile можно же прямоугольник графика делать с размерами A на B, а надписи делать в другом прямоугольнике, который будет больше: A+deltaA на B+deltaB, дельты сделать такими, что бы надписи стопудово влезали!!! Не пойму, чего вы паритесь с тем, как нарисовать график, ведь проблема должна заключаться в том, как его получить,!!!
smile



--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
nikitao
Дата 1.11.2005, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

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



takedo,как я понял ты предлогаешь просто вынести все надписи в сторону,где нет графика.Если да,то это вариант,но (имхо) не очень хороший ибо не очень кпрасиво будет выгледеть. smile


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
takedo
Дата 2.11.2005, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



nikitao тогда вопрос, а что же значит КРАСИВО? А для красоты можно ещё ведь и текстуру под линиями натягивать smile , ну так для красоты...


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
nikitao
Дата 2.11.2005, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

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



takedo,краасиво--это вот что:
Вспомни когда ты в школе учился,ты графики ресовал?подписывал?
Ты что рисовал график на одной странице,а подписывл на другой? smile
Добавлено @ 17:07
Цитата(takedo @ 2.11.2005, 09:36)
текстуру под линиями натягивать

Это идея,но блин систему жрать много будет.(Еще блокнот давайте сделаем с применение DirectX 9.0c) smile



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


 




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


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

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