/*
第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 ) ;
}