コンピュータグラフィックス - カッティング

アクション切断:
表示されるコンテンツ選択-窓部でグラフィックが示され、窓の外側部分は切り取られ
 、実質的に各グラフィカル要素がトリミングされるので、直接グラフィックスシステムの切断効率に影響を与えるパターン。

ウィンドウをクロッピング:矩形、凸多角形、多角形
:クリップタイプ三次元切削二次元の切断、
切断オブジェクト:線分、多角形、テキストおよび他の
切断方法:
切断線法:サザーランド-コーエンアルゴリズム、サイラス-ベックアルゴリズム、梁Youdong -Barskyをアルゴリズム
クリッピングポリゴン法:サザーランド-Hodgman、アルゴリズム
次元の切断方法:サザーランド-コーエンアルゴリズム、アルゴリズム梁Youdong -Barsky
 

、サザーランド・コーエンアルゴリズム

このアルゴリズムはまた、クリッピングコーディングアルゴリズムとして知られています

サザーランド・コーエンアルゴリズムは2つの部分に分かれています。

 

最初のステップ、決定:
1)完全にそのようなABとして完全に見える線分と呼ばれるウィンドウ内の直線セグメントに。保持
ウィンドウセグメントの外に完全にある)2を、例えばCDなどの完全に見えないラインをいいます。廃棄されました

プロセスは、IJ、KLとして、完全に可視又は完全に見えないラインであると判断することができない第二の工程は、
次に計算する*必要がある線分の交点と窓の境界線を、直線の交点を完全に不可視である一方は、2つのセクションに分割されラインは放棄されました。
*最初のステップは、これまでに確固たる結論を引き出すために直線セグメントの利用可能な残りの部分を決定するまで、再決意の残りの部分のための最初のステップとして、プロセスが繰り返されます。

図1は、完全に可視/不可視ライン決定されます

コンピュータをすることはすぐに関係の種類は、直線セグメントをすることができ、次のように窓は、必要なものを決定する符号化方法窓面の四方全体の9つの領域、使用して、各領域4つの符号化は言いました:

;左側の領域においてX = XL、第4ビット符号化は1である
3番目のビットはx = xRを右領域は、コードは1であり;
Yに=のyB下部領域符号化された第2のビットが1であります;
= YT上側Y領域において、第1の符号化されたビットが1です。


 

私はどのように伝えることができますか?
セグメントの二つのエンドポイントは地域コードを切断します。

それはコード領域内にある場合、完全に目に見える線分である0000(位相)であり;
2つの符号化論理が0000でない場合、このセグメントは完全に見えません

図2に示すように、プロセスは、完全に目に見える、または完全に見えないセグメントについて結論付けることはできません

KをコードポイントK(1001)から、例えば、線分KLは、xの左側に分析= XL、及びX = xLのKLは限り、交差点をM、KM見かけ上完全に見えなく決定され、交差点を有するものMLは、第一段階から、上記の処理を繰り返します。
MLの結論はまだ最初のステップを使用することができないので、符号化されたからM Mは、Yが見出さ= YT上側、したがってMLおよびy = YT N.の交差点を必要

NLが収穫の終わりをもたらし、完全に表示されていると結論付けることができる方法の最初のステップのためにMN、NLを失いました。

 

図3に示すように、プログラムコード

フロートXL、XR、YT、YB。
符号なしchar型コード(フロート X、フロートY)
{
    符号なしチャー C = 0 もし(X < XL)
        C = C | 1;   // ビット単位または
    他の IF(X> XR)
        C = C | 2 もし(Y < YB)
        C = C | 4 それ以外の 場合(Y> YT)
        C = C | 8 リターンC;
} // 9つのコードする領域に
ボイドクリップ(フロート X0、フロート YO、フロート X2、フロートY2) 

{
    符号なしchar型C1、C2、C。
    フロートX、Y、WX、WY。
    C1 = コード(X0、Y0)。
    C2 = コード(X2、Y2)。
    しばらく((!(C1 == 0))||(!(C2 == 0 )))
    {
        IF((C1およびC2))
             のリターン ; // 両端点と論理が0でない場合、領域外、カットする 
        C = C1と、
         IF(C == 0 
            C =のC2;
        WX = x2- X0;
        WY = Y2- Y0;
        もし((C&1)== 1 
        {
            Y = Y0 + WY *(XL - X0)/ WX。
            X = XL。
        } // 左XLの端、交差点XLを見つけます

        それ以外の 場合((C&2)== 2 
        {
            Y = Y0 + WY *(XR - X0)/ WX。
            X = XR。
        } // 交差点XRを見つけ、右XRで終了

        それ以外の 場合((C&4)== 4 
        {
            X = X0 + WX *(YB - Y0)/ WY。
            及び = B。
        } // YB以下のエンドポイントは、交差点YBを見つけます

        それ以外の 場合((C&8)== 8 
        {
            X = X0 + WX *(YT - Y0)/ WY。
            そして = T;
        } // YT上記エンドポイント、YTは、交差点を見つけます

        もし(C == C1)
        {
            X0の =のX。
            Y0 = Y。
            C1 = コード(X0、Y0)。
        }
        
        {
            ×2 =のX;
            Y2 = Y。
            C2 = コード(X2、Y2)。
        } // エンドポイントの交差点の代わりに使用し、その後、最初のステップに戻る 
    } // 一方() 
    glLine(INT(X0)、INT(YO)、INT(X2)、INT (Y2))。
}

4.まとめ

場合ウィンドウ境界線は効率が低い切断との交点を有しながらコーエン・サザーランドラインクリッピングアルゴリズムは、境界の収穫高効率と交差しません。

両方の場合に切断するため、より適した:最初に、ラインの大部分が完全に表示されている。第二は、最もセグメントに完全に見えません。

そして、多くの時間は、唯一の線分は、延長線が線分を完全に破棄することができるので、最終的には、無効な操作交差点を見つけるために、ウィンドウの境界線と交差するクリップされ;およびカットラインは、ウィンドウの境界線と交差し、より複雑な交差点をしたとき。

例えば、下図の切断など、この赤い線は、クリッピング窓の外側に完全であるが、計算アルゴリズムの必要性は、最後の行は完全に破棄されます!

 

第二に、中間点のアルゴリズムを分離します

パーティションの中間点アルゴリズムは、サザーランド・コーエンを求めて交差点アルゴリズムの側面を改良したものです。

核となるアイデアは、半分の交差点に接近して、ウィンドウの直線区間を決定することです。

線分の中点を取ります

1、中点がウィンドウ内にない場合、ラインを入れ、ウィンドウの境界線の中点から落下線分とシーク線分再構成点の中点上の別のポイントツーポイント遠い構成

図2に示すように、ウィンドウの中間点、最遠点及び中点再び構成セグメント、及び所定の誤差範囲内で等しいウィンドウエッジの中点の座標値になるまで、点を決定するよう

 

セグメント長はあきらめε小数未満になるまで処理を繰り返します。
場合望ましいεピクセル幅にディスプレイ2の解像度のためのN ×2 Nディスプレイ、限りN倍にトークプロセスアップの上半分



 

おすすめ

転載: www.cnblogs.com/wkfvawl/p/11704803.html