多角形問題の古典的なポイント。他の多角形を参照する 1 を返す各多角形のすべてのポイントを削除します。
int pnpoly(int npol, float *xp, float *yp, float x, float y)
{
int i, j, c = 0;
for (i = 0, j = npol-1; i < npol; j = i++) {
if ((((yp[i] <= y) && (y < yp[j])) ||
((yp[j] <= y) && (y < yp[i]))) &&
(x < (xp[j] - xp[i]) * (y - yp[i]) / (yp[j] - yp[i]) + xp[i]))
c = !c;
}
return c;
}
削除されたポイントで 2 つのパスを結合します。
手順全体の疑似コード:
define starPoly with 10 points
define simplePoly with 7 points
for each point in starPoly
if ( pnpoly( 7, simplePoly.Xs[], simplePoly.Ys[], point.x, point.y ) == 0 )
clipedStarPoly += point;
for each point in simplePoly
if ( pnpoly( 10, starPoly.Xs[], starPoly.Ys[], point.x, point.y ) == 0 )
clipedSimplePoly += point;
for each point in clipedStarPoly
solutionPoly += point;
for each point in clipedSimplePoly
solutionPoly += point;
solutionPoly += solutionPoly.point[0]
クリップされたポリゴンのエンドポイントをいじる必要がないと思われる場合は、ポイント テストからソリューション ポリゴンを直接構築するだけです。
ポイント イン ポリ テストにレイ トレーシングを使用する場合は、このページを参照してください。