[更新日]1998.11.06
〔プログラムの説明〕
水平及び垂直方向に 512 画素からなるビットマップ画面がある。 水平方向を X 座標,垂直方向を Y 座標とする。座標の割当てを図に示す。
図 ビットマップ画面の座標の割当て
この画面上に,中心座標( x,y )と半径 r を与えたときに決まる円に内接する多角形を描く関数 DrawFigure を作成した。関数 DrawFigure には,円の中心座標( x,y )と半径 r のほかに,四つの整数型の引数 n1,n2,n3,n4 を与える。この四つの引数を辺数制御パラメタと呼ぶ。これらの値によって,どのような内接多角形を描くかを指示する。関数 DrawFigure の書式は,次のとおりである。
void DrawFigure( int x, int y, int r,
int n1, int n2, int n3, int n4 );
プログラム中の関数 DrawLine は,二つの座標( sx,sy )と( ex,ey )を結ぶ線分を描画する関数である。関数 DrawLine の書式は,次のとおりである。
void DrawLine( int sx, int sy, int ex, int ey );
〔プログラム〕
#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 ) ; }
設問1 関数 DrawFigure は円を四つの円弧に分けて,それぞれの部分を描画する関数DrawQuarter を呼び出す。関数 DrawQuarter の動作を説明する次の記述中の に入れる正しい答えを,解答群の中から選べ。
(1) 関数 DrawQuarter は,次の条件のいずれかが成立したときには,円弧の開始点と終了点を結ぶ線分を関数 DrawLine で描いて終了する。
<条件>
辺数制御パラメタの値が 1 である。
円弧の開始点と終了点 である。
(2) 条件が成立しなければ,円弧の開始点と終了点を結ぶ線分の中点の座標を求める。
(3) 円の中心と (2) で求めた中点の を求め,この値と円の半径との比率を求める。
(4) この比率を用いて,円の中心と中点を結ぶ直線と を求める。
(5) 辺数制御パラメタの値が 1 より大きいときには,1 だけ減らす 。
(6) (4) で求めた を用いて円弧を 二つに分解し,関数 DrawQuarter を再帰的に呼び出す。
a に関する解答群
ア が同じ座標
イ が隣接した状態( X 座標の差と Y 座標の差が共に 1 以下)
ウ の X 座標と Y 座標が同じ符号
エ の X 座標又は Y 座標が同じ値
オ の距離(三平方の定理で求めた値)が 1 以下
b,c に関する解答群
ア 円弧との交点の座標 イ 円弧との接点の座標
ウ 距離(三平方の定理で求めた値) エ 座標値の差の大きい方
オ 座標値の差の合計 カ 座標値の差の小さい方
設問2 次のような実引数を与えて関数 DrawFigure を呼び出したとき,描かれる図形を解答群の中から選べ。
DrawFigure( 255, 255, 100, 0, 1, 0, 2 ) ;
解答群
ア イ ウ エ オ