Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Как нарисовать график функции в СИ (compiler - bcc OR lcc)

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2

Открыть новую тему     Написать ответ в эту тему

rew



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ну вот к примеру по этим координатам line(x,ycent-3,x,ycent+3); ты рисуешь линию те если тебе нужно нарисовать выше число то ты его должен нарисовать по координатам (x-[ширина цифр/2], ycent +- некоторое смещение)

----------
плох тот error который не мечтает стать general`ом

Всего записей: 442 | Зарегистр. 09-09-2001 | Отправлено: 01:11 19-02-2003
zam

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
rew
а зачем y И(?) yt. Я попробовал сделать одно -- получил "волосатый" график. Попробовал исключить другое -- получил полузакрашенный график. Не понимаю этого момента вообще. помоги понять плиз

Всего записей: 185 | Зарегистр. 19-01-2003 | Отправлено: 01:13 19-02-2003
rew



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
в смысле отчет вести от точки пересечения координат (xcent, ycent)  

и что это даст?
 
Добавлено
zam
я ж говорю оно рисует вертикальную линию начиная с y до yt.  
я не знаю как обьяснить там fstp это "шаг" по оси х функции который соответсвует 1пикселю по х на экране. там получается y=f(xt) а yt=f(xt+fstp) те в промежетке между xt и xt+fstp на экране отображается отрезок вертикальной линии.
кста, а зачем тебе что то исключать?
или я что то не правильно понял...  


----------
плох тот error который не мечтает стать general`ом

Всего записей: 442 | Зарегистр. 09-09-2001 | Отправлено: 01:13 19-02-2003
zam

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
rew
Почему-то теперь с логарифмами виснет при попытке увеличить/уменьшить зум через case. Как думаешь - почему?  
 

Код:
 
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <graphics.h>
#include <math.h>
#include <dos.h>
#define bgipath "d:\\lang\\bc\\bgi"
int xcent,ycent,xend,yend;
 
float x,xt,y,yt;
int x0=0, y0=0; //nachalo otnositel`no (0,0) ekrana
int xmin=0, ymin=0; //nachlo okna otnositelno (x0,y0)
int jmp=35;
int xmax=639, ymax=479; //konec
int bc=2, gc=10, fc=7; //border color,grid color,fill color
int grdstp=1;   //grid step
float zoom=1; //zoom
float fstp;   //func step
int gstp; //zoomgrid step
int ax=0; //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(void) {
  xcent = x0 - xmin;
  ycent = y0 + ymax;
  xend = xcent + xmax;
  yend = ycent-ymin;
  fstp = zoom / 1.0;
  gstp = 4;
}
 
void clear(void) {
  init();
  setfillstyle(1,0);
  bar(x0,y0,xend,yend);
}
 
void draw_grid(void) {
  init();
  if(xend>639)
xend=639;
 
  if(yend>479)
yend=479;
 
  setcolor(bc);
  rectangle(x0+jmp,y0+jmp,xend-jmp,yend-jmp);
  setcolor(fc);
 
  if(ycent>y0 && ycent<yend)
line(x0+jmp,ycent,xend-jmp,ycent);
 
  setcolor(fc);
 
  if(xcent>x0 && xcent<xend)
line(xcent, y0+jmp, xcent, yend-jmp);
 
  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(void) {
  int sign;
  init();
 
  for(x=xmin+jmp,xt=xmin*fstp; x<=xmax-jmp; x++,xt+=fstp) {
if(xt-1<=0)
 continue;
y = log(xt-1);
yt = log(xt+fstp-1);
sign = y < yt ? 1 : -1;
 
while(y*sign<yt*sign) {
 if(y/fstp>ymin && y/fstp<ymax) {
putpixel(x+xcent,ycent-y/fstp,4);
 }
 y += sign*fstp;
}
  }
 
  for(x=xcent;x<xend-jmp;x+=gstp+10) // vertical lines
line(x,ycent-3,x,ycent+3);
  for(x=xcent; x>x0+jmp; x-=gstp+10)
line(x,ycent-3,x,ycent+3);
  for(y=ycent;y<yend-jmp;y+=gstp+10) // horizontal lines
line(xcent-3,y,xcent+3,y);
  for(y=ycent;y>y0+jmp;y-=gstp+10)
line(xcent-3,y,xcent+3,y);
}
 
int main(void) {
  char ch=' ';
  graphit(bgipath);
  x0=0;
  y0=0;
  xmin=-getmaxx()/2;
  xmax=getmaxx()/2;
  ymin=-getmaxy()/2;
  ymax=getmaxy()/2;
 
  zoom=12.52;
  draw_grid();
  draw_function();
 
  while((ch=getch())!='q') {
switch(ch) {
 case 'x':zoom+=.1;break;
 case 'z':if(zoom>0.1)zoom-=.1;break;
}
clear();
  }
  getch();
  return 1;
}
 

 
Добавлено
rew

Цитата:
кста, а зачем тебе что то исключать?

Интересно было, чтобы понять суть

Всего записей: 185 | Зарегистр. 19-01-2003 | Отправлено: 02:06 19-02-2003
fuyoko

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Эм привет всем)
а строфоиду как рисовать????0_0
сразу говорю я чайник в этом деле

Всего записей: 1 | Зарегистр. 20-04-2011 | Отправлено: 03:36 20-04-2011
XPEHOMETP

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
fuyoko

Цитата:
а строфоиду как рисовать????

Я буду неоригинален до крайности... Посмотрите начало этой темы, какие там вопросы задавали? Какая операционка (может, голый ДОС), куда выводим рисунок - в окошко или в консоль... И лично от себя: а нельзя ли использовать сторонние библиотеки или даже программы? Cкажем, gnuplot? Ну, похоже, задание учебное, стало быть, нельзя. Или же это только пойдет в плюс, как показатель навыков работы со сторонним софтом? Однако же, из сказанного выше, ничего не пригодилось? Не надо бить себя ногой в грудь и говорить: я - чайник. Все ими когда-то были, а в определенных областях остаются до сих пор. Объясните хотя бы, с чем у Вас реальные проблемы.

Всего записей: 2505 | Зарегистр. 21-06-2005 | Отправлено: 08:10 21-04-2011 | Исправлено: XPEHOMETP, 08:11 21-04-2011
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Как нарисовать график функции в СИ (compiler - bcc OR lcc)


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2025

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru