戻る
多角形の内外判定
多角形の頂点XY座標を設定し、任意のXY座標が多角形の内側と外側どちらにあるか判定する。
サンプルコード
多角形内外判定関数
// パラメータ
// lX : 内外判定を行う点のX座標
// lY : 内外判定を行う点のY座標
// nNum : 多角形の頂点の数
// plX : 多角形の頂点のX座標配列先頭アドレス
// plY : 多角形の頂点のY座標配列先頭アドレス
//
// 戻り値
// TRUE : 内
// FALSE : 外
BOOL InsidePolygon(long lX, long lY, int nNum, long *plX, long *plY)
{
int i, j;
BOOL Inside;
double dY;
// 指定座標が多角形の線上にあるかを判定する。
for (i = 0, j = nNum - 1; i < nNum; j = i ++)
{
if (plY[i] == plY[j] && y == plY[i] &&
((plX[i] <= lX && lX <= plX[j]) || (plX[j] <= lX && lX <= plX[i])))
{
return TRUE;
}
else if (plY[i] != plY[j] &&
((plY[i] <= lY && y <= plY[j]) || (py[j] <= lY && y <= plY[i])) &&
lX == (double)(plX[j] - plX[i]) * (lY - plY[i]) / (plY[j] - plY[i]) + plX[i])
{
return TRUE;
}
}
// 指定座標が多角形の内外どちらにあるかを判定する。
Inside = FALSE;
dY = lY + 0.5;
for (i = 0, j = nNum - 1; i < nNum; j = i ++) {
if (((plY[i] <= lY && lY < plY[j]) || (plY[j] <= lY && lY < plY[i])) &&
lX < (double)(plX[j] - plX[i]) * (dY - plY[i]) / (plY[j] - plY[i]) + plX[i])
{
if (Inside == FALSE)
{
Inside = TRUE;
}
else
{
Inside = FALSE;
}
}
}
return Inside;
}