#include #include using namespace std; const int resol = 400; IfmWindow win(2*resol+20, 2*resol+20); inline int rounded(double d) { return (int)floor(d + .5); } bool drawCircle(double A, double B, double C, double D) { // Convert to inversive coords double a = (-2*A + B + C) * sqrt(3.)/6.; double b = (-B + C) / 2.; double c = -D; double d = (A + B + C + 3*D) * sqrt(3.)/6.; // Convert to Cartesian coords double r = 1./(d-c); if (r < 1./resol) return false; double x = a*r; double y = b*r; win << FilledCircle(rounded(resol * (1+x)) + 10, rounded(resol * (1+y)) + 10, rounded(resol * r ) + 1); return true; } void generate(int i, double A, double B, double C, double D) { switch(i) { case 0: A = -A + 2*B + 2*C + 2*D; break; case 1: B = 2*A -B + 2*C + 2*D; break; case 2: C = 2*A + 2*B -C + 2*D; break; case 3: D = 2*A + 2*B + 2*C -D; break; } if (drawCircle(A, B, C, D)) { for (int j = 0; j < 4; j++) if (j != i) generate(j, A, B, C, D); } } int main() { win << red; drawCircle( -1, 1, 1, 1); generate(0, -1, 1, 1, 1); win << green; drawCircle( 1, -1, 1, 1); generate(1, 1, -1, 1, 1); win << blue; drawCircle( 1, 1, -1, 1); generate(2, 1, 1, -1, 1); win << yellow; generate(3, 1, 1, 1, -1); win.flush().wait_for_mouse_click(); return 0; }