Масштабирование графика
есть множество значений пар (X, Y).
Нужно нарисовать кривую, соединяющую эти точки.
Но сделать это "красиво" - т.е. график должен занимать клиентскую часть окна, причем число делений (вместе с подписями) по осям X,Y заранее не известно и должно определяться в программе.
Множетсво пар может быть представлено вещественными или целыми числами.
Если у кого-нибудь есть идеи или занимались решением таких задач - поделитесь.
Самое важное - это используемый режим отображения координат.
Интересует решение такой общей задачи:
есть множество значений пар (X, Y).
Нужно нарисовать кривую, соединяющую эти точки.
Но сделать это "красиво" - т.е. график должен занимать клиентскую часть окна, причем число делений (вместе с подписями) по осям X,Y заранее не известно и должно определяться в программе.
Множетсво пар может быть представлено вещественными или целыми числами.
Если у кого-нибудь есть идеи или занимались решением таких задач - поделитесь.
Самое важное - это используемый режим отображения координат.
Ищем коофицент по оси x и y:
cofX = Max(график.X)/клиентское_окно.ширина;
cofY = Max(график.Y)/клиентское_окно.высота;
---
Деления на осях ставишь умножая на коофициенты по них, и так же и точки графика.
Элементраная задача!!!
Ищем коофицент по оси x и y:
cofX = Max(график.X)/клиентское_окно.ширина;
cofY = Max(график.Y)/клиентское_окно.высота;
---
Деления на осях ставишь умножая на коофициенты по них, и так же и точки графика.
Элементраная задача!!!
Если нужно вывести график, то с помощью коэффициентов это действительно элементарно.
Но проблема заключается в расстановке делений...
Нужно знать число делений, чтобы график выглядел красивее. Ведь подписи могут друг на друга накладываться.
Если нужно вывести график, то с помощью коэффициентов это действительно элементарно.
Но проблема заключается в расстановке делений...
Нужно знать число делений, чтобы график выглядел красивее. Ведь подписи могут друг на друга накладываться.
Число делений пусть у тебя будет константой, подбери визуально в зависимости от ширины/высоты клиентской формы. Например по X пусть будет 10 делений, а значения в эти деления заносишь уже согласно данным графика (если хочешь то только круглые числа).
Ты вообще на чем пишешь? Если на Делфе, там есть компонент который решит все твои проблемы сразу TChart. Так же если ну очень нуно, я накатаю тебе прогу. ;)
Т.е. шаг шкалы считай, как
step = 10^([log(max)] - 1) - получишь 10 делений на шкалу.
Число делений пусть у тебя будет константой, подбери визуально в зависимости от ширины/высоты клиентской формы. Например по X пусть будет 10 делений, а значения в эти деления заносишь уже согласно данным графика (если хочешь то только круглые числа).
Ты вообще на чем пишешь? Если на Делфе, там есть компонент который решит все твои проблемы сразу TChart. Так же если ну очень нуно, я накатаю тебе прогу. ;)
На MFC с использованием GDI. Вопрос этот скорее из области теории (качественный компонент хотелось бы сделать), если хочешь - можешь сделать что-то подобное, с интересом посмотрю.
На самом деле там вроде есть целый алгоритм для расчета этих отметок на осях. Т.е. задается минимальное / максимальное число делений по каждой оси. И в зависимости от размаха по осям рассчитывается наилучшее число делений. Вроде так. Более-менее понятное описание нашел на
http://www.rsdn.ru/Forum/Message/77668.htm