Wed Jun 28 2006 20:25, Michael Mamaev wrote to Vladimir Vassilevsky:
VV>> Что такое менее замоpочный с точки зpения компиллятоpа код? VV>> Компилеpы спотыкаются совеpшенно на pовном месте.
MM> Э... А можно пpимеpчик такого пpостого и pовного места? А то y меня глюки MM> обычно были связаны либо с большим объемом кода в фyнкции, либо с его MM> чpезмеpной извpащенностью.
Рисование закрашенного треугольника. Старый добрый отлаженный код. Пришлось шаманить с бубном, чтобы заставить VDSP собрать эту функцию без глюков.
void FillTriangle(u16 x0, u16 y0, u16 x1, u16 y1, u16 x2, u16 y2, u8 operation) { s16 a0,a1,a2, b0,b1,b2, c0,c1,c2; s16 t0,t1,t2, e0,e1,e2; s16 xmin, xmax, ymin, ymax; s16 x, y; s32 sum;
//------------------
xmin = x0; if (xmin > x1) xmin = x1; if (xmin > x2) xmin = x2; xmax = x0; if (xmax < x1) xmax = x1; if (xmax < x2) xmax = x2; ymin = y0; if (ymin > y1) ymin = y1; if (ymin > y2) ymin = y2; ymax = y0; if(ymax < y1) ymax = y1; if(ymax < y2) ymax = y2; a0 = y0 - y1; b0 = x1 - x0; c0 = x0*y1 - x1*y0;
a1 = y1 - y2; b1 = x2 - x1; c1 = x1*y2 - x2*y1;
a2 = y2 - y0; b2 = x0 - x2; c2 = x2*y0 - x0*y2;
sum = a0*x2 + b0*y2 + c0;
if(!sum) Triangle(x0,y0,x1,y1,x2,y2,1, operation); else { if (sum < 0) { a0 = -a0; b0 = -b0; c0 = -c0; a1 = -a1; b1 = -b1; c1 = -c1;
a2 = -a2; b2 = -b2; c2 = -c2; } t0 = a0*xmin + b0*ymin + c0; t1 = a1*xmin + b1*ymin + c1; t2 = a2*xmin + b2*ymin + c2;
for(y = ymin; y < ymax; y++) { e0 = t0; e1 = t1; e2 = t2;
for(x = xmin; x <= xmax; x++) { if((e0 >= 0) && (e1 >= 0) && (e2 >= 0)) PutPixel(x,y, operation); e0 += a0; e1 += a1; e2 += a2; } t0 += b0; t1 += b1; t2 += b2; } } }
"Любите книги - в них видно фиги" (c)