Графика в Си.
В графическом режиме в Си можно отображать на экране различные фигуры, строить изображения, реализовывать анимацию и компьютерные игры.
Чтобы работать в графическом режиме в Си, необходимо перейти в графический режим, инициализировав графическое окно си initwindow ( ширина окна, высота окна ); в котором и будут рисоваться изображения. После завершения работы с графикой, необходимо выйти из графического режима с помощью команды closegraph();
Структура программы с графикой в Си.
#include // подключение заголовочного файла с графическими функциями
#include
main()
initwindow ( 500, 500 ); // инициализировали и открыли окно размером 500 на 500
…рисуем графические объекты
getch(); // ждем нажатия клавиши
closegraph(); // закрываем графический режим
>
Основные графические объекты в си, такие как точка, линия, окружность, прямоугольник задаются с помощью системы координат. Система координат в графическом режиме Си задается следующим образом. Верхний левый угол экрана имеет координату x=0 и y=0.
Координата X задается слева направо. Т.е. чем больше X, тем правее точка.
Координата Y задается сверху вниз. Т.е. чем больше Y, тем ниже точка.
Максимальные X это ширина окна. Максимальное Y это высота окна.

Задание цвета изображения в Си
Чтобы задать цвет изображаемого объекта, используется оператор setcolor(номер цвета);
Таблица цветов в Си.
0 черный
1 синий
2 зеленый
3 морской волны
4 красный
5 фиолетовый
6 коричневый
7 светло-серый
8 темно-серый
9 светло-синий
10 светло-зеленый
11 светлый морской волны
12 светло-красный
13 светло-фиолетовый
13 светло-фиолетовый
14 желтый
15 белый
setcolor(4) ;// устанавливаем красный цвет
Отображение точки в Си.
Для рисования точки в графических программах си используется оператор
putpixel (x, y, номер цвета );
x, y – координаты точки
номер цвета – цвет, которым будет отображена точка
Отображение линии в Си
Для рисования отрезка в графических программах си используется оператор
x1, y1 – координаты одного конца отрезка
x2, y2 – координаты другого конца отрезка
Отображение окружности в Си
Для рисования окружности в графических программах си используется оператор
x, y – координаты центра окружности
r- радиус окружности
Пример. Отображение окружности белого цвета с центром 100, 100 и радиусом 20.
setcolor(15);// устанавливаем цвет рисования 15 — белый
circle(100,100, 20);// рисуем окружность с центром 100, 100 и радиусом 20
Отображение прямоугольника в Си.
Для рисования прямоугольной рамки в графических программах си используется оператор.
rectangle (x1, y1, x2, y2);
x1, y1 – координаты верхнего левого угла прямоугольника
x2, y2 – координаты нижнего правого угла прямоугольника
Чтобы задать цвет рамки необходимо предварительно установить цвет рисования с помощью оператора setcolor(номер цвета);
Для отображения закрашенного прямоугольника в Си используются два оператора.
setfillstyle ( 1, номер цвета );
bar (x1, y1, x2, y2);
x1, y1 – координаты верхнего левого угла прямоугольника
x2, y2 – координаты нижнего правого угла прямоугольника
Закрашивание ограниченной области в Си.
Чтобы закрасить определенным цветом целую ограниченную область в графической программе си используются два оператора.
setfillstyle (1, цвет закраски );
floodfill (x, y, цвет границы области);
x, y – координаты внутри области
цвет закраски – цвет , которым будет закрашиваться область
цвет границы области – цвет границы закрашиваемой области
Пример закрашенного кругав графических программах си
setcolor(15);// устанавливаем цвет рисования 15 — белый
circle(100,100, 20);// рисуем окружность с центром 100, 100 и радиусом 20
setfillstyle ( 1, 15 ); // устанавливаем цвет заполнения круга белый -15
floodfill (100, 100, 15); // заполняем окружность, указывая точку внутри ее – центр
Пример графической программы на си
Пример программы 17 графическая программа на си рисует автомобиль.
#include
#include
main()
initwindow(500, 500);// инициализируем графическое окно
// рисуем кузов
setfillstyle (1,4 ); // устанавливаем вид заливки 1 -полный, цвет заливки 4 — красный
bar(100, 150, 200, 170);// закрашенный прямоугольник нижняя часть кузова
bar(120, 150, 170, 130);// закрашенный прямоугольник верхняя часть кузова
// рисуем колеса
setcolor(15); // устанавливаем цвет колеса
circle(120, 170, 10); // левое колесо окружность ниже кузова
circle(170, 170, 10); // правое колесо окружность ниже кузова
setfillstyle (1,8); // устанавливаем вид заливки полный — 1 цвет серый — 8
floodfill(120,170,15); // закрашиваем круг левого колеса до границы круга цветом 15
floodfill(170,170,15); // закрашиваем круг левого колеса до границы круга цветом 15
getch(); // ждем нажатия кнопки
closegraph(); // выход из графического режима
>

