基本情報技術者試験の過去問と解説
[TOP] [午前分野別] [午後分野別] [キーワード索引] [令和元年秋午前] [令和元年秋午後]

平成14年 春期 基本情報技術者 午後 問06
問06   C言語

 次の C プログラムの説明及びプログラムを読んで,設問に答えよ。

〔プログラムの説明〕

水平方向に 512 画素,垂直方向に 512 画素からなるビットマップ画面がある。 水平方向をX座標,垂直方向をY座標とする。 座標の割当てを図に示す。

図 ビットマップ画面の座標の割当て

このビットマップ画面に三角形を描画する。 三角形は,3頂点 P1 (x1,y1), P2 (x2,y2),P3 (x3,y3) によって与えられる。 三角形の各辺,及び辺で囲まれた閉領域内の画素をすべて点灯する再帰的な関数 DrawTrg の処理手順を,次に示す。

(1) 与えられた3頂点が隣接しているかどうかを検査する。

(2) 隣接しているときは,3頂点の画素を点灯して処理を終了する。

(3) 隣接していないときは,三平方の定理を用いて,各辺の長さの2乗値を求める。

(4) 最も長い辺を選び,この辺の中点Cの座標 (xc,yc) を求める。 この中点によって二つの三角形に分割する。 例えば,図のように辺 P2P3 が最長である場合には, 三角形 P1CP2 と三角形 P1CP3 に分割する。

(5) 分割したそれぞれの三角形に,再帰的にこの関数 DrawTrg を適用する。

画素を点灯するために,次の関数が用意されている。

void gSetPixel( int sx, int sy );

機能:座標( sx,sy )の画素を点灯する。

〔プログラム〕

void  gSetPixel( int, int );
double  GetMax( double, double, double );
double  GetMin( double, double, double );
double  GetMax( double a, double b, double c )
{
    if ( ( a >= b ) && ( a >= c ) ) return a;
    if ( b >= c ) return b;
    return c;
}
double  GetMin( double a, double b, double c )
{
    if ( ( a <= b ) && ( a <= c ) ) return a;
    if ( b <= c ) return b;
    return c;
}
void  DrawTrg( double x1, double y1, double x2, double y2,
               double x3, double y3 )
{
    double Len1, Len2, Len3;
    double dx, dy;
    dx = GetMax( x1, x2, x3 ) - GetMin( x1, x2, x3 ); 
    dy =  - GetMin( y1, y2, y3 );  
    if ( ( dx <= 1.0 ) && ( dy <= 1.0 ) ) {
        gSetPixel( (int)x1, (int)y1 );
        gSetPixel( (int)x2, (int)y2 );
        gSetPixel( (int)x3, (int)y3 );
        return;
        }
    Len1 = ( x2-x1 )*( x2-x1 ) + ( y2-y1 )*( y2-y1 );
    Len2 = ( x3-x2 )*( x3-x2 ) + ( y3-y2 )*( y3-y2 );
    Len3 = ( x1-x3 )*( x1-x3 ) + ( y1-y3 )*( y1-y3 );
    if (  ) {
        DrawTrg( x1, y1, (x1+x2)/2, (y1+y2)/2, x3, y3 );
        DrawTrg( x3, y3, (x1+x2)/2, (y1+y2)/2, x2, y2 );
        }
    else if ( Len2 >= Len3 ) {
         
        }
    else {
        DrawTrg( x1, y1, (x1+x3)/2, (y1+y3)/2, x2, y2 );
        DrawTrg( x2, y2, (x1+x3)/2, (y1+y3)/2, x3, y3 );
        }
}

基本情報技術者試験


設問  プログラム中の に入れる正しい答えを, 解答群の中から選べ。

a に関する解答群

ア GetMax( x1, x2, x3 )     イ GetMin( x1, x2, x3 )

ウ GetMax( x1, y1, y2 )     エ GetMax( y1, x1, x2 )

オ GetMax( y1, y2, y3 )     カ GetMin( y1, y2, y3 )

b に関する解答群

ア Len1 <= Len2

イ Len1 <= Len3

ウ Len2 <= Len3

エ ( Len1 >= Len2 ) && ( Len1 >= Len3 )

オ ( Len1 <= Len2 ) && ( Len1 <= Len3 )

c に関する解答群

ア DrawTrg( x1, y1, (x1+x3)/2, (y1+y3)/2, x3, y3 );
   DrawTrg( x2, y2, (x1+x3)/2, (y1+y3)/2, x1, y1 );

イ DrawTrg( x1, y1, (x2+x3)/2, (y2+y3)/2, x3, y3 );
   DrawTrg( x2, y2, (x2+x3)/2, (y2+y3)/2, x1, y1 );

ウ DrawTrg( x2, y2, (x1+x3)/2, (y1+y3)/2, x3, y3 );
   DrawTrg( x3, y3, (x1+x3)/2, (y1+y3)/2, x1, y1 );

エ DrawTrg( x2, y2, (x2+x3)/2, (y2+y3)/2, x3, y3 );
   DrawTrg( x3, y3, (x2+x3)/2, (y2+y3)/2, x1, y1 );

オ DrawTrg( x3, y3, (x1+x3)/2, (y1+y3)/2, x1, y1 );
   DrawTrg( x3, y3, (x1+x3)/2, (y1+y3)/2, x2, y2 );

解答 a ←クリックすると正解が表示されます

解答 b ←クリックすると正解が表示されます

解答 c ←クリックすると正解が表示されます

[←前の問題] [次の問題→] [問題一覧表] [分野別] [基本情報技術者試験TOP ]