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 Цитата: кста, а зачем тебе что то исключать? | Интересно было, чтобы понять суть  |