Вернуться к содержанию
Перейти к следующему уроку Случайные числа в Си
Программа на си для построения графика функции
В этой статье мы разберем программу на языке программирования си для построения графиков функций. В нашей программе будут отражаться система координат с делениями и подписями на них и будут строиться графики двух функций, который может сам задать пользователь.
В программе на си для построения графика функции вводятся следующие константы
X0 , Y0 — координаты центра координат
k – масштаб одного деления на осях (сколько пикселов в одном делении)
Опишем все функции и процедуры используемые в программе для построения графиков функций
Подробно о задании функций и процедур в си
int osx (float x) переводит реальную координату на оси ox в координату экрана
int osy (float y) переводит реальную координату на оси oy в координату экрана
float F1 ( float x ) и float F2 ( float x ) задают функции , графики которых мы будем строить
void Point ( float x, float y, int color ) рисует точку графика функции на экране
Перед построением графиков функций необходимо построить систему координат. Для построения системы координат используется процедура
void Axes()
В этой процедуре в цикле for рисуются линии меток делений на равном расстоянии друг от друга, который определяется масштабом одного деления k и выводятся значения делений с помощью двух операторов
sprintf ( s, «%d», i ); // записываем в строковую переменную число деления
outtextxy ( xe-10, Y0+4, s ); // вывод числа
Процедура grafik1() и grafik2() строят графики функций f1 и f2
В этих процедурах в цикле for для всех доступных значений x определяется координата y и точка графика строится с помощью процедуры point()
Пример работы программы построения графиков на си, функции пользователь может менять

