» Как нарисовать график функции в СИ (compiler — bcc OR lcc)
Код:
#include <stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<graphics.h>
#include<math.h>
#include<dos.h>
//#define bgipath "a:\\bgi"
#define bgipath "d:\\borlandc\\bgi"
class axes
<
private:
int xcent,ycent,xend,yend;
float x,xt,y,yt,a,b,c;
void init();
public:
int x0,y0;//nachalo otnositel`no (0,0) ekrana
int xmin,ymin;//nachlo okna otnositelno (x0,y0)
int xmax,ymax;//konec""""""""""""""""
int bc,gc,fc;//border color,grid color,fill color
int gstp;//zoomgrid step
int grdstp; //grid step
float fstp; //func step
float zoom; //zoom
int ax;//show grid on/off
//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;
>
>
>
while(ch!='q')
<
ch=getch();
switch(ch)
<
case 'e':up[pres]-=step[pres];down[pres]-=step[pres];break;
case 'x':up[pres]+=step[pres];down[pres]+=step[pres];break;
case 'd':left[pres]-=step[pres];right[pres]-=step[pres];break;
case 's':left[pres]+=step[pres];right[pres]+=step[pres];break;
case '6':zom[pres]+=.1;break;
case '5':if(zom[pres]>0.1)zom[pres]-=.1;break;
case '7':if(step[pres]) step[pres]—;break;
case '8':step[pres]++;break;
case 'h':up[pres]=100;down[pres]=-100;left[pres]=-100;right[pres]=100;break;
case '1':pres=0;break;
case '2':pres=1;break;
case 'o':if(grdstp[pres]>1)grdstp[pres]—;break;
case 'p':grdstp[pres]++;
>
m[pres].grdstp=grdstp[pres];
m[pres].xmin=left[pres];
m[pres].xmax=right[pres];
m[pres].ymin=down[pres];
m[pres].ymax=up[pres];
m[pres].zoom=zom[pres];
m[pres].clear();
m[pres].draw_grid();
m[pres].draw_function();
>
getch();
>
у меня 3й борланд в нем нужно зайти в options->linker->libraries и отметить graphics library
как избавиться от класов? тебе вероятней всего нужны будут 2 функции, это draw_function() она рисует сам график и draw_grid() она рисует сетку и "окно" весь "основной код" находится в них. они тянут много переменных, но там вроде подписано что делает каждый из них и их можно сделать глобальными
Добавлено
вот вариант на си с тебя пиво
Код:
#include <stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<graphics.h>
#include<math.h>
#include<dos.h>
//#define bgipath "a:\\bgi"
#define bgipath "d:\\borlandc\\bgi"
int xcent,ycent,xend,yend;
float x,xt,y,yt;
int x0=20,y0=20;//nachalo otnositel`no (0,0) ekrana
int xmin=-120,ymin=-100;//nachlo okna otnositelno (x0,y0)
int xmax=120,ymax=100;//konec""""""""""""""""
int bc=12,gc=10,fc=7;//border color,grid color,fill color
int grdstp=1; //grid step
float zoom=1; //zoom
float fstp=zoom/10.0; //func step
int gstp=1/fstp*grdstp;//zoomgrid step
int ax=1;//show grid on/off
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++;
>
rew
Большое СПАСИБО. В коде я пока не разбирался, пишу сейчас совсем другое (определение CRC, контрольных сумм).
Как сделать не точки на осях, а черточки — засечки с подписями цифр под ними?
Как нарисовать функцию ln(1+x)?
Код:
for(x=-xmin%gstp+x0;x<xend;x+=gstp) <
line(x,ycent-5,x,ycent+5);
>
угу нужно писать
rew
Однако график получается правильным в случае:
Код:
void draw_function(void) <
int sign;
for(x=xmin,xt=xmin*fstp; x<=xmax; x++,xt+=fstp) <
if(xt-1<=0)
continue;
y = log(xt-1);
yt = log(xt+fstp-1);
zam
может быть я на точность для всех функций не претендую — для синуса и параболы, то что мне нужно было отобразить, вроде работало нормально
Код:
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);
>
Код:
void draw_function(void) <
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);
>
Вывод графика функции на консоль
Как реализовать вывод графика в консоль с использованием массивов?
Как реализовать вывод графика в консоль с помощью массивов? #include <iostream> #include.
Вывод графика функции
Здравствуйте. Помогите пожалуйста создать программу вывода на форме графиков функции. Должно быть.
Вывод графика функции
построить программу, которая позволяет решать задачу одномерной оптимизации (для написания.
Сообщение было отмечено sice111 как решение
Решение
Тестировалась на Tiny C Compiler
Вывод графика функции
напишите прогу рисования графика функции вида y=f(x) на языке С график функции может быть любой.
Вывод графика функции на форму
Нужно вывести график функции: Log(x^2-4) на форму. Т.к. в Delphi есть только Ln и Lg (натуральный.
Вывод графика функции на форму
Помогите, пожалуйста, написать задачу. К сожалению, я ничего в этом не понимаю, а нужно сдать до.
Вывод графика функции на форму
Можно переделать эту программку, чтобы график выводился дискретно через время которое задается из.
Вывод графика функции на форму.
Исследовать функцию. Для каждого варианта протабулюваты функцию в заданном произвольном интервале.
Вывод графика заданной функции
Разработать с использованием процедур и функций из стандартного модуля Graph программу.
Как вывести график на си
//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);
>
Линии лучше рисовать от центра, иначе отрезки с учетом осей будут различны:в
как я сделал:
Как вывести график на си
Программирование графических приложений- отдельная, большая тема, подробное изложение которой выходит за рамки поставленной нами задачи — ознакомления читателя с основами изучаемого языка. И тем не менее, на наш взгляд, описание возможностей любого языка программирования без хотя бы одного примера работы с графикой, пусть и самой простой, было бы неудовлетворительно.
Для языка С существует много специальных графических библиотек функций, работающих с графикой. Для примера воспользуемся функциями, разработанными фирмой Borland для своего языка С/С++ версии 3.1. Приведем вариант программы, строящей на экране график функции Y=X*sin(X) в интервале от Х=0 до Х=10:
