Как вывести график на си
Перейти к содержимому

Как вывести график на си

  • автор:

 

Как вывести график на си

Программирование графических приложений- отдельная, большая тема, подробное изложение которой выходит за рамки поставленной нами задачи — ознакомления читателя с основами изучаемого языка. И тем не менее, на наш взгляд, описание возможностей любого языка программирования без хотя бы одного примера работы с графикой, пусть и самой простой, было бы неудовлетворительно.
Для языка С существует много специальных графических библиотек функций, работающих с графикой. Для примера воспользуемся функциями, разработанными фирмой Borland для своего языка С/С++ версии 3.1. Приведем вариант программы, строящей на экране график функции Y=X*sin(X) в интервале от Х=0 до Х=10:

Как вывести график на си

//axes4(int x0,int y0,int xmin,int ymin,int xmax,int ymax,int bc,int gc,int fc,int ax);//constructor
//axes(int,int,int,int,int,int,int,int,int,int,int,int);

axes()
<
x0=y0=20;
xmin=-120;xmax=120;
ymin=-100;ymax=100;
bc=12;
gc=10;
fc=7;
zoom=1;
grdstp=1;
fstp=zoom/10.0;
gstp=1/fstp*grdstp;
ax=1;
a=1;
b=16;
c=8;
> //end of constructor */
void draw_grid();
void draw_function();
void clear();
>; //end of class

void graphit (char *path)
<
int gd, gm , err ;
gd = 9 ;
gm = 2 ;

initgraph (&gd, &gm, path);

err = graphresult();
/* an error occurred */
if (err != grOk)
<
printf("Graphics error: %s\n", grapherrormsg(err));
printf("Press any key to halt:");
getch();
exit(1);
>
>
void axes::init()
<
xcent=x0-xmin;
ycent=y0+ymax;
xend=xcent+xmax;
yend=ycent-ymin;
fstp=zoom/1.0;
gstp=18/fstp*3.141592*grdstp;

>
void axes::clear()
<
init();
setfillstyle(1,0);
bar(x0,y0,xend,yend);
>
void axes::draw_grid()
<
init();
if(xend>639) //.
xend=639; //.
if(yend>479) //.
yend=479; //.
setcolor(bc);
rectangle(x0,y0,xend,yend);
setcolor(fc);
if(ycent>y0&&ycent<yend)
line(x0,ycent,xend,ycent);
else
<
setcolor(fc-2);
if(ycent<=y0)
line(x0,y0,xend,y0);
else
line(x0,yend,xend,yend);
>
setcolor(fc);
if(xcent>x0&&xcent<xend)
line(xcent,y0,xcent,yend);
else
<
setcolor(fc-2);
if(xcent<=x0)
line(x0,y0,x0,yend);
else
line(xend,y0,xend,yend);
>
if(gstp<2)
gstp=0;
if(gstp&&ax)
<
for(x=-xmin%gstp+x0;x<xend;x+=gstp)
for(y=ymax%gstp+y0;y<yend;y+=gstp)
if(x>x0&&y>y0)
putpixel(x,y,gc);
>
>

void axes::draw_function()
<
int sign;
init();
for(x=xmin,xt=xmin*fstp;x<=xmax;x++,xt+=fstp)
<
y=sin((3.141592/180)*xt)*180/3.141592;//a*pow(xt,2)+b*xt+c;
yt=sin((3.141592/180)*(xt+fstp))*180/3.141592;//a*pow((xt+fstp),2)+b*(xt+fstp)+c;
sign=y<yt?1:-1;
while(y*sign<yt*sign)
<
if(y/fstp>ymin&&y/fstp<ymax)
<
putpixel(x+xcent,ycent-y/fstp,4);
//delay(1);
>
y+=sign*fstp;
>
>
>

Добавлено
вот вариант на си с тебя пиво

void graphit (char *path)
<
int gd, gm , err ;
gd = 9 ;
gm = 2 ;

initgraph (&gd, &gm, path);

