Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <allegro.h>
- #define red makecol(255,0,0)
- #define green makecol(0,255,0)
- double xmax,xmin,ymax,ymin;
- float max(float value1, float value2)
- {
- return ( (value1 > value2) ? value1 : value2);
- }
- float min(float value1, float value2)
- {
- return ( (value1 < value2) ? value1 : value2);
- }
- int LiangBarsky(double xw0, double yw0, double xw1, double yw1, int colour, bool bscreen, BITMAP * buf, BITMAP * buffer)
- {
- double x1,y1,x2,y2;
- double xwmin,ywmin,xwmax,ywmax;
- x1 = xw0;
- y1 = yw0;
- x2 = xw1;
- y2 = yw1;
- xwmin = xmin;
- xwmax = xmax;
- ywmin = ymin;
- ywmax = ymax;
- /*printf("enter the endpoints of the line");
- scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
- printf("\nEnter the corners of the window");
- scanf("\n%d %d %d %d",&xwmin,&ywmin,&xwmax,&ywmax);
- */
- int p[5],q[5];
- p[1]=-(x2-x1);
- p[2]=x2-x1;
- p[3]=-(y2-y1);
- p[4]=y2-y1;
- q[1]=x1-xwmin;
- q[2]=xwmax-x1;
- q[3]=y1-ywmin;
- q[4]=ywmax-y1;
- int i;
- for(i=1;i<5;i++)
- {
- if(p[i]==0)
- {
- //linia jest rownolegla
- if (q[i]<0)
- {
- //Linia jest poza obszarem, rysujemy tylko kwadrat
- rect(buf,xwmin,ywmin,xwmax,ywmax,red);
- return(0);
- }
- }
- }
- float u1=0,u2=1;
- float r[5];
- for(i=1;i<5;i++)
- { if(p[i]!=0)
- r[i]=q[i]*1.0/p[i];
- }
- for(i=1;i<5;i++)
- {
- if(p[i]==0)
- continue;
- if(p[i]<0)
- {
- u1=max(u1, r[i]);
- }
- else
- { u2=min(u2, r[i]);
- }
- }
- rect(buf,xwmin,ywmin,xwmax,ywmax,red);
- //wyliczamy wspolrzedne nowych punktow linii
- if(u1<u2)
- {
- int xx1=x1+u1*(x2-x1);
- int yy1=y1+u1*(y2-y1);
- int xx2=x1+u2*(x2-x1);
- int yy2=y1+u2*(y2-y1);
- if(bscreen) //jezeli mamy rysowac na ekranie
- {
- rect(buf,xmin,ymin,xmax,ymax, colour);
- line(buf,xx1,yy1,xx2,yy2,red);
- }
- else //jezeli mamy rysowac na obszarze powiekszenia
- {
- rect(buffer,0,0,200,200, red);
- line(buffer,2*(x1-xmin),2*(y1-ymin),2*(x2-xmin),2*(y2-ymin),red);
- blit(buffer,buf,0,0,600,0,200,201);
- }
- }
- }
- int main(){
- allegro_init();
- install_keyboard();
- set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0);
- clear_to_color(screen,makecol(0,0,0));
- BITMAP *buf;
- buf = create_bitmap(800, 600);
- BITMAP *buffer;
- buffer = create_bitmap(200, 201);
- clear_to_color(buffer, makecol(0,0,0));
- //ustawienie rozmiarow kwadratu
- xmax = 200;
- ymax = 200;
- xmin = 100;
- ymin = 100;
- while(!key[KEY_ESC])
- {
- clear_to_color(buf,makecol(0,0,0));
- clear_to_color(buffer,makecol(0,0,0));
- //rysuje linie na ekranie(buf) -> rysunek oryginalny
- for (int i=200; i<600;i+=100)
- {
- line(buf,0,0,i,i+100,green);
- }
- if(key[KEY_W])
- {
- ymax--;
- ymin--;
- }
- if(key[KEY_S])
- {
- ymax++;
- ymin++;
- }
- if(key[KEY_A])
- {
- xmax--;
- xmin--;
- }
- if(key[KEY_D])
- {
- xmax++;
- xmin++;
- }
- //dla wyrysowanych linii wykonuje rysunki obcietego kwadratu na ekranie bscreen=true i buforze bscreen=false, buffer to powiekszony obciety kwadrat
- for (int i=200; i<600;i+=100)
- {
- LiangBarsky(0,0,i,i+100,red,true,buf,buffer);
- LiangBarsky(0,0,i,i+100,red,false,buf,buffer);
- }
- blit(buf,screen,0,0,0,0,800,600);
- }
- return 0;
- }
- END_OF_MAIN();
Add Comment
Please, Sign In to add comment