MMBC

Bresenham triangle

Oct 18th, 2017
183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.51 KB | None | 0 0
  1. typedef struct { int x, y; } Vei2;
  2.  
  3. // WARNING : VERTICES MUST BE SORTED BEFORE CALLING THIS, USE VXDrawTriangleNoClip(Vei2,Vei2,Vei2,c)
  4. void VXDrawTriangleNoClip(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, Uint32 c)
  5. {
  6.     int ledx =  abs(x2-x0), lesx = (x0 < x2 ? 1 : -1);
  7.     int ledy = -abs(y2-y0), lesy = (y0 < y2 ? 1 : -1);
  8.     int leerr = ledx+ledy, lee2;
  9.     bool rasterisation = true;
  10.     int lelx = x0;
  11.     int lely = y0;
  12.  
  13.     int setdx =  abs(x1-x0), setsx = (x0 < x1 ? 1 : -1);
  14.     int setdy = -abs(y1-y0), setsy = (y0 < y1 ? 1 : -1);
  15.     int seterr = setdx+setdy, sete2;
  16.     int setlx = x0;
  17.     int setly = y0;
  18.  
  19.     int sebdx =  abs(x2-x1), sebsx = (x1 < x2 ? 1 : -1);
  20.     int sebdy = -abs(y2-y1), sebsy = (y1 < y2 ? 1 : -1);
  21.     int seberr = sebdx+sebdy, sebe2;
  22.     int seblx = x1;
  23.     int sebly = y1;
  24.  
  25.     int selx = x0;
  26.     int rx = x0;
  27.     while (rasterisation)
  28.     {
  29.         for (;;)
  30.         {
  31.             VXSetPixelNoClip(lelx, lely, c);
  32.             if (lelx==x2&&lely==y2) rasterisation = false;
  33.             lee2 = 2*leerr;
  34.             if (lee2 >= ledy) { leerr += ledy; lelx += lesx; }
  35.             if (lee2 <= ledx) { leerr += ledx; lely += lesy; break; }
  36.         }
  37.  
  38.         if (lely <= y1)
  39.         {
  40.             for (;;)
  41.             {
  42.                 VXSetPixelNoClip(setlx, setly, c);
  43.                 sete2 = 2*seterr;
  44.                 if (sete2 >= setdy) { seterr += setdy; setlx += setsx; }
  45.                 if (sete2 <= setdx) { seterr += setdx; setly += setsy; break; }
  46.             }
  47.             selx = setlx;
  48.         }
  49.         if (lely >= y1)
  50.         {
  51.             for (;;)
  52.             {
  53.                 VXSetPixelNoClip(seblx, sebly, c);
  54.                 sebe2 = 2*seberr;
  55.                 if (sebe2 >= sebdy) { seberr += sebdy; seblx += sebsx; }
  56.                 if (sebe2 <= sebdx) { seberr += sebdx; sebly += sebsy; break; }
  57.             }
  58.             selx = seblx;
  59.         }
  60.  
  61.         rx = selx;
  62.  
  63.         for (;;)
  64.         {
  65.             VXSetPixelNoClip(rx, lely, c);
  66.             if (rx==lelx) break;
  67.             rx += (selx<lelx ? 1 : -1);
  68.         }
  69.     }
  70. }
  71.  
  72. void VXDrawTriangleNoClip(Vei2 v0, Vei2 v1, Vei2 v2, Uint32 c)
  73. {
  74.     const Vei2* pv0 = &v0;
  75.     const Vei2* pv1 = &v1;
  76.     const Vei2* pv2 = &v2;
  77.  
  78.     if( pv1->y < pv0->y ) std::swap( pv0,pv1 );
  79.     if( pv2->y < pv1->y ) std::swap( pv1,pv2 );
  80.     if( pv1->y < pv0->y ) std::swap( pv0,pv1 );
  81.  
  82.     VXDrawTriangleNoClip(pv0->x, pv0->y, pv1->x, pv1->y, pv2->x, pv2->y, c);
  83. }
Advertisement
Add Comment
Please, Sign In to add comment