#include #include #include Point o; Image *px; uchar bgr[3] = {0, 0, 255}; int rad; void spot(int n, int r){ Point p; int t; bgr[1] = ~r; loadimage(px, px->r, bgr, 3); r = r * rad >> 8; switch(n){ case 0: p = Pt(o.x, o.y - rad + r); break; case 1: t = sqrt((rad - r) * (rad - r) >> 1); p = Pt(o.x + t, o.y - t); break; case 2: p = Pt(o.x + rad - r, o.y); break; case 3: t = sqrt((rad - r) * (rad - r) >> 1); p = Pt(o.x + t, o.y + t); break; case 4: p = Pt(o.x, o.y + rad - r); break; case 5: t = sqrt((rad - r) * (rad - r) >> 1); p = Pt(o.x - t, o.y + t); break; case 6: p = Pt(o.x - rad + r, o.y); break; case 7: t = sqrt((rad - r) * (rad - r) >> 1); p = Pt(o.x - t, o.y - t); break; } fillellipse(screen, p, r, r, px, ZP); } void main(int, char**){ int r, n, i; if(initdraw(nil, nil, ".oO") < 0) sysfatal("initdraw: %r"); px = allocimage(display, Rect(0, 0, 1, 1), RGB24, 1, DNofill); if(px == nil) sysfatal("allocimage: %r"); rad = Dx(screen->r) < Dy(screen->r) ? Dx(screen->r) / 2 : Dy(screen->r) / 2; o.x = screen->r.min.x + screen->r.max.x >> 1; o.y = screen->r.min.y + screen->r.max.y >> 1; while(9){ for(n = 0; n < 8; n++) for(r = 0; r < 32; r++){ bgr[1] = 0; loadimage(px, px->r, bgr, 3); draw(screen, screen->r, px, nil, ZP); for(i = 7; i >= 0; i--) spot(n - i & 7, i << 5 | r); flushimage(display, 1); // sleep(50); } } }