[PR]

『新妻LOVELY×CATION』を応援しています!

点が三角形内に含まれるか調べる

戻る

 2次元平面上の点 p が三角形 abc 内に位置するかどうかを調べる関数を作る。
 三角形 abc の各頂点を a-b-c-a と順番に一回りする時、点 p が三角形 abc の内側にあるならば点 p は進行方向に対して常に同じ側に存在する。
 考え方そのものは2次元平面上の任意の凸多角形に適用できる。

構造体:
typedef struct TRIANGLE_tag // TRIANGLE_t …… 三角形
{
	POINT_t a;
	POINT_t b;
	POINT_t c;
} TRIANGLE_t;

関数:
//*********************************************************
// 点 p が三角形 t(a,b,c) に含まれるか調べる。
// 点 p が三角形 t の内側にある場合  1 を、
//      三角形 t の線上にある場合 -1 を、
//      三角形 t の外側にある場合  0 を返す。
//*********************************************************
int PointInTriangle( POINT_t *p, TRIANGLE_t *t )
{
	LINE_t ab, bc, ca;
	ab.a = t->a; ab.b = t->b;
	bc.a = t->b; bc.b = t->c;
	ca.a = t->c; ca.b = t->a;
	const int pab = side( p, &ab ); // 有向線分 ab から見た点 p の方向
	const int pbc = side( p, &bc ); // 有向線分 bc から見た点 p の方向
	const int pca = side( p, &ca ); // 有向線分 ca から見た点 p の方向

	// 三角形の内側にあれば正
	if ( (0 < pab) && (0 < pbc) && (0 < pca) )
		return 1; // 点 p が常に左側にある(時計回り)
	if ( (0 > pab) && (0 > pbc) && (0 > pca) )
		return 1; // 点 p が常に右側にある(反時計回り)

	// 三角形の線上にあれば負
	if ( (0 <= pab) && (0 <= pbc) && (0 <= pca) )
		return -1; // 点 p が常に左側にある(時計回り)
	if ( (0 >= pab) && (0 >= pbc) && (0 >= pca) )
		return -1; // 点 p が常に右側にある(反時計回り)

	// 三角形の外側にあれば 0
	return 0;
}//PointInTriangle

関連

点が有向線分の左右どちら側にあるか調べる
線分の交差判定


Google
ご意見・ご感想をお聞かせ下さい。匿名で送信できます。

 * 返信が必要な場合には postmaster@katsura-kotonoha.sakura.ne.jp へ直接メールしてください。

水無瀬 優 postmaster@katsura-kotonoha.sakura.ne.jp
『新妻LOVELY×CATION』を応援しています!