戻る

多角形の内外判定

多角形の頂点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;
}
inserted by FC2 system