BohYoh.comトップページへ

基本情報技術者試験 平成14年度・春期・午後 問6 ソースプログラム

C言語講座へ  情報処理技術者試験対策講座へ  情報処理技術者試験対策講座(C言語)へ 
/*
    基本情報技術者試験          平成14年度・秋期・午後 問10
                                BohYoh Shibata PREPARATION
*/

int Vx[4], Vy[4];   /* 4頂点の座標値配列(Vxはx座標,Vyはy座標) */

void gMoveTo(int, int);
void gLineTo(int, int);

int  nCheck(double a)
{
     if      (a > 0.0)  return  1;
     else if (a < 0.0)  return  -1;
     return 0;
}

int  DrawRect( )
{
    int    nCnt;
    double dx, dy, k;
    int    nSide0, nSide1, nSide2;

    for (nCnt = 0; nCnt < 4; nCnt++) {
        if      (nCnt == 0)   gMoveTo(Vx[nCnt], Vy[nCnt]);
        else if (nCnt <  3)   gLineTo(Vx[nCnt], Vy[nCnt]);
        else    {
                gLineTo(Vx[nCnt], Vy[nCnt]);

                /* P3とP4を通る直線の方程式を求める。 */
                dx = Vx[3] - Vx[2];
                dy = Vy[3] - Vy[2];
                k  = dx * Vy[2] - dy * Vx[2];
                /* 第1の判定 */
                nSide0 = nCheck(dy * Vx[0] - dx * Vy[0] + k);
                nSide1 = nCheck(dy * Vx[1] - dx * Vy[1] + k);
                if (nSide0 != nSide1)  return -1;
                /* P4とP1を通る直線の方程式を求める。 */
                dx = Vx[0] - Vx[3];
                dy = Vy[0] - Vy[3];
                k  = dx * Vy[3] - dy * Vx[3];
                /* 第2の判定 */
                nSide1 = nCheck(dy * Vx[1] - dx * Vy[1] + k);
                nSide2 = nCheck(dy * Vx[2] - dx * Vy[2] + k);
                if (nSide1 != nSide2)  return -1;
                /* P3とP1を通る直線の方程式を求める。 */
                dx = Vx[0] - Vx[2];
                dy = Vy[0] - Vy[2];
                k  = dx * Vy[2] - dy * Vx[2];
                /* 第3の判定 */
                nSide1 = nCheck(dy * Vx[1] - dx * Vy[1] + k);
                nSide2 = nCheck(dy * Vx[3] - dx * Vy[3] + k);
                if (nSide1 * nSide2 != -1)  return -1;
        }
    }
    gLineTo(Vx[0], Vy[0]);
    return 0;
}