thecplusplusguy

line ray collision detection SDL

Oct 21st, 2011
298
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.04 KB | None | 0 0
  1. //http://www.youtube.com/user/thecplusplusguy
  2. #include <SDL/SDL.h>
  3. #include <iostream>
  4.  
  5.  
  6. //put a pixel to the screen
  7. void putPixel(int x,int y)
  8. {
  9.     if(x<0 || x>640 || y<0 || y>480)
  10.         return;
  11.     Uint32* pixels=(Uint32*)SDL_GetVideoSurface()->pixels;
  12.     Uint32* pixel=pixels+y*SDL_GetVideoSurface()->pitch/4+x;
  13.     *pixel=SDL_MapRGB(SDL_GetVideoSurface()->format,0xff,0xff,0xff);
  14. }
  15.  
  16. //get the absolute value of a number (the abs() works only for ints I think
  17. double absolut(double d)
  18. {
  19.     return (d>0 ? d : -d);
  20. }
  21.  
  22.  
  23. //draw a line
  24. void drawline(SDL_Surface* screen,int x1,int y1,int x2,int y2)
  25. {
  26.     if(x2>x1)
  27.     {
  28.         int x=x1,y=y1;
  29.         double deltaerr=(float)(y2-y1)/(x2-x1);
  30.         double error=0.0;
  31.         while(x<x2)
  32.         {
  33.             putPixel(x,y);
  34.             error+=deltaerr;
  35.             if(error>=0.5)
  36.             {
  37.                 y++;
  38.                 error-=1.;
  39.             }
  40.             x++;
  41.         }
  42.     }else if(x1>x2)
  43.     {
  44.         int x=x1,y=y1;
  45.         double deltaerr=absolut((double)(y2-y1)/(x2-x1));
  46.         double error=0.0;
  47.         while(x>x2)
  48.         {
  49.             putPixel(x,y);
  50.             error+=deltaerr;
  51.             if(error>=0.5)
  52.             {
  53.                 y++;
  54.                 error-=1.;
  55.             }
  56.             x--;
  57.         }
  58.     }else if(x1==x2)
  59.     {
  60.         for(int i=y1;i<y2;i++)
  61.         {
  62.             putPixel(x1,i);
  63.         }
  64.     }else if(y1>y2)
  65.     {
  66.        
  67.     }
  68. }
  69.  
  70. //check collision between the ray and the line
  71. bool lineray(float xs,float ys,float xd,float yd,int x1,int y1,int x2,int y2)
  72. {
  73.     float t=t = (xs*(y2 - y1) + ys*(x1 - x2) + y1*x2 - y2*x1)/(yd*x2 - x1 *yd - y2*xd + y1*xd);
  74.     if(t<0)
  75.         return false;
  76.     int x=xs+t*xd;
  77.     int y=ys+t*yd;
  78.     if(x>=x1 && x<=x2 && y>=y1 && y<=y2)
  79.     {
  80.         drawline(SDL_GetVideoSurface(),x,y,x,y+100);
  81.         return 1;
  82.     }
  83.     return 0;
  84.    
  85. }
  86.  
  87.  
  88.  
  89. int main(int argc,char** argv)
  90. {
  91.     SDL_Init(SDL_INIT_EVERYTHING);
  92.     SDL_Surface* screen=SDL_SetVideoMode(640,480,32,SDL_SWSURFACE);
  93.     bool running=true;
  94.     SDL_Event event;
  95.     Uint32 start;
  96.     bool b[4]={0,0,0,0};
  97.     int x=100,y=100;
  98.     while(running)
  99.     {
  100.         start=SDL_GetTicks();
  101.         while(SDL_PollEvent(&event))
  102.         {
  103.             switch(event.type)
  104.             {
  105.                 case SDL_QUIT:
  106.                     running=false;
  107.                     break;
  108.                 case SDL_KEYDOWN:
  109.                     switch(event.key.keysym.sym)
  110.                     {
  111.                         case SDLK_UP:
  112.                             b[0]=true;
  113.                             break;
  114.                         case SDLK_LEFT:
  115.                             b[1]=true;
  116.                             break;
  117.                         case SDLK_DOWN:
  118.                             b[2]=true;
  119.                             break;
  120.                         case SDLK_RIGHT:
  121.                             b[3]=true;
  122.                             break;
  123.                     }
  124.                     break;
  125.                 case SDL_KEYUP:
  126.                     switch(event.key.keysym.sym)
  127.                     {
  128.                         case SDLK_UP:
  129.                             b[0]=false;
  130.                             break;
  131.                         case SDLK_LEFT:
  132.                             b[1]=false;
  133.                             break;
  134.                         case SDLK_DOWN:
  135.                             b[2]=false;
  136.                             break;
  137.                         case SDLK_RIGHT:
  138.                             b[3]=false;
  139.                             break;
  140.                     }
  141.                     break;             
  142.             }
  143.         }
  144.         //render
  145.         if(b[0])
  146.             y--;
  147.         if(b[1])
  148.             x--;
  149.         if(b[2])
  150.             y++;
  151.         if(b[3])
  152.             x++;
  153.         SDL_FillRect(screen,&screen->clip_rect,SDL_MapRGB(screen->format,0,0,0));
  154.         putPixel(50,50);
  155.         drawline(screen,10,10,200,100);
  156.         drawline(screen,x,y,x+0.70710*100,y+0.70710*100);
  157.         lineray(x,y,0.70710,0.70710,10,10,200,100);
  158.         SDL_Flip(screen);
  159.         if(1000/30>(SDL_GetTicks()-start))
  160.             SDL_Delay(1000/30-(SDL_GetTicks()-start));
  161.     }
  162.     SDL_Quit();
  163. }
Advertisement
Add Comment
Please, Sign In to add comment