1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
//C++ 3.1 Листинг #1 MS-DOS Рисование графика функции y = x * x Подготовка #include <iostream.h> #include <conio.h> int main(){ clrscr(); int y; int x; int start = -500; int end = 500; for (int i=start; i<end; i++){ y = x * x; } cin.get(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
//C++ 3.1 Листинг #2 MS-DOS Рисование графика функции y = x * x Подготовка #include <iostream.h> #include <conio.h> int main(){ clrscr(); const unsigned MAX = 1000; int y[MAX]; int x; int start = -500; int end = 500; unsigned index = 0; //позиция индекса for (int i=start; i<end; i++){ y[index] = x * x; index++; } cin.get(); } |
1 2 |
int OX = getmaxx()/2; int OY = getmaxy()/2; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
//C++ 3.1 Листинг #3 MS-DOS Рисование графика функции y = x * x #include <iostream.h> #include <conio.h> #include <graphics.h> #include <math.h> int main(){ clrscr(); double start = -15; double end = 16; const unsigned MAX = fabs(start) + fabs(end); double *y = new double[MAX]; //вычисляемая ёмкость, из-за этого выделяем память массиву /*Блок вычисления значений для записи их в массив*/ unsigned index = 0; for (int i=start; i<end; i++){ y[index] = (i * i * -1); //y[index] = sin(i) * 100 * -1; index++; } /*Работа в графическом режиме*/ int gr = DETECT, gm; initgraph(&gr, &gm, ""); double OX = getmaxx()/2; //Получаем координаты центра экрана double OY = getmaxy()/2; /*Это не особо важный кусок кода. Сделан для красоты: ось ординат*/ setcolor(RED); setlinestyle(DOTTED_LINE,1,1); line(0, getmaxy()/2, getmaxx(), getmaxy()/2); line(getmaxx()/2, 0, getmaxx()/2, getmaxy()); setlinestyle(SOLID_LINE,1,1); setcolor(WHITE); /*Начало рисования*/ moveto(abs(start) - OX, y[0] + OY); //Сначала устанавливаем курсор в точку начала; туда, откуда будем тянуть линию. for (i=0; i<MAX; i++){ lineto((i+OX-abs(start)), y[i]+OY); //Тянем линию } cin.get(); closegraph(); delete []y; return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
//C++ 3.1 Листинг #4 MS-DOS Рисование графика функции y = x * x #include <iostream.h> #include <conio.h> #include <graphics.h> #include <math.h> int main(){ clrscr(); double start = -150; //Начальная точка по X double end = 151; //Конечная точка по X int stepx = 15; //Добавили шаг для хода по оси X int stepy = 15; //Добавили шаг для хода по оси Y const unsigned MAX = fabs(start) + fabs(end); //Вычисляемое значение для задания ёмкоси массиву точек double *y = new double[MAX]; //Создаём массив нужной ёмкости unsigned index = 0; for (int i=start; i<end; i++){ y[index] = (i * i * -1); //С помощью формулы вычисляем значения и записываем их в массив //y[index] = sin(i) * -1; //так можно нарисовать y=sin(x) index++; } int gr = DETECT, gm; initgraph(&gr, &gm, ""); double OX = getmaxx()/2; //Находим точки центра экрана double OY = getmaxy()/2; //Эта часть кода только для нарисования оси ординат setcolor(RED); setlinestyle(DOTTED_LINE,1,1); line(0, getmaxy()/2, getmaxx(), getmaxy()/2); line(getmaxx()/2, 0, getmaxx()/2, getmaxy()); setlinestyle(SOLID_LINE,1,1); setcolor(WHITE); //Эта часть для рисования графика int dx = stepx; //Определяемся с шагом по каждой из осей int dy = stepy; int y_; //это точка по Y (сам массив с точками, т. е. y[] менять неправильно, следует использовать доп.переменную) moveto(OX - fabs(start) * dx, y[0] + OY); //устанавливаемся в точку начала рисования графика double x = fabs(start) * -dx; //учитывая, что у нас есть шаг, корректируем позицию стартовой точки for (i=0; i<MAX; i++){ y_ = y[i] * dy; //для вычисленного y корректируемся на шаг, определённый для Y lineto(x+OX, y_+OY); //проводим линию x+=dx; //делаем шаг по X } cin.get(); closegraph(); return 0; } |
Спасибо! пишите дальше
Материал гавно
😳 😳 😳 ❓ ❓ ❓ ❓
Чем меньше у нас Х , тем больше точек на линии мы получаим, соответсвенно больше точек = точнее график =)
вернее больше точек с координатами (x*50+getmaxx()/2, getmaxy()/2-(y*20)) поместятся на мониторе.
тут выбрано что в единичном отрезке по Ox помещается 50 пикселей. а шаг по параметру выбран таким образом чтобы для каждого пиксела оси х (0.02*50=1 пиксел) рассчитывался y.
#include не находит пишет то ошибка что делать ??? 😥
этот пример для Borland C++ 3.1
наверное нужно другой пример искать.
Не работает. Много ошибок.
Наверное другой компилятор, поэтому не работает.
А warning — это предупреждение, а не ошибка.
У меня BC і всё работает
Наверное другой компилятор, потому не работает. Мой этот пример только для BC++ 3.1
Вот например, вы обьявили переменную флоат. И передаете ее значение в функцию moveto(), но эта функция может принимать только целые значения. Тоже самое с функцией lineto()
Здесь выдается предупреждение, обозначающее возможную потерю данных. Переменная будет преобразована в целочисленную и просто всю дробную часть у нее убьет. Вам надо про преобразования типов читать. (Здесь неявное)
Удобный код. И для Dev-C сгодился (версия 4.9.9.2)
Позволю себе дать пояснения по коду:
Помним, нам нужен график функции y=x*x, и в коде выполняется вычисление y=x*x.
Но при организации рисования графика, вместо lineto(x,y), имеем
lineto(x*50+getmaxx()/2, getmaxy()/2-(y*20)).
Что это за «дополнительные элементы»?
Дело в том, что система координат графического окна строго фиксирована, она соответствует только первой четверти математической декартовой системе. Это значит что на экране, без «дополнительных элементов» мы сможем смотреть только на одну ветвь графика – в положительной части оси ОХ. ( Привычный, математический центр системы декартовых координат на экране размещается в верхнем левом углу графического окна).
И при этом график будет зеркально отображён вниз – по той причине, что у мониторов считается обратное (по сравнению с математической) направление оси ОУ.
Итак: чтобы преодолеть технические ограничения «компьютерной системы координат» нужно:
1) повернуть ось ОУ в обратную сторону (просто умножить У на -1)
2)сдвинуть центр в середину экрана (прибавить к Х и У половину от ширины и высоты окна)
3)задать масштаб построения графика (применить коэффициенты умножения для Х и У).
Вот теперь думаю всё понятно:
getmaxx() – функция, которая определяет ширину графического окна ,
getmaxy() – функция, которая определяет высоту графического окна.
50 – множитель масштаба по оси ОХ,
20 – множитель масштаба по ОУ.
А знак минус, перед значением (у*20), ориентирует график на экране в привычном для человека направлении.
Может автору поста это уже не актуально — но кто-то же ищет подобную инфу.. я же вот искал…