Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > как построить график функции в Bc 3.1 под DOS


Автор: qwerty 1.4.2003, 07:50
Нужно построить график функции (сложной, т.е. не элементарной) под DOS.
С центром координат в точке с координатами (X1,Y1). Как это сделать? withstupid.gif
Раньше делал, но сейчас забыл и исход. не осталось.

И еще как масштабировать график функции, а то при значительном изменении аргумента функции само значение функции изменяется очень не значительно(в десятитысячных, при изменении аргумента на единицу).
Разрешение экрана 640х480.

Автор: Paradox 1.4.2003, 15:05
Координаты пересчитывать

Автор: DENNN 1.4.2003, 18:04
Вариант Paradox'а наверное оптимальный. Добавлю, что удобно завести матрицу преобразований, по которой функция постоения графика будет рассчитывать координаты пикселов. Тогда для изменения/растяжения/сжатия/поворота изображения достаточно модифицировать эту матрицу.

Автор: qwerty 1.4.2003, 22:44
Paradox
Координаты пересчитывать

Это я и так знал. Вопрос как это сделать.

DENNN
Вариант Paradox'а наверное оптимальный. Добавлю, что удобно завести матрицу преобразований, по которой функция постоения графика будет рассчитывать координаты пикселов. Тогда для изменения/растяжения/ сжатия/поворота изображения достаточно модифицировать эту матрицу.

Можно более подробно.
Если можно привести пример кода для какой-нибудь элементарной функции.

Автор: DENNN 1.4.2003, 23:28
Цитата
Можно более подробно.

Сначала мат. теория. То что ты хочешь сделать можно назвать как переход от системы координат графика к системе координат дисплея. Наиболее удобно это описывает матрица аффинных преобразований. Матрица эта квадратная, размерность ее зависист от числа используемых координат. Для 3D это обычно 3x3 или 4x4. Во втором варианте точка будет представлена как матричный вектор размерностью 4 строки на один столбец. Так точка (0,0,0) представляется как (0,0,0,1); Чтоб получить координаты этой точки в новой СК необходимо умножить матрицу-вектор на матрицу аффинных преобразований. Такой способ позволяет учесть абсолютно все виды преобразований, даже неперпендикулярность осей координат. Как рассчитать требуемую матрицу поищи сам - благо примеров в инете и литературе по графике навалом. Когда старая и новая СК совпадают "один в один" матрица преобразований выглядит так
1,0,0,0
0,1,0,0
0,0,1,0
0,0,0,1

размерность 4x4 избавляет от некоторых побочных трудностей, связанных с матричной алгеброй.

Почему матрицы? На компьютере данный способ реализуется быстрей всего и при использованиии "на поток" дает наилучшие показатели производительности для обобщенного случая.

Автор: DENNN 1.4.2003, 23:30
Навсякий случай, если у тебя 3D график. Аффинными преобразованиями можно выразить только ортографическую проекцию пространства на плоскость, но не перспективную.

Автор: qwerty 2.4.2003, 00:49
DENNN
Да. нет график 2мерный.
Если не сложно бросьте ссылки на материалы по построению графиков 2D функций, а на счет матриц это не шутка?(1апрельская)

Автор: DENNN 2.4.2003, 02:38
Нет это совершенно серьезно.

Автор: AntonSaburov 2.4.2003, 22:26
Цитата
Да. нет график 2мерный.


Для 2D графика делалось очень просто:

1. Находим минимальное и максимальное значение из самой функции по одной координаты - MAXfun и MINfun.
Также известно маскимальный размер на экране - MAXscreen и MINscreen
2. Находим то же самое для другой координаты.

Потом вычисляем коэффициент преобразования каждой координаты
(MAXscreen-MINscreen)/(MAXfun-MINfun)

Теперь просто значение функции по каждой оси умножается на коэффициент - получаем значение в координатах экрана

А афинные преобразования реально интересно применять при сложных случаях - трехмерность, повороты и т.д.

Автор: DENNN 2.4.2003, 16:52
Даже если предоставить пользователю возможность увеличивать часть графика или накладывать один на другой, то аффинные преобразования становятся удобны. Реализовав такой подход один раз его потом можно применять для разных целей не переделывая программу.

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