非凸多角形の処理は難しいので、おそらく、多角形を複数の凸多角形に分割することから始める必要があります。内角を使用して、コーナーが非凸である場所を決定し、これらのコーナーを最小限に含むカットを適用できます。しかし、おそらくmatlabは、使用できる三角測量アルゴリズムをサポートしています。
凸多角形ができたら、それらを半空間の交点と考えることができます。AとBが線にまたがる2つのコーナーであり、Pがグリッドポイントである場合、行列式の符号を使用できます。
| Ax Bx Px |
| Ay By Py |
| 1 1 1 |
線のどちら側にポイントがあるかを決定します。どの符号がポリゴンを歩き回る順序によって異なりますが、コーナーを順番に処理する場合、符号が変わらない限り、点Pは凸多角形内にあります。この定式化では、水平線または垂直線は特殊なケースではなく、パフォーマンスに優れ、正確さにも役立つ可能性のある分割もありません。
その方法を使用してすべてのグリッドポイントを反復処理したくない場合は、さまざまな最適化を考え出すことができます。 1つは、各ラインにまたがる2つのコーナーの外積A × Bを事前に計算することです。その外積と点Pの間の内積は、上記の行列式に等しい(つまり、det(A、B、P)=(A×B)・P)ので、完全な行列式の代わりに、3つを計算するだけで済みます。積と各ポイントラインの組み合わせの2つの合計。
これをさらに最適化する場合は、ブレゼンハムのラインアルゴリズムのようなものを見て、ポリゴンの境界にあるポイントを計算してから、一致する境界間の水平(または垂直)ライン上のすべてのポイントを単純に列挙することをお勧めします。ポイント。
整数またはその他の正確な数値を使用してすべての計算を実行しない限り、丸めの問題がこれらすべての主要な懸念事項になる可能性があります。境界点をカウントするかどうかを決定する必要があります。また、元のポリゴンの内側であるが、その凸部の境界上にある点を1回だけカウントするようにしてください。これに必要な労力は、入力がどのように見えるかに大きく依存します。