err = graphresult();
/* an error occurred */
if (err != grOk)
<
printf("Graphics error: %s\n", grapherrormsg(err));
printf("Press any key to halt:");
getch();
exit(1);
>
>
void init()
<
xcent=x0-xmin;
ycent=y0+ymax;
xend=xcent+xmax;
yend=ycent-ymin;
fstp=zoom/1.0;
gstp=18/fstp*3.141592*grdstp;

>
void clear()
<
init();
setfillstyle(1,0);
bar(x0,y0,xend,yend);
>
void draw_grid()
<
init();
if(xend>639) //.
xend=639; //.
if(yend>479) //.
yend=479; //.
setcolor(bc);
rectangle(x0,y0,xend,yend);
setcolor(fc);
if(ycent>y0&&ycent<yend)
line(x0,ycent,xend,ycent);
else
<
setcolor(fc-2);
if(ycent<=y0)
line(x0,y0,xend,y0);
else
line(x0,yend,xend,yend);
>
setcolor(fc);
if(xcent>x0&&xcent<xend)
line(xcent,y0,xcent,yend);
else
<
setcolor(fc-2);
if(xcent<=x0)
line(x0,y0,x0,yend);
else
line(xend,y0,xend,yend);
>
if(gstp<2)
gstp=0;
if(gstp&&ax)
<
for(x=-xmin%gstp+x0;x<xend;x+=gstp)
for(y=ymax%gstp+y0;y<yend;y+=gstp)
if(x>x0&&y>y0)
putpixel(x,y,gc);
>
>

void draw_function()
<
int sign;
init();
for(x=xmin,xt=xmin*fstp;x<=xmax;x++,xt+=fstp)
<
y=sin((3.141592/180)*xt)*180/3.141592;//a*pow(xt,2)+b*xt+c;
yt=sin((3.141592/180)*(xt+fstp))*180/3.141592;//a*pow((xt+fstp),2)+b*(xt+fstp)+c;
sign=y<yt?1:-1;
while(y*sign<yt*sign)
<
if(y/fstp>ymin&&y/fstp<ymax)
<
putpixel(x+xcent,ycent-y/fstp,4);
//delay(1);
>
y+=sign*fstp;
>
>
>

void main()
<
char ch=' ';
int step=1;
// axes m[2];//(10,50,-100,-60,120,130,10,14,4,3,1);
graphit (bgipath) ;
x0=300;
y0=50;

xmin=-100;//left[-100];
xmax=100;//right[i];
ymin=-100;//down[i];
ymax=100;//up[i];
zoom=10;//zom[i];
draw_grid();
draw_function();

while((ch=getch())!='q')
<
switch(ch)
<
case 'e':ymax-=step;ymin-=step;break;
case 'x':ymax+=step;ymin+=step;break;
case 'd':xmin-=step;xmax-=step;break;
case 's':xmin+=step;xmax+=step;break;
case '6':zoom+=.1;break;
case '5':if(zoom>0.1)zoom-=.1;break;
case '7':if(step) step—;break;
case '8':step++;break;
case 'h':ymax=100;ymin=-100;xmin=-100;xmax=100;break;
case 'o':if(grdstp>1)grdstp—;break;
case 'p':grdstp++;
>

Код:

for(x=-xmin%gstp+x0;x<xend;x+=gstp) <
line(x,ycent-5,x,ycent+5);
>

вертикальные уж сам нарисуешь . с цифирьками не сложнее, но там нужно высчитывать когда их нужно перестать отображать, по тому как в определенный момент они будут налазить на друг друга
ln? да там все по аналогии, то что нужно учитывать что нет ln отрицательного числа

Код:

if(xt+1<=0) <
continue;
>

а то оно начинает рисовать с момента когда х=0, а не с х=-1

 

for(x=xmin,xt=xmin*fstp; x<=xmax; x++,xt+=fstp) <
if(xt-1<=0)
continue;

Код:

if(ycent>y0&&ycent<yend)
line(x0,ycent,xend,ycent); //если горизонтальная ось "находится" в окне
else
<
setcolor(fc-2);
if(ycent<=y0)
line(x0,y0,xend,y0); //если "выше" окна верхняя грань "окна" помечается другим цветом
else
line(x0,yend,xend,yend);// если "ниже" окна помечается нижняя грань
>
setcolor(fc);
if(xcent>x0&&xcent<xend)
line(xcent,y0,xcent,yend); //аналогично вертикальная ось
else
<
setcolor(fc-2);
if(xcent<=x0)
line(x0,y0,x0,yend);
else
line(xend,y0,xend,yend);
>

