基本情報技術者試験 平成14年度・春期・午後 問6 ソースプログラム
/*
基本情報技術者試験 平成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;
}