Программа на си для построения графиков функций
#include
#include //графический режим
#include // математические функции
//————————————————
const int X0 = 100, Y0 = 400;// координаты центра координат
const float k = 15;// масштаб в точках одного деления на графике
//——————————————
// перевод y в координаты экрана
//——————————————
int osx (float x)
return X0+k*x;
>
//——————————————
//перевод y в координаты экрана
//——————————————
int osy (float y)
return Y0-k*y;
>
// первая функция
float F1 ( float x )
return sqrt(2*x);
>
// вторая функция
float F2 ( float x )
return x*x/2;
>
// построение осей
void Axes()
int i, xe,ye,y1;
char s[10];
line ( X0, 0, X0, 599 ); // ось ox
line ( 0, Y0, 799, Y0 ); // ось oy
// метки на оси ox
for ( i = 1; i xe = osx ( i );
line ( xe, Y0-2, xe, Y0+2 ); // рисуем деление разметки
sprintf ( s, «%d», i ); // записываем в строковую переменную число деления
outtextxy ( xe-10, Y0+4, s ); // вывод числа
>
// метки на оси oy
for ( i = 1; i ye = osy( i+1 );
line ( X0-2, ye, X0+2, ye ); // рисуем деление
sprintf ( s, «%d»,i ); // записываем в строковую переменную число деления
outtextxy ( X0+10, ye+4, s ); // вывод числа
>
>
// построение точки графика функции
void Point ( float x, float y, int color )
int xe, ye;
xe = osx(x);
ye = osy(y);
if ( xe >= 0 && xe < 800 && ye >= 0 && ye < 600 )
putpixel(xe, ye, color);
>
// построение графика первой функции
void grafik1()
float x, h, xmin, xmax;
h = 1 / k;
xmin = (-X0)/ k;
xmax=(800-X0)/k;
for ( x = xmin; x Point(x, F1(x), WHITE);
>
>
// построение графика второй функции
void grafik2()
float x, h, xmin, xmax;
h = 1 / k;
xmin = (-X0)/ k;
xmax=(800-X0)/k;
for ( x = xmin; x Point(x, F2(x), WHITE);
>
>
// главная программа
main ()
initwindow ( 800, 600 ); // создать окно для графики
Axes(); // построение и разметка осей координат
grafik1(); // строим график первой функции
grafik2(); // строим график второй функции
getch(); // ждать нажатия на клавишу
closegraph(); // закрыть окно для графики
>
Полезно почитать по теме построение графиков функций в программа си
Графика в си
Процедуры и функции в си
Комментарии ( 0 )
Нет комментариев. Ваш будет первым!
Вывести на консоль график заданной функции

Вывести на консоль график заданной функции y=f(x) для x∈[a,b]. Входные параметры: действительные числа a, b. Предусмотреть расчет диапазона переменной y.
Вывод на консоль: символами: горизонтальная ось – символ «–», вертикальная ось – символ «!», точки графика – символ «*». Допускается выбирать разный масштаб по горизонтальной и вертикальной осям, если это оправдано с точки зрения наглядности. Предусмотреть подписи (сама функция, отрезок [a,b]) в удобном для пользователя, «читабельном» виде.
f(x)=√3x
На языке Си
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Вывести на экран точечный график заданной функции
. Написать программу, которая выводит на экран точечный график функции y=0,5^2+4x-3 . Диапазон.
Вывести график функции на консоль
Вывести на консоль график заданной функции y= f ( x) для x∈ . Входные параметры: действительные.
Вывести таблицу значений заданной функции (любой) и построить график ее производной
пришлите пожалуйста код программы, которая выводит таблицу значений заданной функции (любой) и.
Вывести на экран оси координат с засечками с шагом 1, и построить график заданной функции
написать программу, которая выводит на экран оси координат с засечками с шагом 1, и строит график.
Построение функций в консоли. Часть 2 (График)

В прошлый раз я остановился на построении таблицы значения функций. Пришла пора перейти к построению самого графика, ради чего все это, собственно, и начиналось.
Итак, основная идея состоит в следующем. Повернем координатную ось на 90 градусов по часовой стрелке. Это нужно для того, чтобы упростить построения, не храня данные о каждой точке в каком-нибудь листе.
Дальше ограничиваем координатную ось игрек 82 символами для лучшей читабельности графика. Понятно, что при этом мы теряем точность и график будет больше схематическим (слишком сжатым), особенно для «крутых» функций, но все же.
После этого мы высчитываем положение оси x относительно оси игрек, то есть ищем, в каком месте у нас будет точка (x, 0). Ну а потом построчно будем ставить в соответствие x значение функции y1 в этой точке.
Поехали
Для начала нам понадобится следующая формула:
Самому графику мы отведем 80 позиций, два оставшихся места будут чисто декоративными. Этой формулой мы находим, какой диапазон значений соответствует одной позиции в нашем графике. Тогда мы сможем правильно отметить на нем текущую точку.
Основные идеи обозначены, поэтому перейдем к самому коду
dial_length = 12 label = "График функции y1 = x**3 - 2*x**2 + 4*x - 8" print(">".format(len(label) + dial_length, label), '\n') print(">\n >>\n".format(aux = [dial_length + 82, 'y' , 82*'-']));
В том числе и благодаря комментариям к первой части, я узнал о такой штуке, как format. Мне она показалась действительно удобнее моих танцев с бубном, поэтому огромный кусок кода с вычисления отступов превратился в пару строк
print(">".format(len(label) + dial_length, label), '\n')
Единичка отвечает за номер элемента, переданного в качестве аргумента функции format, то есть это «ссылка» (не в буквальном смысле) на переменную label, которую мы собственно выводим на экран. Нумерация идет точно так же, как и в листах — с нуля.
Пара символов :> используется для того, чтобы выровнять выводимый на экран текст по правой стороне. Ну а после символа > нужен для того, чтобы определить то количество позиций строки, которое вам нужно.
То есть в данном случае мы резервируем для строки label len(label) + dial_length позиций, причем сам label занимает только len(label), и выравниваем внутри совокупности этих позиций текст по правой стороне.
print(">".format(len(label) + dial_length, label), '\n') print(dial_length*' ' + label, '\n')
эти строки эквивалентны
Да, для строк, наверное, проще использовать второй вариант, но применить первый для общего развития не помешает)
print(">\n >>\n".format(aux = [dial_length + 82, 'y' , 82*'-']));
В format можно запихивать даже массивы типа r_value (в C++), то есть созданные непосредственно при передаче аргумента.
Зафиксируем переменные, которые у нас постоянны, то есть они не зависят от текущего значения функции.
В питоне нет условного const для обозначения констант, поэтому принято называть такие переменные заглавными буквами и просто их не изменять.
MAX_Y1_VALUE_DIFFERENCE = (max_y1_value - min_y1_value) + \ (max_y1_value == min_y1_value) RATIO = MAX_Y1_VALUE_DIFFERENCE / 80 AXIS_X_POS = abs(int((- min_y1_value) / RATIO)) if (AXIS_X_POS > 80): AXIS_X_POS = 81
Так как RATIO по понятным причинам не может быть равно 0, MAX_Y1_VALUE_DIFFERENCE должно быть положительным числом. Именно для этого в правой части присваивания есть второе слагаемое.
Позицию оси икс мы высчитываем по формуле
Откуда берется эта формула? Мы просто высчитываем отношение отрезков (на оси игрек) от начала оси (min(y1)) до текущего значения функции (y1(x)) и отрезка от начала оси до ее конца (max(y1)). Ну и умножаем это отношение на 80, чтобы найти такое расстояние от начала оси до текущего значения в пробелах (поэтому можно использовать только целые числа), которое отразит отношение-формулу на графике.
Так как нас интересует позиция при y1(x) = 0, то подставляем в формулу необходимые значения и вуаля.
Теперь можно переходить непосредственно к печати значений
while (is_sequence_decreasing and from_x >= to_x) or \ (not is_sequence_decreasing and from_x
Цикл нам уже знаком. Придется второй раз посчитать каждое значение функции, чтобы не хранить их в листе или чём-то еще.
Позицию игрека вычисляем по выше приведенной формуле.
Верхнюю разность из формулы нам придется еще пофиксить, предусмотрев случай, когда в формуле будет получаться неопределенность вида ноль на ноль. Если такая неопределенность возникнет, то она будет означать, что текущее значение y1(x) = max(y1), а значит текущее значение игрека совпадет с концом оси y.
print(".6g>".format(dial_length, from_x), end='') if (negative_value_exists): if y1_cur_value = 0 + RATIO / 2: req_aux = pos_of_y - AXIS_X_POS if (req_aux != 0): print(AXIS_X_POS * ' ' + '|' + (req_aux - 1) * ' ' + '*') else: print((AXIS_X_POS) * ' ' + '|*') else: print(AXIS_X_POS * ' ' + '*') else: print('|' + pos_of_y* ' ' + '*') AXIS_X_POS = 0 from_x += pace_x print((dial_length + AXIS_X_POS) * ' ' + '|\n', (dial_length + AXIS_X_POS - 3) * ' ' + 'x V')
Эта часть кода непосредственно отвечает за печать самого графика
print(".6g>".format(dial_length, from_x), end='')
Здесь-таки format очень сильно пригодился и упростил код. ^ позволяет нам выровнять число по центру выделенной области (в данном случае, 12 позиций). g отвечает за числа — если у них нет дробной части, то печататься она и не будет (число как int), иначе — 6 знаков после запятой
Так как наш график ограничен пространством в 80 символов вдоль оси y, на нашем графике значение функции в точке будет совпадать с осью x не только в случае y1(x) = 0, но и в окрестности [0 — RATIO/2, 0 + RATIO/2].
Всего у нас есть три случая расположения звездочки (то есть точки) и вертикальной палки (то есть оси x): '*|' (y1(x) = 0 + RATIO/2), эти три случая и будем рассматривать.
- y1(x) В этом случае точка находится до оси x, поэтому мы ищем расстояние от точки до оси в пробелах. Из-за округления чисел может получится так, что значения переменных AXIS_X_POS и pos_of_y могут совпасть. Но такого быть не может, так как в этом случае мы бы попали в третий случай. У нас же точка не совпадает с осью х, поэтому необходимо дополнительное условие, которое будет уменьшать на 1 переменную pos_of_y в случае равенства.
- y(x) >= 0 + RATIO/2
Случай идентичен первому случаю, только точка будет расположена с другой стороны от оси х и все вышеописанные действия под это корректируются - остальное
Самый простой случай — просто печатаем звездочку на месте оси
Ну и завершаем программу дорисовкой оси x.
Итак, код, который в итоге получился:
dial_length = 12 label = "График функции y1 = x**3 - 2*x**2 + 4*x - 8" print(".6f>".format(dial_length, x_copy)) print(">".format(len(label) + dial_length, label), '\n') print(">\n >>\n".format(aux = [dial_length + 81, 'y' , 82*'-']), end=''); MAX_Y1_VALUE_DIFFERENCE = (max_y1_value - min_y1_value) + \ (max_y1_value == min_y1_value) RATIO = MAX_Y1_VALUE_DIFFERENCE / 80 AXIS_X_POS = abs(int((- min_y1_value) / RATIO)) if (AXIS_X_POS > 80): AXIS_X_POS = 81 while (is_sequence_decreasing and from_x >= to_x) or \ (not is_sequence_decreasing and from_x <= to_x): y1_cur_value = y1(from_x) cur_y1_value_and_min_difference = (y1_cur_value - min_y1_value) + \ (y1_cur_value == min_y1_value) * \ ((max_y1_value == min_y1_value)) pos_of_y = int(cur_y1_value_and_min_difference * 80 / \ MAX_Y1_VALUE_DIFFERENCE) print(".6g>".format(dial_length, from_x), end='') if (negative_value_exists): if y1_cur_value = 0 + RATIO / 2: req_aux = pos_of_y - AXIS_X_POS if (req_aux != 0): print(AXIS_X_POS * ' ' + '|' + (req_aux - 1) * ' ' + '*') else: print((AXIS_X_POS) * ' ' + '|*') else: print(AXIS_X_POS * ' ' + '*') else: print('|' + pos_of_y* ' ' + '*') AXIS_X_POS = 0 from_x += pace_x print((dial_length + AXIS_X_POS) * ' ' + '|\n', (dial_length + AXIS_X_POS - 3) * ' ' + 'x V')
Запустим программу на нескольких тестах