コーエン・サザーランドラインセグメンテーションアルゴリズムの学習と詳細な説明

コーエン・サザーランドラインセグメンテーションアルゴリズムの学習と詳細な説明

【二次元ラインカット】

ラインカットアルゴリズムは、一連のテスト交差計算を使用して、ラインセグメント全体またはその一部を保存できるかどうかを判断します。ラインセグメントとウィンドウ境界の交点は、ラインクリッピング関数の時間のかかる部分を計算します。したがって、交差の計算を減らすことが、ラインクロッピングアルゴリズムの主な目標です。

この目的のために、カットする前にテストして、ラインセグメントが完全にトリミングウィンドウの内側にあるか外側にあるかを判断します。ラインセグメントがウィンドウの内側で完全であると判断するのは簡単ですが、ラインセグメントがウィンドウの外側で完全に低いと判断するのはより困難です。

線分が完全にウィンドウの内側にあるか外側にあるかを判別できない場合は、交点を計算して、線分の一部がウィンドウの内側にあるかどうかを判別する必要があります。

【コーエン・サザーランドアルゴリズム入門】

Cohen-Sutherlandラインセグメンテーションアルゴリズムは、広く使用されている高速ラインセグメンテーションアルゴリズムです。このアルゴリズムは、初期テストを通じて交点の計算を減らし、それによってラインセグメンテーションアルゴリズムで使用される時間を減らします。

アルゴリズムは、エリアコードと呼ばれる4ビットのバイナリコードを各ラインセグメントのエンドポイントに割り当てます。各ビットは、エンドポイントが対応するクロップウィンドウ境界の内側か外側かを識別するために使用されます。

以下は、4ビットのバイナリコードの概略図です。一般的に、左から右に4321と番号が付けられており、トリミングウィンドウの上下左右に対応しています(上、下、左、右ではないことに注意してください)。

トリミングウィンドウの各境界は、2次元空間をウィンドウの内側と外側の2つの空間に分割します。次の図に示すように、4つのウィンドウ境界(境界が存在する線)は、平面を9つの領域に分割します。

9つの異なるエリアの端点には異なるエリアコードが割り当てられます。たとえば、トリミングウィンドウの左下隅のエリアのエンドポイントにはエリアコード0101が割り当てられ、クロップウィンドウのエンドポイントのエリアコードは0000です。

市外局番のビット値は、端点(x​​、y)の座標をトリミングウィンドウの境界と比較することによって決定されます。x <xminの場合、上の図のエリアコード1001、0001、0101のエリアと同様に、位置1は1です。他は似ています。

不等式テストの使用に加えて、ビット処理操作と次の2ステップ操作を使用して、エリアコードの値をより効率的に決定することもできます。

(1)終点と刃先の座標の差を計算します。

(2)各差によって計算された符号ビットを使用して、対応する値をエリアコードに設定します。

上記のバイナリコード図の順序で、ビット1はx-xw minの符号ビットに設定されビット2はxw min -xの符号ビットに設定され、ビット3はビットy-yw minの符号ビットに設定され、ビット4はyw minに設定されます。-y符号ビット。

[コーエン・サザーランドアルゴリズムの説明]

すべてのラインセグメントのエンドポイントに対してエリアコードが確立されると、どのラインセグメントが完全にトリミングウィンドウの内側にあり、どのラインセグメントが完全にウィンドウの外側にあるかをすばやく特定できます。

①線分は完全にウィンドウ内にあります。線分の両端のエリアコードは0000であり、そのような線分は予約されています。

②線分が完全に窓の外にある場合:線分の両端の市外局番の同じ位置のペアは1であり、そのような線分は破棄されます。

例:線分の一方の端点のエリアコードが1001で、もう一方の端点の面コードが0101の場合、この線分の両端がトリミング長方形の左側にあるため、この線分は破棄されます。これは、端点のエリアコードの最初のビットです。すべて1。

ラインセグメントがプログラムのウィンドウの内側にあるか外側にあるかの判断は、2つのエンドポイントの市外局番に対して論理OR演算を実行することです。操作結果が0000の場合、ラインセグメントは完全にクロップウィンドウ内にあり、このラインセグメントを保持して次のラインセグメントをテストします。2つのエンドポイントの市外局番の論理AND演算結果が真(0000ではない)の場合、ラインセグメントは完全にウィンドウの外側にあり、このラインセグメントは破棄されます。

③完全に窓の外側または内側にあると判断できない線分については、窓の境界との交点をテストする必要があります。

これらの線分は、ウィンドウの内側を通過する場合と通過しない場合があります。そのため、線分の切断を完了するために複数の交差操作が必要になる場合があり、交差数は切断境界の選択順序によって異なります。毎回切り取られたウィンドウ境界を処理した後、その一部が切り取られ、残りはウィンドウの他の境界に対してチェックされます。このプロセスは、線分が完全に切り取られるか、残りの線分が完全にトリミングウィンドウ内に収まるまで続きます。

以下では、下の図の2つのラインセグメントについて説明します。これらのラインセグメントは、ウィンドウの内外ですぐには判断できません。ウィンドウ境界の処理順序がleft、right、bottom、topであると仮定して、ラインセグメントがクロッピング境界と交差するかどうかを確認するには、ラインの両端でエリアコードの対応するビットを確認します。交差する。

上記のように、P1P2とP3P4は、ウィンドウの内側か外側かをすぐに判別できない2つの線分です。P1P2の最初の取引:

1.左ボーダー処理:

線分P1〜P2のエリアコードは0100と1001です。したがって、P1は左境界の内側にあり、P2は左境界の外側にあります。

次に、交点P2 'を計算し、点P2からP2'までパーツをトリミングします。

2.右ボーダー処理:

残りの線分は右側の境界内にあり、処理する必要はありません。

3.下限処理:

P1は下部境界の下にあり、P2 'は下部境界の上にあるので、この境界上の交点P1'を見つけ、P1からP1の部分をクリアします。

4.上限処理:

上部境界交点P2 ''の位置を決定し、上部境界より上の部分をトリミングし、P1からP2への内部セグメントを保存します。

次に、P3P4を処理します。

線分P3P4の場合、P3は左境界の外側にあり、P4は左境界の内側にあります。したがって、交点P3を計算し、「P3からP3への線分をクリアします」。

エンドポイントP3とP4のエリアコードをテストすると、残りのラインセグメントはすべてトリミングウィンドウの下にあるため、クリアされます。


参考資料:
1.「コンピュータグラフィックス:第3版」Cai Shijie、他翻訳電子産業プレス2010.7

                                </div>
元の記事を16件公開 いいね1 訪問数180

おすすめ

転載: blog.csdn.net/weixin_44931542/article/details/105562658