2次元平面上の点 p が三角形 abc 内に位置するかどうかを調べる関数を作る。 構造体: 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 関連 | |