Оболочка для рисования графиков функции одной переменной.
Пояснительная записка к курсовому проекту
По дисциплине «Программирование на языках высокого уровня»
Студент: | |
Группа: | |
Преподаватель: | Трофимов С.П. |
Екатеринбург
содержание
Введение.. 3
1.Постановка задачи.. 4
2. Теоретическая часть.. 4
2.1. Графическая и математическая системы координат. 5
3. Инструкция пользователя.. 5
3.1. Программные файлы.. 7
3.2. Работа программы.. 7
4. Инструкция программиста.. 7
4.1. Глобальные переменные. 8
4.2. Макроподстановки.. 8
4.3. Функции.. 8
5. Тестирование.. 12
Библиографический список. 13
Приложение: листинг.. 15
Введение
Задача построения графика определенной функции играет немалую роль в наше время. Такое представление зависимости функции от аргумента в наше время используется в самых разнообразных отраслях науки, техники и экономики. Графики используют, чтобы наглядно показывать эти зависимости, искать закономерности или наоборот находить отклонения.
В действительности существует довольно много хороших программ, строящих графики. Примерами таких программ являются: Microsoft Excel, MathCAD, MATLAB. Эти приложения являются мощными математическими программами, поддерживающими не только построение графиков, но и другие математические функции, что обеспечивает удобную и продуктивную работу с данными.
Постановка задачи
Необходимо создать приложение, которое получает некоторую функцию одной переменной, написанную на языке Си или заданную в объектной форме с прототипом float f(float x). Рисуется график этой функции вначале на некотором отрезке. Затем с клавиатуры график можно перемещать влево – вправо, вверх – вниз, изменять масштабирование по осям x и y. В случае выхода переменной х из диапазона функции f(x) график не рисуется. Предусмотреть возможность рисования нескольких графиков в одной системе координат с выбором цветов и маркеров линий.
|
Теоретическая часть
Графическая и математическая системы координат.
Для рисования графика функции программисту удобнее использовать математическую систему координат (МСК), расположенную по центру экрана. Графические функции работают в графической системе координат (ГСК).
а б
Рис. 1. Системы координат:
а – математическая; б – графическая
Инициализируем переменные.
int maxx = getmaxx(),
maxy = getmaxy(),
px = 30, // количество пикселей в одной математической единице по оси Ох
py = px * ((float)maxx/maxy); // количество пикселей в одной математической единице по оси Оy.
Соответствие между двумя системами координат представлено
ниже
Соответствие между МСК и ГСК
МСК | ГСК |
(0, 0) ………………………………. | (maxx / 2, maxy / 2) |
(1, 0) ………………………………. | (maxx / 2 + px, maxy / 2) |
(0, 1) ………………………………. | (maxx / 2, maxy / 2 – py) |
(x, y) ….……………………………. | (maxx / 2 + x px, maxy / 2 – y py) |
(x, f(x)) ……………………………. | (maxx / 2 + x px, maxy / 2 – f(x) py) |
Реализуем масштабирование по оси координат Ох так, чтобы график функции y = f(x) на заданном отрезке [a, b] размещался по всей ширине экрана. Для этого найдем коэффициенты u и v линейного отображения g(x) = u x + v, при котором отрезок [a, b] переходит в отрезок
[0, maxx]. Из системы линейных уравнений
u a + v = 0
u b + v = maxx
находим u = maxx / (b-a), v = -a maxx / (b-a). Тогда точке (x, f(x)) будет соответствовать пиксель
|
((maxx / (b-a)) * x - a * maxx / (b-a), maxy / 2 - f(x) * py)),
где py = maxx/(b-a). Затем график можно нарисовать с помощью цикла, в котором счетчик является вещественной математической переменной. Например:
for(float x = a; x <= b; x += (b-a) / maxx)
putpixel((maxx / (b-a)) * x - a * maxx / (b-a), maxy / 2- f(x) * py));
Данный цикл при больших a и b может оказаться бесконечным. Это возможно в случае, если шаг цикла (b-a) / maxx будет меньше расстояния между числом a и его ближайшим соседом справа для типа float.
Инструкция пользователя
Программные файлы
KK.exe - исполняемый файл, предназначенный для запуска приложения.
Работа программы
Программа просит пользователя ввести координаты отрезка [a,b], на котором будет построен график функции f(x)=cos(x). Также пользователь задает цвет графика и маркеры, которыми он будет построен. Исходя из данных, программа рисует систему координат и расставляет значения по осям. Дальше с помощью цикла перебираются значения переменной х на отрезке [a,b] и для них считается соответствующее значение функции(й). По полученным координатам на экране в соответствующих точках ставятся маркеры либо точки, образуя график. После этого программа ждет от пользователя дальнейших указаний.
Для работы с графиком функции можно использовать стрелки на клавиатуре, а также клавиши “w”,”a”,”s”,”d”. Стрелками можно двигать график во все стороны. Клавиши “a” и “d”, отвечают за растяжение и сжатие графика функции по оси Ох. Клавиши “w” и “s” отвечают за растяжение и сжатие графика функции по оси Оу. Для завершения работы с графиком необходимо нажать на клавишу “Esc”.
4. Инструкция программиста
|
Глобальные переменные
int ODZflag – глобальная переменная, хранящая ОДЗ (1 – выход из ОДЗ, 0 – значение функции не выходит за пределы ОДЗ).
int o – глобальная переменная, хранящая количество сжатий/растяжений по оси Ох.
int counter – глобальная переменная, хранящая количество сжатий/растяжений по оси Оу.
Макроподстановки
SDVIG 50 – количество пикселей, на которое мы сдвигаем значения на оси Оу, чтобы они не накладывались на ось
DEL 10 – количество делений, на которое делится ось Ох
TWO 2 – константа, которая используется для вычислений
ESC 27 - ASCII-код символа esc (Escape, ключ)
Down 80 – скан-код клавиши ↓
Left 75 – скан-код клавиши ←
Up 72 – скан-код клавиши ↑
Right 77 – скан-код клавиши →
keyw 119 – ASCII-код символа «w»
keys 115 – ASCII-код символа «s»
keya 97 – ASCII-код символа «a»
keyd 100 – ASCII-код символа «d»
minus 45 – ASCII-код символа «-»
ENTER 13 – ASCII-код символа CR (Carriage Return, возврат каретки)
TURN 48 – константа, которая используется для вычислений
Функции
1. int Vvod(float *a, float *b);
Функция просит пользователя ввести значения границ отрезка [a,b] и изменяет значения по указателям, а также определяет количество графиков.
Функция получает:
1. float *a – указатель на переменную типа float;
2. float *b – указатель на переменную типа float.
Функция изменяет:
Границы отрезка [a,b].
Функция возвращает:
1. 1 – в случае, когда пользователь задает 2 графика;
2. 0 – в случае, когда пользователь задает 1 график.
2. void Marker(int V, int *fg, int *sg, int *c1,int *c2);
Функция просит пользователя выбрать маркеры и цвета и изменяет значения по указателям.
Функция получает:
1. int V – значение определяющее количество графиков;
2. int *fg – указатель на переменную типа float;
3. int *sg– указатель на переменную типа float;
4. int *c1– указатель на переменную типа int;
5. int *c2– указатель на переменную типа int.
Функция изменяет:
Тип маркера и его цвет для каждого из графиков.
Функция возвращает:
1. ничего.
3. void Points(float fun,float a,float b,float x,float shift,float k,int c, float A,float B);
Функция осуществляет построение графика точками.
Функция получает:
1. float fun – значение функции в точке;
2. float b - конец отрезка;
3. float x – значение переменной;
4. float shift – сдвиг по оси Оу;
5. float k – коэффициент масштабирования по оси Оу;
6. float A – не меняющееся начало отрезка;
7. float B – не меняющийся конец отрезка;
8. int с - цвет.
Функция возвращает:
1. ничего.
3. float otobr(float a,float b,float x)
Функция осуществляет отображение значения x на графическую систему координат.
Функция получает:
1. float a - границу a отрезка [a,b];
2. float b – границу b отрезка [a,b];
3. float x – значение х.
Функция возвращает:
1. Координату переменной х в графической системе координат;
5. void Strokes(float fun,float a,float b,float x,float shift,float k,int c, float A,float B)
Функция осуществляет построение графика плюсами.
Функция получает:
1. float fun – значение функции в точке;
2. float b - конец отрезка;
3. float x – значение переменной;
4. float shift – сдвиг по оси Оу;
5. float k – коэффициент масштабирования по оси Оу;
6. float A – не меняющееся начало отрезка;
7. float B – не меняющийся конец отрезка;
8. int с - цвет.
Функция возвращает:
1. ничего.
6. void Stars(float fun,float a,float b,float x,float shift,float k,int c,float A, float B)
Функция осуществляет построение графика звездами.
Функция получает:
1. float fun – значение функции в точке;
2. float b - конец отрезка;
3. float x – значение переменной;
4. float shift – сдвиг по оси Оу;
5. float k – коэффициент масштабирования по оси Оу;
6. float A – не меняющееся начало отрезка;
7. float B – не меняющийся конец отрезка;
8. int c – цвет.
Функция возвращает:
1. ничего.
7. void Squares(float fun,float a,float b,float x,float shift,float k,int c,float A,float B)
Функция осуществляет построение графика квадратами.
Функция получает:
1. float fun – значение функции в точке;
2. float b - конец отрезка;
3. float x – значение переменной;
4. float shift – сдвиг по оси Оу;
5. float k – коэффициент масштабирования по оси Оу;
6. float A – не меняющееся начало отрезка;
7. float B – не меняющийся конец отрезка;
8. int c – цвет.
Функция возвращает:
1. ничего.
8. float Kswitcher(int j);
Функция считает коэффициент сжатия/растяжения по оси Оу.
Функция получает:
1. int j – количество нажатий кнопок «w» и «s».
Функция возвращает:
1. Значение коэффициента сжатия/растяжения.
9. void Mashtab(float *a,float *b,int *i,float *shift,float *A,float *B,int *j)
Функция осуществляет масштабирование и сдвиг графика, а также выход из графического режима.
Функция получает:
1. float *a – указатель на переменную типа float;
2. float *b – указатель на переменную типа float;
3. float *shift – указатель на переменную типа float;
4. float *A – указатель на переменную типа float;
5. float *B – указатель на переменную типа float;
6. int *i – указатель на переменную типа int;
7. int *j – указатель на переменную типа int;
Функция изменяет:
Границы отрезка [a,b], сдвиг, переменную i, указывающую на выход из цикла, и переменную j, показывающую, как изменяется коэффициент сжатия/растяжения по оси Оу.
Функция возвращает:
1. ничего.
10. void IniGraph()
Функция осуществляет инициализацию графического режима.
Функция получает:
1. ничего.
Функция возвращает:
1. ничего.
11. float fun1(float x)
Функция считает значение функции в точке.
Функция получает:
1. float x – аргумент функции.
Функция возвращает:
Значение функции в точке.
12. float fun2(float x)
Функция считает значение функции в точке.
Функция получает:
1. float x – аргумент функции.
Функция возвращает:
Значение функции в точке.
13. void SisCoord(float a,float b,float shift,float A,float B,float k)
Функция осуществляет построение систем координат а также, расставляет значения по осям.
Функция получает:
1. float a – начало отрезка;
2. float b – конец отрезка;
3. float shift – сдвиг по оси Оу;
4. float A – не меняющееся начало отрезка;
5. float B – не меняющийся конец отрезка;
6. float k –коэффициент растяжения/сжатия по оси Оу.
Функция возвращает:
1. ничего.
Тестирование
1. Задаем входные параметры для программы:
Программа автоматически меняет значения местами, если их задали неправильно и строит графики. К сожалению клавиша Print Screen не сработает правильно в графическом режиме.