for(x=xmin+jmp,xt=xmin*fstp; x<=xmax-jmp; x++,xt+=fstp) <
y = sin((3.141592/180)*xt)*180/3.141592;
yt = sin((3.141592/180)*(xt+fstp))*180/3.141592;
sign = y < yt ? 1 : -1;

while(y*sign<yt*sign) <
if(y/fstp>ymin && y/fstp<ymax) <
putpixel(x+xcent,ycent-y/fstp,4);
//delay(1);
>

Линии лучше рисовать от центра, иначе отрезки с учетом осей будут различны:в
как я сделал:

Программа на си для построения графика функции

В этой статье мы разберем программу на языке программирования си для построения графиков функций. В нашей программе будут отражаться система координат с делениями и подписями на них и будут строиться графики двух функций, который может сам задать пользователь.
В программе на си для построения графика функции вводятся следующие константы
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 <stdio.h>
#include <graphics.h> //графический режим
#include <math.h> // математические функции

//————————————————
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 <= (800-X0)/k; 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 <= (Y0)/k; 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 <= xmax; x += h )
<
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 <= xmax; x += h )
<
Point(x, F2(x), WHITE);
>
>
// главная программа
main ()
<
initwindow ( 800, 600 ); // создать окно для графики
Axes(); // построение и разметка осей координат
grafik1(); // строим график первой функции
grafik2(); // строим график второй функции
getch(); // ждать нажатия на клавишу
closegraph(); // закрыть окно для графики
>
Полезно почитать по теме построение графиков функций в программа си
Графика в си
Процедуры и функции в си

Работа с графикой на языке C и модуль graphics.h

Монитор ПК может работать в двух режимах текстовый и графический. В этих режимах по разному представляется видео память. Переход из режима в режим очищает экран. В графическом режиме необходимо пользоваться функциями из графической библиотеки graphics.h .

Типы видео мониторов и их режимы

Существует много типов мониторов, на каждом из которых доступны кроме своего режима, и все более низкие режимы. Под режимом понимается разрешающая способность количество цветов. Кроме того мониторы делятся по аппаратной реализации: ЦИФРОВЫЕ и АНАЛОГОВЫЕ.

Остальные стандартные типы являются мало употребительными или повторяют более слабые режимы. Режимы SVGA не являются стандартными, хотя драйвера для них иногда и встречаются, но не входят в комплект Borland Си. Положение ухудшает и большое разнообразие особенностей SVGA карт выпускаемыми разными фирмами, не придерживающихся одинакового формата.

Инициализация графики

initgraph(int *GrDr,int *GrMod,char *Path) ;

Функция initgraph(. ) инициализирует графический режим. В параметрах ей передается:

GrDr — Тип графического монитора, или DETECT — Определить максимально возможный. Тип установленного оборудования возвращается в этих же переменных (поэтому они и передаются указателем).

Path — Путь до файлов *.bgi — драйверов графических режимов. Если указанно » » — то в текущем каталоге.

Значения и имена можно взять из предыдущей таблицы.

Функция graphresult() — возвращает код ошибки инициализации графики (недопустимый графический режим, не найден файл *.bgi и т.п.). Если все в порядке функция возвращает значение grOk. Проверку правильного выполнения функции initgraph(. ) обязательно надо производить, так как, если графический режим не установлен, выполнение любой графической команды приведет к аварийному останову программы.

Функция closegraph() обеспечивает корректное возвращение в текстовый режим. Ее выполнение, как говорилось раньше, очищает экран. При необходимости вставляйте задержку до нажатия клавиши: getch(). Внимание!

Работа с графикой возможна только в моделях памяти >= medium, это устанавливается в опциях компилятора. Для работы с библиотекой графики ее необходимо подключить. В опциях Си: Option\Linker\Libriry\Graphics: X

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *