/*
    第2種情報処理技術者試験    平成10年度・秋期・午後 問11
                                BohYoh Shibata PREPARATION
*/

#include  <stdlib.h>
#include  <math.h>
void     DrawLine   ( int sx, int sy, int ex, int ey ) ;
void     DrawQuarter( int x, int y, int r, int px, int py,
                      int qx, int qy, int num ) ;
/*
*******************************************************************
*       **     DrawFigure     **
*******************************************************************
*    機能 : 円に内接する多角形を描く
*    入力 :     x , y       = 円の中心座標
*            r       = 円の半径
*            n1~n4   = 辺数制御パラメタ
*/
void  DrawFigure( int x, int y, int r,
                  int n1, int n2, int n3, int n4 )
{
    DrawQuarter( x, y, r, x+r, y  , x  , y-r, n1 ) ;
    DrawQuarter( x, y, r, x  , y-r, x-r, y  , n2 ) ;
    DrawQuarter( x, y, r, x-r, y  , x  , y+r, n3 ) ;
    DrawQuarter( x, y, r, x  , y+r, x+r, y  , n4 ) ;
}

void  DrawQuarter( int x, int y, int r, int px, int py,
                   int qx, int qy, int num )
{
    int    dx, dy ;
    int    tx, ty ;
    float  lx, ly, f ;

    dx = abs( px - qx ) ;
    dy = abs( py - qy ) ;

    if  ( ( num == 1 ) || ( ( dx < 2 ) && ( dy < 2 ) ) )    {
            DrawLine( px, py, qx, qy ) ;
            return ;
    }

    lx = ( px + qx ) / 2.0f ;
    ly = ( py + qy ) / 2.0f ;

    lx -= x ;  ly -= y ;
    f  = (float)( r / sqrt( lx*lx + ly*ly ) ) ;
    tx = x + (int)( lx * f ) ;
    ty = y + (int)( ly * f ) ;

    if ( num > 1 ) num-- ;
    DrawQuarter( x, y, r, px, py, tx, ty, num ) ;
    DrawQuarter( x, y, r, tx, ty, qx, qy, num ) ;
}