С алгоритмом из Вики столкнулся сразу же, он то же дырявый. Но его можно доработать:
Код | int R=35; int x0=rRect.left+35+190; int y0=rRect.top+35+50; for (int iRadius=R;iRadius>0;iRadius--)//Перемещение по радиусам { int x=0; int y=iRadius; int Di=2*(1-iRadius); int d=0; while (y>=0) { SetPixel(hCompatibleButtonDC,x0+x,y0+y,RGB(244,199,42)); SetPixel(hCompatibleButtonDC,x0+y,y0+x,RGB(244,199,42));
SetPixel(hCompatibleButtonDC,x0+y,y0-x,RGB(244,199,42)); SetPixel(hCompatibleButtonDC,x0+x,y0-y,RGB(244,199,42));
SetPixel(hCompatibleButtonDC,x0-x,y0-y,RGB(244,199,42)); SetPixel(hCompatibleButtonDC,x0-y,y0-x,RGB(244,199,42));
SetPixel(hCompatibleButtonDC,x0-y,y0+x,RGB(244,199,42)); SetPixel(hCompatibleButtonDC,x0-x,y0+y,RGB(244,199,42)); //error = 2 * (delta + y) - 1; d=2*Di+2*y-1;//error if (Di<0&&d<=0) { x++; Di=Di+2*x+1;//delta += 2 * x + 1; continue; } d=2*Di-2*x-1;//error = 2 * (delta - x) - 1; if (Di>0&&d>0) { y--; Di=Di-2*y+1;//delta += 1 - 2 * y; continue; } y--;//Диагональная точка SetPixel(hCompatibleButtonDC,x0+x,y0+y,RGB(244,199,42)); SetPixel(hCompatibleButtonDC,x0+y,y0+x,RGB(244,199,42));
SetPixel(hCompatibleButtonDC,x0+y,y0-x,RGB(244,199,42)); SetPixel(hCompatibleButtonDC,x0+x,y0-y,RGB(244,199,42));
SetPixel(hCompatibleButtonDC,x0-x,y0-y,RGB(244,199,42)); SetPixel(hCompatibleButtonDC,x0-y,y0-x,RGB(244,199,42));
SetPixel(hCompatibleButtonDC,x0-y,y0+x,RGB(244,199,42)); SetPixel(hCompatibleButtonDC,x0-x,y0+y,RGB(244,199,42));
x++; Di=Di+2*x-2*y;// delta += 2 * (x - y);
} }
|
Не фонтан конечно, за то закрывает весь круг без дырок. Как видно, слабое место у алгоритма - выбор диагональной точки и если добавить дополнительную прорисовку пиксела внутрь окружности (у--), то результат получается более-менее терпимый. Большое спасибо за помощь, тема закрыта |