#include #include using namespace std; const int WINDOW_SIZE = 400; void change_controls(int& x, int& y, int& color, int& iris_radius); void display_controls (int color, int iris_radius); void display_eye(int cx, int cy, int color, int iris_radius); int main( ) { int x = WINDOW_SIZE/2, y = WINDOW_SIZE/2; int color = BLUE; int iris_radius = 15; initwindow(WINDOW_SIZE, WINDOW_SIZE, "Eyecon", 0, 0, true); do { change_controls(x, y, color, iris_radius); clearviewport( ); display_eye(x, y, color, iris_radius); display_controls(color, iris_radius); swapbuffers( ); delay(100); } while (true); return 0; } void change_controls(int& x, int& y, int& color, int& iris_radius) { if (ismouseclick(WM_LBUTTONDOWN)) getmouseclick(WM_LBUTTONDOWN, x, y); if (kbhit( )) { switch (getch( )) { case 'C': case 'c': color = (color == 15) ? 1 : color+1; break; case '-': if (iris_radius > 0) --iris_radius; break; case '+': if (iris_radius < WINDOW_SIZE/4) ++iris_radius; break; } } } void display_controls (int color, int iris_radius) { setfillstyle(SLASH_FILL, color); bar(0, WINDOW_SIZE-2*iris_radius, 10, WINDOW_SIZE-1); rectangle(0, WINDOW_SIZE-2*iris_radius, 10, WINDOW_SIZE-1); bgiout << "Click left mouse" << endl; bgiout << "Or press C or + or -" << endl; outstreamxy(20, WINDOW_SIZE-2*textheight("X")); } void display_eye(int cx, int cy, int color, int iris_radius) { int eye_radius_x = int(iris_radius * 2.00); int eye_radius_y = int(iris_radius * 1.75); int path_radius_x = eye_radius_x - iris_radius; int path_radius_y = eye_radius_y - iris_radius; int mouse_x = mousex( ) - cx; int mouse_y = mousey( ) - cy; double slope, iris_x, iris_y; double mouse_distance_squared, iris_distance_squared; // Compute the iris_x and iris_y. if (mouse_x == 0) { // Mouse directly above or below the the eye. iris_x = 0; iris_y = (mouse_y < 0) ? -path_radius_y : +path_radius_y; } else { slope = double(mouse_y)/double(mouse_x); iris_x = sqrt( 1.0 / (1.0/(path_radius_x*path_radius_x) + (slope*slope)/(path_radius_y*path_radius_y)) ); if (mouse_x < 0) iris_x *= -1; iris_y = slope * iris_x; } // Adjust in case the mouse is inside the darn ellipse mouse_distance_squared = (mouse_x*mouse_x + mouse_y*mouse_y); iris_distance_squared = (iris_x*iris_x + iris_y*iris_y); if (mouse_distance_squared < iris_distance_squared) { iris_x = mouse_x; iris_y = mouse_y; } // Draw the iris setfillstyle(SOLID_FILL, color); fillellipse(cx + int(iris_x), cy + int(iris_y), iris_radius, iris_radius); // Draw the outer ellipse ellipse(cx, cy, 0, 360, eye_radius_x, eye_radius_y); }