Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Система координат


Автор: vinter 25.4.2007, 20:23
Привет всем!
появилась следующая проблема: нужно сделать систему координат(функцию), которая бы строила график функции по переданным в нее массивам. Проблема в следующем, массивы могут приходить как с очень малыми числами, так и с очень большими(допустим возьмем ф-ию логарифма). ф-ии типа LineTo принимают только целочисленные аргументы, следовательно мне нужно по какому то принципу преобразовать вещщественные числа чтобы не нарушился порядок следования чисел, вопрос как это сделать?

Автор: anwe 25.4.2007, 21:51
Ну, наверное, через масштаб. Надо определить максимальное значение и должны быть известны размеры части окна, где будет прорисовываться график. Получится масшаб.
Ну, а как вся графика - она дискретна - и реальные результаты надо "подводить" под дискретные значения, которые пойдут в LineTo.

Автор: vinter 26.4.2007, 10:35
Цитата(anwe @  25.4.2007,  21:51 Найти цитируемый пост)
"подводить"

вот как это сделать, меня как раз и интересует smile
мне кроме как найти коээфициент, который делает минимальное число целым, а потом умножить всю последовательность на этот коэффициент ниче в голову нелезет

Автор: Oluka 26.4.2007, 11:27
Цитата

вот как это сделать, меня как раз и интересует 


ну, можно сделать так:
1) Ты строишь все-равно не весь график, а его часть (чаще всего, за искл случая замкнутой кривой и т.п.), поэтому ты можешь найти макс и мин значения на строящемся участке.
2) Разность между ними/количество пикселей = кол-во единиц измерения/пиксель
3) Попиксельно рисуешь))))  

Автор: S.A.G. 26.4.2007, 12:09
vinter, а какие данные содержаться в массивах?

Автор: vinter 26.4.2007, 12:41
Цитата(S.A.G. @  26.4.2007,  12:09 Найти цитируемый пост)
vinter, а какие данные содержаться в массивах?

вещественные числа

Добавлено через 2 минуты и 10 секунд
Цитата(Oluka @  26.4.2007,  11:27 Найти цитируемый пост)
1) Ты строишь все-равно не весь график, а его часть (чаще всего, за искл случая замкнутой кривой и т.п.), поэтому ты можешь найти макс и мин значения на строящемся участке.

я строю весь график, пример выше это просто в качестве примера, строю я совсем другое
Цитата(Oluka @  26.4.2007,  11:27 Найти цитируемый пост)
2) Разность между ними/количество пикселей = кол-во единиц измерения/пиксель

я понимаю, вот только вопрос то стоит в алгоритме преобразования вещественных чисел в целые

Автор: S.A.G. 26.4.2007, 12:45
Цитата
вещественные числа

Координаты точек графика? Тоесть их придеться линиями потом соединять?

Автор: likehood 26.4.2007, 13:25
пусть X, Y - координаты точек из входного массива
Xmin - минимальное значение из всех X
Sx, Sy - экранные координаты (целые числа)
Sx max, Sx min - границы экранной области, в которой строится график

Дальше пишем простую пропорцию:
(X-Xmin)/(Sx-Sx min) = (Xmax-Xmin)/(Sx max-Sx min) = 1/Kx
Sx = Sx min + K(X-Xmin)
Sy = So - K(Y-Yo)  // центрируем график по оси Y
здесь K = min{Kx, Ky}, So = (Sy max + Sy min)/2, Yo = (Ymax-Ymin)/2

Автор: vinter 26.4.2007, 15:12
Цитата(S.A.G. @  26.4.2007,  12:45 Найти цитируемый пост)
Координаты точек графика? Тоесть их придеться линиями потом соединять?

да
likehood  , спасибо за инфу
а где мне взять
Цитата(likehood @  26.4.2007,  13:25 Найти цитируемый пост)
K = min{Kx, Ky}


Автор: likehood 26.4.2007, 18:58
Сначала считаются коэффициенты Kx и Ky по первой формуле, а затем берется меньший из них.

Автор: vinter 29.4.2007, 13:03
спасибо

Автор: vinter 29.4.2007, 17:34
likehood, появилась некоторая проблема, например когда строю график синуса, то получается что верхушки выходят за границы экрана, обрезаются вершины как это поправить
кстати ты тут наверно ошибся?
Цитата(likehood @  26.4.2007,  13:25 Найти цитируемый пост)
Sy = So - K(Y-Yo)  // центрируем график по оси Y

должно быть так?
Sy = So + K(Y-Yo) 

Автор: vinter 29.4.2007, 17:57
кхм.. решил проверить на обычной ф-ии x=y , и получил неправильный результат, считал по формулам которые ты сказал..

мой косяк в коде smile
извиняюсь

Добавлено через 14 минут и 40 секунд
ну вот вообщем последний вопрос то у меня и остался, как сжимать/разжимать график

Автор: likehood 29.4.2007, 21:20
Цитата(vinter @  29.4.2007,  18:34 Найти цитируемый пост)
должно быть так?
Sy = So + K(Y-Yo) 

Возможно. Главное чтобы ось Y смотрела вверх, а не вниз.

Цитата(vinter @  29.4.2007,  18:57 Найти цитируемый пост)
ну вот вообщем последний вопрос то у меня и остался, как сжимать/разжимать график

Все тем же коэфициентом K. Если тебе не важны пропорции, для каждой из осей можно использовать свой коэффициент.

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