[更新日]1998.11.06


次の問11から問14までの4問については,この中から1問を選択し,
答案用紙の選択欄のを マークして解答してください。
 なお,2問以上選択した場合には,はじめの1問について採点します。

〔プログラムの説明〕

水平及び垂直方向に 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 ) ;

解答群

ア  イ  ウ 
エ  オ 


戻る 次頁:問12