專利名稱:矩形窗口中橢圓曲線的快速裁剪方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種橢圓弧裁剪方法,且特別涉及一種矩形窗口中橢圓曲線的快速裁剪方法。
背景技術(shù):
交互式圖形系統(tǒng)中,往往使用鼠標(biāo)拖動(dòng)產(chǎn)生的矩形窗口來選擇需要進(jìn)行縮放的圖形部分,當(dāng)這部分圖形被選中以后,圖形系統(tǒng)需要迅速的將它從原圖中分離出來,并做放大或縮小處理。這個(gè)過程中就會(huì)涉及到矩形窗口中圖形的裁剪問題。作為計(jì)算機(jī)圖形學(xué)中的基礎(chǔ)算法之一,線裁剪算法直接關(guān)系到圖形系統(tǒng)的效率。在矩形窗口對直線段線裁剪方面,已經(jīng)出現(xiàn)了很多經(jīng)典的算法,如基于編碼技術(shù)的Cohen-Sutherland算法、基于參數(shù)化方法的Liang-Barsky算法、基于幾何變換的Nicholl-Lee-Nicholl算法,及基于對 Nicholl-Lee-Nicholl改進(jìn)的ELC算法和FLC算法等。相對于直線段的裁剪,圓弧及橢圓弧相關(guān)的裁剪算法比較少,大部分圓弧裁剪算法都是通過求解一元二次方程來實(shí)現(xiàn)的,計(jì)算非常復(fù)雜。相比于圓弧,橢圓弧的代數(shù)方程更加復(fù)雜,使得基于代數(shù)方法的裁剪效率更低, 較難滿足復(fù)雜工程應(yīng)用、大數(shù)據(jù)量實(shí)時(shí)繪制等需求。
研究發(fā)現(xiàn),相關(guān)性測試和橢圓弧-直線求交操作是圓弧裁剪處理的兩個(gè)重要方面。一般地,橢圓弧與窗口邊實(shí)際上不相交的概率較大。相關(guān)性測試用于快速排除完全在窗口外的圓弧或保留完全在窗口內(nèi)的圓弧,以避免不必要的橢圓弧-矩形窗口的求交計(jì)算。因此,快速圓弧裁剪方法的關(guān)鍵在于1)盡多、盡快地判定完全在窗口外的橢圓弧并加以排除;幻盡多、盡快地判定完全在窗口內(nèi)的橢圓弧并加以保留;;3)對無法排除或保留的橢圓弧,應(yīng)明確需要與其求交的矩形窗口的邊,快速求出交點(diǎn),并獲取最終裁剪結(jié)果。但是在實(shí)際的研究過程中仍發(fā)現(xiàn)橢圓弧包圍盒、矩形窗口端點(diǎn)可用于橢圓弧相關(guān)性測試,但具有如下困難1)橢圓弧的非線性特點(diǎn)帶來額外的包圍盒計(jì)算開銷,包圍盒計(jì)算困難,較難盡快地排除和保留;幻橢圓弧包圍盒一般較大,較難盡可能多地排除或保留;3)即使橢圓弧兩端點(diǎn)均落在矩形窗口內(nèi),橢圓弧仍可能和窗口相交,較難做到盡可能多的保留;4)即使橢圓弧兩端點(diǎn)均落在矩形窗口外,圓弧也可能和窗口相交,較難做到盡可能多的排除。發(fā)明內(nèi)容
發(fā)明目的本發(fā)明所要解決的技術(shù)問題是針對現(xiàn)有技術(shù)的不足,提供一種矩形窗口中橢圓曲線的快速裁剪方法。
為了解決上述技術(shù)問題,本發(fā)明公開了一種矩形窗口中橢圓曲線的快速裁剪方法,包括以下步驟
步驟1 輸入矩形窗口的坐標(biāo),包括矩形窗口左上角頂點(diǎn)和右下角頂點(diǎn)的坐標(biāo);
步驟2 輸入待裁剪的橢圓弧的坐標(biāo),包括了橢圓弧的起點(diǎn)坐標(biāo)、終點(diǎn)坐標(biāo)以及橢圓弧的長軸和水平坐標(biāo)軸的夾角;
步驟3 以橢圓弧起點(diǎn)坐標(biāo)和終點(diǎn)坐標(biāo),根據(jù)橢圓弧所屬橢圓為正則橢圓或非正則橢圓查整體包圍盒表獲得橢圓弧的整體包圍盒,所述整體包圍盒查詢表包括正則橢圓整體包圍盒查詢表和非正則橢圓整體包圍盒查詢表;
步驟4 比較所述橢圓弧整體包圍盒和矩形窗口,判斷橢圓弧整體包圍盒是否位于矩形窗口內(nèi),若結(jié)果為是,則輸出該橢圓弧,并轉(zhuǎn)入步驟23,否則進(jìn)行步驟5 ;
步驟5 比較該橢圓弧整體包圍盒與矩形窗口,判斷橢圓弧整體包圍盒是否位于矩形窗口外,若結(jié)果為是,則舍棄該待裁剪的橢圓弧,并轉(zhuǎn)入步驟23,否則進(jìn)行步驟6 ;
步驟6 將待裁剪橢圓弧根據(jù)四個(gè)象限分割為多個(gè)象限橢圓弧段,橢圓弧落在幾個(gè)象限內(nèi)就被坐標(biāo)軸分割為對應(yīng)個(gè)數(shù)的象限橢圓弧段;
步驟7 根據(jù)待裁剪橢圓弧起點(diǎn)坐標(biāo)、終點(diǎn)坐標(biāo),查象限橢圓弧段表獲得各分割后的象限橢圓弧段及其對應(yīng)的象限橢圓弧段包圍盒;
步驟8 比較各象限橢圓弧段包圍盒與矩形窗口,若各象限橢圓弧段包圍盒均在矩形窗口外,則舍棄待裁剪橢圓弧,并轉(zhuǎn)入步驟23,否則進(jìn)行步驟9 ;
步驟9,根據(jù)矩形窗口上邊界、下邊界、左邊界及右邊界的延長線將坐標(biāo)系分為九個(gè)分區(qū),由上至下、由左至右分別依次編碼為1區(qū)到9區(qū);
步驟10,遍歷各分割后的象限橢圓弧段,取各個(gè)象限橢圓弧段的起點(diǎn)坐標(biāo)、終點(diǎn)坐標(biāo),確定起點(diǎn)、終點(diǎn)所在分區(qū)的編碼;
步驟11 判斷橢圓弧所屬橢圓是否為正則橢圓,如果是正則橢圓,則轉(zhuǎn)到步驟12, 否則轉(zhuǎn)步驟14 ;
步驟12 根據(jù)各個(gè)象限橢圓弧段起點(diǎn)、終點(diǎn)所在分區(qū),及矩形窗口與各象限橢圓弧段的關(guān)系,判斷各個(gè)象限橢圓弧段是否在矩形窗口外,如果是,則舍棄該待裁剪的橢圓弧,并轉(zhuǎn)入步驟23,否則轉(zhuǎn)步驟13 ;
步驟13:根據(jù)點(diǎn) P1(0. 25A,0. 6124B)、點(diǎn) P2 (0. 5A,0. 866B)、點(diǎn) P3(0. 7071A, 0. 7071B)、點(diǎn)P4(0. 866A,0. 5B)將象限橢圓弧段分成子段;其中A是橢圓長軸的長度,B是短軸的長度;
步聚14 將點(diǎn) P1(0. 25A,0. 6124B)、點(diǎn) P2 (0. 5A,0. 866B)、點(diǎn) P3(0.7071A, 0. 7071B)、點(diǎn)P4(0. 866A,0. 5B)旋轉(zhuǎn)至待裁剪橢圓弧所屬的橢圓上作為分段點(diǎn),將非正則橢圓弧分成子段;
步驟15 查子段包圍盒表得到各子段的包圍盒;所述子段包圍盒表包括子段包圍盒的總表、包含始點(diǎn)的非完整橢圓弧子段包圍盒修改表以及包含終點(diǎn)的非完整橢圓弧子段包圍盒修改表三個(gè)表;
步驟16 比較橢圓弧各子段的包圍盒與矩形窗口,若各子段均在矩形窗口外,則舍棄待裁剪橢圓弧,并轉(zhuǎn)入步驟23,否則進(jìn)行步驟17 ;
步驟17 將橢圓弧各子段按比例變換到規(guī)范化坐標(biāo)空間的半徑為R的圓弧,即使橢圓長軸與短軸長度等同于圓弧半徑R,矩形窗口按照相同的比例變換;
步驟18 對矩形窗口左右兩邊界的X坐標(biāo)和矩形窗口上下兩邊界的Y坐標(biāo)作比例變換,比例因子為1024/R,所述X坐標(biāo)和Y坐標(biāo)分別為標(biāo)準(zhǔn)坐標(biāo)系中的橫坐標(biāo)和縱坐標(biāo);矩形窗口左右兩邊界和上下兩邊界的求交順序根據(jù)求交順序表來確定;
步驟19 根據(jù)變換后的X坐標(biāo)和Y坐標(biāo)查規(guī)范化圓弧直線交點(diǎn)的坐標(biāo)表,獲得規(guī)范化圓弧直線交點(diǎn)坐標(biāo),即Y坐標(biāo)和χ坐標(biāo);
步驟20 對所述坐標(biāo)實(shí)施反比例變換,得到圓弧直線實(shí)際交點(diǎn)坐標(biāo),比例因子為 R/1024 ;
步驟21 根據(jù)圓弧直線實(shí)際交點(diǎn)坐標(biāo),對所輸入圓弧進(jìn)行裁剪;
步驟22 將規(guī)范化圓反比例變換為橢圓,得到一個(gè)或多個(gè)橢圓弧段;
步驟23 輸出并顯示最終裁剪結(jié)果。
本發(fā)明中,所輸入的待裁剪橢圓弧為逆時(shí)針方向,由其橢圓心、長軸與水平坐標(biāo)軸的夾角、始點(diǎn)和終點(diǎn)描述,且經(jīng)過平移后將坐標(biāo)軸原點(diǎn)設(shè)定于待裁剪橢圓弧的圓心。
有益效果克服了代數(shù)運(yùn)算的復(fù)雜低效的問題;通過查表法提高了橢圓包圍盒的計(jì)算效率;通過將橢圓弧逐步細(xì)分為子段盡可能多的排除了不相關(guān)的橢圓弧段,在每一步分解中盡可能多的保留了相關(guān)橢圓弧段,從而減少了進(jìn)一步細(xì)分時(shí)的計(jì)算。整個(gè)算法提高了橢圓弧的裁剪效率,減少了多余的計(jì)算開銷。
下面結(jié)合附圖和具體實(shí)施方式
對本發(fā)明做更進(jìn)一步的具體說明,本發(fā)明的上述和 /或其他方面的優(yōu)點(diǎn)將會(huì)變得更加清楚。
圖1表示本發(fā)明的工作流程圖。
圖2表示通過象限橢圓弧段分割來完成相關(guān)性測試的例子。
圖3表示矩形窗口分區(qū)及兩個(gè)通過矩形窗口右上/左下頂點(diǎn)內(nèi)外測試排除不相關(guān)象限橢圓弧段的例子。
圖4表示非正則橢圓劃分子段的例子。
具體實(shí)施方式
如圖1所示,本發(fā)明提供一種矩形窗口中的橢圓弧快速裁剪方法,該方法包括以下步驟
步驟1 輸入矩形窗口的坐標(biāo),包括矩形窗口左上角頂點(diǎn)和右下角頂點(diǎn)的坐標(biāo);
步驟2 輸入待裁剪橢圓弧的坐標(biāo),包括了橢圓弧的起點(diǎn)坐標(biāo)、終點(diǎn)坐標(biāo)以及橢圓弧的長軸和水平坐標(biāo)軸的夾角;
步驟3 以橢圓弧起點(diǎn)和終點(diǎn)坐標(biāo),根據(jù)橢圓弧所屬橢圓為正則橢圓或非正則橢圓查整體包圍盒表獲得橢圓弧的整體包圍盒,所述整體包圍盒查詢表包括正則橢圓整體包圍盒查詢表(表1)和非正則橢圓整體包圍盒查詢表(表2);
步驟4 比較所述圓弧整體包圍盒和矩形窗口,判斷橢圓弧整體包圍盒是否位于矩形窗口內(nèi),若結(jié)果為是,則輸出該橢圓弧,并轉(zhuǎn)入步驟23,否則進(jìn)行步驟5 ;
步驟5 比較該橢圓弧整體包圍盒與矩形窗口,判斷橢圓弧整體包圍盒是否位于矩形窗口外,若結(jié)果為是,則舍棄該橢圓弧,并轉(zhuǎn)入步驟23,否則進(jìn)行步驟6 ;
步驟6 將待裁剪橢圓弧根據(jù)四個(gè)象限分割為多個(gè)象限橢圓弧段,橢圓弧落在幾個(gè)象限內(nèi)就被坐標(biāo)軸分割為對應(yīng)個(gè)數(shù)的象限橢圓弧段;
步驟7 根據(jù)待裁剪圓弧起點(diǎn)坐標(biāo)、終點(diǎn)坐標(biāo),查象限橢圓弧段表(表幻獲得各分割后的象限橢圓弧段及其對應(yīng)的象限橢圓弧段包圍盒;
步驟8 比較各象限橢圓弧段包圍盒與矩形窗口,若各象限橢圓弧段包圍盒均在矩形窗口外,則舍棄待裁剪橢圓弧,并轉(zhuǎn)入步驟23,否則進(jìn)行步驟9 ;
步驟9,根據(jù)矩形窗口上邊界、下邊界、左邊界及右邊界的延長線將坐標(biāo)系分為九個(gè)分區(qū),由上至下、由左至右分別依次編碼為1區(qū)到9區(qū),如圖3 ;
步驟10,遍歷各分割后的象限橢圓弧段,取各個(gè)象限橢圓弧段的起點(diǎn)坐標(biāo)、終點(diǎn)坐標(biāo),確定起點(diǎn)、終點(diǎn)所在分區(qū)的編碼;步驟11 判斷橢圓弧所屬橢圓是否為正則橢圓,如果是正則橢圓,則轉(zhuǎn)到步驟12,如果不是則轉(zhuǎn)步驟14 ;
步驟12 根據(jù)各個(gè)象限橢圓弧段起點(diǎn)、終點(diǎn)所在分區(qū),及矩形窗口與各象限橢圓弧段的關(guān)系,判斷各個(gè)象限橢圓弧段是否在矩形窗口外,如果是,則舍棄該橢圓弧,并轉(zhuǎn)入步驟23,否則轉(zhuǎn)步驟13;
步驟13 根據(jù)點(diǎn) Pl (0. 25A, 0. 6124B)、點(diǎn) P2 (0. 5A, 0. 866B)、點(diǎn) P3 (0. 7071A, 0. 7071B)、點(diǎn)P4(0. 866A,0. 5B)將象限橢圓弧段分成子段;其中A是橢圓長軸的長度,B是短軸的長度;
步驟14 將點(diǎn) P1(0. 25A,0. 6124B)、點(diǎn) P2 (0· 5A,0· 866B)、點(diǎn) Ρ3(0·7071Α, 0. 7071Β)、點(diǎn)Ρ4(0. 866Α,0. 5Β)旋轉(zhuǎn)至待裁剪橢圓弧所屬的橢圓上作為分段點(diǎn),將非正則橢圓弧分成子段;
步驟15 查子段包圍盒表得到各子段的包圍盒;所述子段包圍盒表包括子段包圍盒的總表(表6)、包含始點(diǎn)的非完整橢圓弧子段包圍盒修改表(表7)以及包含終點(diǎn)的非完整橢圓弧子段包圍盒修改表三個(gè)表(表8);
步驟16 比較橢圓弧各子段的包圍盒與矩形窗口,若各子段均在矩形窗口外,則舍棄待裁剪橢圓弧,并轉(zhuǎn)入步驟23,否則進(jìn)行步驟17 ;
步驟17 將橢圓弧段按比例變換到規(guī)范化坐標(biāo)空間的半徑為R的圓弧,即使橢圓長軸與短軸長度等同于圓弧半徑R,矩形窗口按照相同的比例變換到相應(yīng)位置;
步驟18 對矩形窗口左右兩邊界的X坐標(biāo)和矩形窗口上下兩邊界的Y坐標(biāo)作比例變換,比例因子為1024/R,所述X坐標(biāo)和Y坐標(biāo)分別為標(biāo)準(zhǔn)坐標(biāo)系中的橫坐標(biāo)和縱坐標(biāo);矩形窗口左右兩邊界和上下兩邊界的求交順序根據(jù)求交順序表(表9)來確定;
步驟19 根據(jù)變換后的X坐標(biāo)和Y坐標(biāo)查規(guī)范化圓弧直線交點(diǎn)的坐標(biāo)表(表10), 獲得規(guī)范化圓弧直線交點(diǎn)坐標(biāo),即Y坐標(biāo)和X坐標(biāo);
步驟20 對所述坐標(biāo)實(shí)施反比例變換,得到圓弧與直線的實(shí)際交點(diǎn)坐標(biāo),比例因子為R/10M(其中除以IOM的操作通過將y坐標(biāo)的二進(jìn)制形式右移10位后換算實(shí)現(xiàn));
步驟21 根據(jù)圓弧直線實(shí)際交點(diǎn)坐標(biāo),對圓弧進(jìn)行裁剪;
步驟22 將規(guī)范化圓反比例變換為橢圓,得到一個(gè)或多個(gè)橢圓弧段;
步驟23 輸出并顯示最終裁剪結(jié)果。
步驟2中初始所輸入的待裁剪橢圓弧為逆時(shí)針方向,由其橢圓心、長軸與水平坐標(biāo)軸的夾角、始點(diǎn)和終點(diǎn)描述,且經(jīng)過平移后將坐標(biāo)軸原點(diǎn)設(shè)定于待裁剪橢圓弧的圓心。
步驟3通過查表法獲得橢圓弧的整體包圍盒,正則橢圓根據(jù)正則橢圓整體包圍盒查詢表(表1)進(jìn)行查表,其步驟如下1)判定橢圓弧起APs(Xs,ys)與終點(diǎn)Pe(Xe,ye)所在象限,以此作為查詢條件;2)對始、終點(diǎn)的某些組合,比較^與^,以作為查詢的附加條件; 3)根據(jù)表1給出的規(guī)則快速獲取任意圓弧的整體包圍盒。
非正則橢圓根據(jù)表2進(jìn)行查表,其步驟如下1)判定橢圓弧起點(diǎn)Ps(xs,ys)與終點(diǎn)Pe(xe, ye)所在象限,以及Ps和Pe各自的X、Y坐標(biāo)所滿足的條件作為查詢條件;2)對始點(diǎn)、 終點(diǎn)的某些組合,比較^與^,以作為查詢的附加條件;3)根據(jù)表2給出的規(guī)則快速獲取任意橢圓弧的整體包圍盒。
步驟4、5利用橢圓弧整體包圍盒作相關(guān)性測試,若該整體包圍盒位于矩形窗口內(nèi),則直接輸出該橢圓弧、本次裁剪結(jié)束;若該整體包圍盒完全位于矩形窗口外,則直接舍棄該橢圓弧、本次裁剪結(jié)束。設(shè)橢圓弧整體包圍盒為(Xleft,yb。t,Xright' yt。p),矩形窗口為 (Xleft' Ybof Xright' Yt。P),則橢圓弧整體包圍盒的相關(guān)性測試為
(1)若以下條件符合,則橢圓弧整體包圍盒在矩形窗口同一邊的外側(cè),應(yīng)予以舍棄
(xright < Xlfet) V (xleft > Xright) V (ybot > Ytop) V (ytop < Ybot)
(2)若以下條件符合,則橢圓弧整體包圍盒落在矩形窗口內(nèi)部,應(yīng)予以保留
(Xleft > Xleft) Λ (Xright < Xright) Λ (ybot > Ybot) Λ (ytop < Ytop)
步驟6將無法通過整體包圍盒排除的橢圓弧進(jìn)一步分割為若干個(gè)象限橢圓弧段。 圖2給出了一個(gè)例子,其中待裁剪橢圓弧的整體包圍盒較大,與矩形窗口重疊,因而無法排除。分割為三個(gè)象限橢圓弧段%及^3后,由于所有象限橢圓弧段的包圍盒與窗口均不重疊,因而可判定原橢圓弧與窗口不相關(guān)。
給定任意橢圓弧,步驟7獲取其各象限橢圓弧段的劃分及象限橢圓弧段包圍盒。 為避免象限橢圓弧段及其包圍盒生成的計(jì)算開銷,可同樣由查表法快速獲取,其步驟如下 1)判定圓弧始點(diǎn)Ps(xs,ys)與終點(diǎn)Pe(xe,ye)所在象限,以此作為查詢條件;2)對始、終點(diǎn)的某些組合,比較^與^,以作為查詢的附加條件;;3)根據(jù)預(yù)定義表5給出的規(guī)則獲取其象限橢圓弧段分段及各象限橢圓弧段包圍盒。
步驟8利用象限橢圓弧段的單調(diào)性,對各象限橢圓弧段進(jìn)行快速相關(guān)性測試。以某象限橢圓弧段為例,設(shè)其始點(diǎn)為Psij (xsiJ,ysiJ),終點(diǎn)為Peij (xeiJ, yeiJ),則其相關(guān)性測試方法如下
一、若Psij及Peij均在矩形窗口(Xleft,Ybot, Xright, Ytop)內(nèi),則保留該象限橢圓弧段;
二、按以下條件對象限橢圓弧段進(jìn)行相關(guān)性測試
1、若aij位于第1象限,且其始點(diǎn)在矩形窗口上側(cè)(ysij > Ytop),或始點(diǎn)在矩形窗口左側(cè)Usij < )(left),或終點(diǎn)在矩形窗口下側(cè)(yeij < Yb。t),或終點(diǎn)在矩形窗口右側(cè)Ueij > Xright),則排除 Bij ;
2、若aij位于第2象限,且其始點(diǎn)在矩形窗口下側(cè)(ysij < Ybot),或始點(diǎn)在矩形窗口左側(cè)Usij < )(left),或終點(diǎn)在矩形窗口上側(cè)(yeij > Yt。p),或終點(diǎn)在矩形窗口右側(cè)Ueij > Xright),則排除 Bij ;
3、若aij位于第3象限,且其始點(diǎn)在矩形窗口下側(cè)(ysij < Ybot),或始點(diǎn)在矩形窗口右側(cè)(Xsij > Xright),或終點(diǎn)在矩形窗口上側(cè)(yeij>Yt。P),或終點(diǎn)在矩形窗口左側(cè)(Xeij <)(lrft),則排除 aiJ;
4、若aij位于第4象限,且其始點(diǎn)在矩形窗口上側(cè)(ysij > Ytop),或始點(diǎn)在矩形窗口右側(cè)(XsijSXright),或終點(diǎn)在矩形窗口下側(cè)(yeij<Yb。t),或終點(diǎn)在矩形窗口左側(cè)(Xeij <)(lrft),則排除 aiJ;
三、若Psij及Peij中有且僅有一個(gè)在矩形窗口內(nèi),則留待后續(xù)求交處理;
四、其它情況需作進(jìn)一步的相關(guān)性測試。
若所給橢圓弧所有象限橢圓弧段均被排除,則舍棄該橢圓弧、本次裁剪結(jié)束。
步驟9判斷橢圓弧所屬的橢圓是否為正則橢圓,若為正則橢圓則轉(zhuǎn)到步驟10,否則轉(zhuǎn)到步驟14。
步驟10按矩形窗口邊界進(jìn)行分區(qū),分區(qū)編碼見圖3,根據(jù)矩形窗口上邊界、下邊界、左邊界及右邊界的延長線將坐標(biāo)系分為九個(gè)分區(qū),由上至下、由左至右分別依次編碼為 1區(qū)到9區(qū);
步驟11進(jìn)一步遍歷步驟8無法排除的象限橢圓弧,分別確定各象限橢圓弧起點(diǎn)和終點(diǎn)的分區(qū)編碼。然后步驟12根據(jù)各橢圓弧始、終點(diǎn)分區(qū)編碼情況,分別對矩形窗口右上或左下頂點(diǎn)作內(nèi)外檢測,以判斷是否應(yīng)排除該象限橢圓弧段,具體方法是對在第I象限的象限橢圓弧段(a)如果其起點(diǎn)或終點(diǎn)之一在5區(qū),該橢圓弧段不能排除、需保留以便后續(xù)求交才能完成裁剪;(b)如果其起點(diǎn)在6區(qū)、終點(diǎn)在1區(qū),或起點(diǎn)在6區(qū)、終點(diǎn)在2區(qū),或起點(diǎn)在9區(qū)、終點(diǎn)在2區(qū),且當(dāng)該象限橢圓弧段在窗口右上頂點(diǎn)外繞過,即矩形窗口右上頂點(diǎn)在橢圓弧段內(nèi)側(cè)時(shí),該橢圓弧段與窗口無交點(diǎn)、應(yīng)排除;(c)如果其起點(diǎn)在8區(qū)、終點(diǎn)在1 區(qū),或起點(diǎn)在8區(qū)、終點(diǎn)在4區(qū),或起點(diǎn)在9區(qū)、終點(diǎn)在4區(qū),且當(dāng)該橢圓弧段在窗口左下頂點(diǎn)外繞過,即矩形窗口左下頂點(diǎn)在橢圓弧段外側(cè)時(shí),該橢圓弧段與窗口無交點(diǎn)、應(yīng)排除;⑷ 其它情況下該橢圓弧應(yīng)直接排除。當(dāng)象限橢圓弧段在第II象限時(shí),將該象限橢圓弧段的圓心、起點(diǎn)、始點(diǎn)坐標(biāo)及矩形窗口頂點(diǎn)坐標(biāo)作如下變換
χ,= -χ,y' = y
其中(X,y)為變換前的點(diǎn),(χ’,γ’ )為變換后的點(diǎn),然后交換變換后位于第I象限的象限橢圓弧段的起點(diǎn)、終點(diǎn)次序,并按第I象限內(nèi)的象限橢圓弧段快速排除方法排除; 當(dāng)象限橢圓弧段在第III象限時(shí),將該象限橢圓弧段的圓心、起點(diǎn)、始點(diǎn)坐標(biāo)及矩形窗口頂點(diǎn)坐標(biāo)作如下變換
χ,= -χ,f = -y
從而將該象限橢圓弧段變換至第I象限后,按第I象限內(nèi)的象限橢圓弧段快速排除方法排除。當(dāng)象限橢圓弧段在第IV象限時(shí),將該象限橢圓弧段的圓心、起點(diǎn)、始點(diǎn)坐標(biāo)及矩形窗口頂點(diǎn)坐標(biāo)作如下變換
χ,= X,y,= -y
然后交換變換后位于第I象限的象限橢圓弧段的起點(diǎn)、終點(diǎn)次序,并按第I象限內(nèi)的象限橢圓弧段快速排除方法排除。
不管是橢圓弧整體,還是各象限橢圓弧段的包圍盒,都包含大塊的空自區(qū),造成許多無關(guān)的情況無法簡單地排除,從而需要通過求交來排除,耗費(fèi)較多時(shí)間。解決的辦法是將無法簡單地排除的橢圓弧通過進(jìn)一步分段來排除。步驟13和步驟14分別對沒能在步驟8 被排除的正則橢圓弧和非正則橢圓弧進(jìn)行分段處理。
對于正則橢圓而言,在步驟13中,完整的象限橢圓弧被分成四個(gè)子段,分段點(diǎn)分別為點(diǎn) Pl (0. 25Α,0· 61ΜΒ)、點(diǎn) Ρ2(0. 5Α,0· 866Β)、點(diǎn) Ρ3(0. 7071Α,0. 7071Β)、點(diǎn) Ρ4 (0· 866Α,0.5Β)。直接用分段點(diǎn)形成包圍盒的計(jì)算量太大,可通過查表法獲得子段包圍盒。表6為完整的象限橢圓弧段的子段查找表。查表步驟如下1)獲得橢圓弧子段所在的象限作為查詢條件;2)以橢圓弧子段上所有點(diǎn)的X坐標(biāo)范圍作為進(jìn)一步的查詢條件;幻根據(jù)表中給出的子段包圍盒規(guī)則得到橢圓弧子段的包圍盒。非完整橢圓弧段是包含橢圓弧始點(diǎn)或終點(diǎn)的象限橢圓弧段,對于非完整橢圓弧段,通過查表7、表8修正橢圓弧子段的包圍盒。劃分子段后,一個(gè)象限橢圓弧段的所有子段包圍盒均在裁剪矩形之外時(shí),該象限橢圓弧段可直接排除。
對于非正則橢圓而言,在步驟14中,將正則橢圓中點(diǎn)Pl (0. 25A,0. 6124B),點(diǎn) Ρ2(0· 5Α,0· 866Β),點(diǎn) Ρ3 (0. 7071Α,0. 707IB),點(diǎn) P4 (0. 866Α,0· 5Β)這四個(gè)點(diǎn)做旋轉(zhuǎn)后作為分段點(diǎn)。旋轉(zhuǎn)的角度為將正則橢圓旋轉(zhuǎn)到待裁剪橢圓的位置所需要的角度。
為減少乘法,使用前述類似辦法用加減法獲得A或B的小數(shù)倍來減少計(jì)算。為了確保精度,段間可略有覆蓋,視不同位置用一個(gè)小斜線,如圖4。旋轉(zhuǎn)后的分段點(diǎn)與最高、右、 左、低點(diǎn)順序可能隨旋轉(zhuǎn)角而變化,需要進(jìn)行判定。旋轉(zhuǎn)后的點(diǎn)計(jì)算公式如下,其中Pqx、Pqy 分別是旋轉(zhuǎn)前的點(diǎn)的χ、y坐標(biāo),Phx, phy分別是旋轉(zhuǎn)后的點(diǎn)的χ、y坐標(biāo)
Phx = PqxCOS α -PqySIN α
Phy = PqxSIN α +PqyCOS α
SINa和COS α可通過查常用角度三角函數(shù)表(表3)獲得。
步驟17、18、19、20、21、22通過查表法快速獲取通過求交才能完成裁剪的圓弧的交點(diǎn)并完成裁剪。在象限橢圓弧段與窗口某邊求交時(shí),步驟17首先將橢圓弧變換為規(guī)范化圓弧,即將橢圓弧端點(diǎn)和窗口邊坐標(biāo)按比例變換到規(guī)范化坐標(biāo)空間的圓弧(如A、B變成 512)。步驟22將查表求交后得到標(biāo)準(zhǔn)化圓弧反比例變換回原橢圓弧,即步驟17和步驟22 先后各做了一次乘法,最后裁剪出的新端點(diǎn)也要反比例變換回去。
設(shè)橢圓弧長軸為A,短軸為B,將橢圓弧按比例變換為規(guī)范化圓后其半徑為R,始、 終點(diǎn)X坐標(biāo)分別為X1和&,矩形窗口右上頂點(diǎn)坐標(biāo)為(XHhgt,Tt。p),則其求交步驟如下
1、變換Xrihgt ·Χ rihgt = Xrihgt*1024/R ;(乘以10 的操作通過左移10位實(shí)現(xiàn),完全整數(shù)運(yùn)算)
2、用X’ rihgt作表4地址(左欄),查右欄結(jié)果Y’ cross ;
3、逆變換得交點(diǎn)的縱坐標(biāo)Y。rass = Y'cross*R/1024 ;(除以IOM的操作通過右移10 位實(shí)現(xiàn),完全整數(shù)運(yùn)算)
步驟19中利用變換后的右邊界X坐標(biāo)查預(yù)定義的規(guī)范化圓弧-直線交點(diǎn)的y坐標(biāo)表,見明表10。
SY。r。ss<Yt。pJiJ (Xrihgt,Y。r。ss)即為該豎直邊與橢圓弧的有效交點(diǎn),若Y。r。ss>Yt。p, 則圓弧在右上頂點(diǎn)外繞過(此時(shí)右上頂點(diǎn)位于“弦”與弧之間),應(yīng)排除。該過程中僅涉及兩次整數(shù)乘法運(yùn)算,無需開方等復(fù)雜運(yùn)算。對該象限橢圓弧段與水平裁剪邊相交的處理,將 χ與y互換后亦可使用表10 (利用圓的八分對稱性)。查表操作實(shí)際上通過指令尋址中的變址來實(shí)現(xiàn),少數(shù)幾條機(jī)器指令即可實(shí)現(xiàn),其時(shí)間開銷可忽略不計(jì),因而與求解直線和圓的聯(lián)立方程相比,效率提高很多倍。其它象限橢圓弧段及其與相關(guān)邊的求交,亦可按照圓的四分對稱性,共用一張交點(diǎn)查找表,只需做相應(yīng)的符號變換即可。
表1給出了正則橢圓由始、終點(diǎn)位置確定圓弧整體包圍盒的規(guī)則表。Ps(xs,ys)及 Pe(xe,ye)分別為橢圓弧的始點(diǎn)和終點(diǎn),A和B分別為橢圓長軸和短軸的長度,(Xl,Yb)為圓弧整體包圍盒左下角頂點(diǎn)坐標(biāo),0(r,Yt)為圓弧整體包圍盒邊界右上角頂點(diǎn)坐標(biāo)。表項(xiàng)中, 第一行第一列“始點(diǎn)與終點(diǎn)的象限位置”下對應(yīng)的是查詢條件,而第一行第二列“正則橢圓弧的包圍盒”項(xiàng)下對應(yīng)的是查詢結(jié)果。查詢條件包含第二行第一列的始點(diǎn)位置“Ps(xs,ys) ”、 第二行第二列的終點(diǎn)位置“Pe(Xe,yJ,,以及第二行第三列的“附加條件”,附加條件指的是始點(diǎn)和終點(diǎn)的X坐標(biāo)的位置關(guān)系。查詢結(jié)果依次是第二行第四列的包圍盒左下角頂點(diǎn)X坐標(biāo) XI、第二行第五列的左下角Y坐標(biāo)Y1、第二行第六列的右上角X坐標(biāo)&·、第二行第七列的右上角Y坐標(biāo)竹。表項(xiàng)中的具體內(nèi)容根據(jù)橢圓弧的象限關(guān)系可直接得到,其中由于始點(diǎn)和終點(diǎn)在同一象限中時(shí)各自與長短軸端點(diǎn)的位置關(guān)系難以確定,因此需要分兩種情況列出。
表1正則橢圓整體包圍盒查詢表。
權(quán)利要求
1. 一種矩形窗口中橢圓曲線的快速裁剪方法,其特征在于,包括以下步驟 步驟1 輸入矩形窗口的坐標(biāo),包括矩形窗口左上角頂點(diǎn)和右下角頂點(diǎn)的坐標(biāo); 步驟2 輸入待裁剪的橢圓弧的坐標(biāo),包括了橢圓弧的起點(diǎn)坐標(biāo)、終點(diǎn)坐標(biāo)以及橢圓弧的長軸和水平坐標(biāo)軸的夾角;步驟3 以橢圓弧起點(diǎn)坐標(biāo)和終點(diǎn)坐標(biāo),根據(jù)橢圓弧所屬橢圓為正則橢圓或非正則橢圓查整體包圍盒表獲得橢圓弧的整體包圍盒,所述整體包圍盒查詢表包括正則橢圓整體包圍盒查詢表和非正則橢圓整體包圍盒查詢表;步驟4 比較所述橢圓弧整體包圍盒和矩形窗口,判斷橢圓弧整體包圍盒是否位于矩形窗口內(nèi),若結(jié)果為是,則輸出該橢圓弧,并轉(zhuǎn)入步驟23,否則進(jìn)行步驟5 ;步驟5 比較該橢圓弧整體包圍盒與矩形窗口,判斷橢圓弧整體包圍盒是否位于矩形窗口外,若結(jié)果為是,則舍棄該待裁剪的橢圓弧,并轉(zhuǎn)入步驟23,否則進(jìn)行步驟6 ;步驟6:將待裁剪橢圓弧根據(jù)四個(gè)象限分割為多個(gè)象限橢圓弧段,橢圓弧落在幾個(gè)象限內(nèi)就被坐標(biāo)軸分割為對應(yīng)個(gè)數(shù)的象限橢圓弧段;步驟7 根據(jù)待裁剪橢圓弧起點(diǎn)坐標(biāo)、終點(diǎn)坐標(biāo),查象限橢圓弧段表獲得各分割后的象限橢圓弧段及其對應(yīng)的象限橢圓弧段包圍盒;步驟8 比較各象限橢圓弧段包圍盒與矩形窗口,若各象限橢圓弧段包圍盒均在矩形窗口外,則舍棄待裁剪橢圓弧,并轉(zhuǎn)入步驟23,否則進(jìn)行步驟9 ;步驟9,根據(jù)矩形窗口上邊界、下邊界、左邊界及右邊界的延長線將坐標(biāo)系分為九個(gè)分區(qū),由上至下、由左至右分別依次編碼為1區(qū)到9區(qū);步驟10,遍歷各分割后的象限橢圓弧段,取各個(gè)象限橢圓弧段的起點(diǎn)坐標(biāo)、終點(diǎn)坐標(biāo), 確定起點(diǎn)、終點(diǎn)所在分區(qū)的編碼;步驟11 判斷橢圓弧所屬橢圓是否為正則橢圓,如果是正則橢圓,則轉(zhuǎn)到步驟12,否則轉(zhuǎn)步驟14 ;步驟12 根據(jù)各個(gè)象限橢圓弧段起點(diǎn)、終點(diǎn)所在分區(qū),及矩形窗口與各象限橢圓弧段的關(guān)系,判斷各個(gè)象限橢圓弧段是否在矩形窗口外,如果是,則舍棄該待裁剪的橢圓弧,并轉(zhuǎn)入步驟23,否則轉(zhuǎn)步驟13;步驟 13 根據(jù)點(diǎn) Pl (0. 25Α,0· 6124Β)、點(diǎn) Ρ2 (0. 5Α,0· 866Β)、點(diǎn) Ρ3 (0. 7071Α,0. 7071Β)、 點(diǎn)Ρ4(0. 866Α,0. 5Β)將象限橢圓弧段分成子段;其中A是橢圓長軸的長度,B是短軸的長度;步聚 14 將點(diǎn) Pl (0. 25A, 0. 6124B)、點(diǎn) P2 (0. 5A, 0. 866B)、點(diǎn) P3 (0. 7071A, 0. 7071B)、點(diǎn) P4(0. 866A,0. 5B)旋轉(zhuǎn)至待裁剪橢圓弧所屬的橢圓上作為分段點(diǎn),將非正則橢圓弧分成子段;步驟15 查子段包圍盒表得到各子段的包圍盒;所述子段包圍盒表包括子段包圍盒的總表、包含始點(diǎn)的非完整橢圓弧子段包圍盒修改表以及包含終點(diǎn)的非完整橢圓弧子段包圍盒修改表三個(gè)表;步驟16 比較橢圓弧各子段的包圍盒與矩形窗口,若各子段均在矩形窗口外,則舍棄待裁剪橢圓弧,并轉(zhuǎn)入步驟23,否則進(jìn)行步驟17 ;步驟17 將橢圓弧各子段按比例變換到規(guī)范化坐標(biāo)空間的半徑為R的圓弧,即使橢圓長軸與短軸長度等同于圓弧半徑R,矩形窗口按照相同的比例變換;步驟18 對矩形窗口左右兩邊界的X坐標(biāo)和矩形窗口上下兩邊界的Y坐標(biāo)作比例變換,比例因子為1024/R,所述X坐標(biāo)和Y坐標(biāo)分別為標(biāo)準(zhǔn)坐標(biāo)系中的橫坐標(biāo)和縱坐標(biāo);矩形窗口左右兩邊界和上下兩邊界的求交順序根據(jù)求交順序表來確定;步驟19 根據(jù)變換后的X坐標(biāo)和Y坐標(biāo)查規(guī)范化圓弧直線交點(diǎn)的坐標(biāo)表,獲得規(guī)范化圓弧直線交點(diǎn)坐標(biāo),即Y坐標(biāo)和X坐標(biāo);步驟20 對所述坐標(biāo)實(shí)施反比例變換,得到圓弧直線實(shí)際交點(diǎn)坐標(biāo),比例因子為 R/1024 ;步驟21 根據(jù)圓弧直線實(shí)際交點(diǎn)坐標(biāo),對所輸入圓弧進(jìn)行裁剪; 步驟22 將規(guī)范化圓反比例變換為橢圓,得到一個(gè)或多個(gè)橢圓弧段; 步驟23 輸出并顯示最終裁剪結(jié)果。
2.根據(jù)權(quán)利要求1中所述的矩形窗口中橢圓曲線的快速裁剪方法,其特征在于,所輸入的待裁剪橢圓弧為逆時(shí)針方向,由其橢圓心、長軸與水平坐標(biāo)軸的夾角、始點(diǎn)和終點(diǎn)描述,且經(jīng)過平移后將坐標(biāo)軸原點(diǎn)設(shè)定于待裁剪橢圓弧的圓心。
全文摘要
本發(fā)明公開了一種矩形窗口中橢圓曲線的快速裁剪方法,對任意給定的橢圓弧,該方法按各類橢圓弧出現(xiàn)的概率及所需操作,先后通過橢圓弧的整體包圍盒,各分割后的象限橢圓弧,矩形窗口頂點(diǎn)相對于象限橢圓弧段的內(nèi)外測試,劃分的橢圓弧子段的相關(guān)性測試,以較少的操作、盡可能多的排除與矩形窗口不相交的橢圓弧;對剩余的需要求交操作才能完成裁剪的橢圓弧,通過查表法快速獲取橢圓弧與矩形窗口邊的交點(diǎn)。本發(fā)明的有益之處是,對任意待裁剪橢圓弧,僅需幾次移位、整數(shù)加減或少量乘除法運(yùn)算,即可快速獲取其裁剪結(jié)果,橢圓弧裁剪效率有很大提高。此外,由于橢圓弧裁剪是圖形學(xué)及CAD的基礎(chǔ)問題之一,該方法可廣泛應(yīng)用于各類繪圖軟件、建模軟件、CAD軟件及復(fù)雜工程圖設(shè)計(jì)系統(tǒng)等。
文檔編號G06T3/00GK102509258SQ20111030123
公開日2012年6月20日 申請日期2011年10月8日 優(yōu)先權(quán)日2011年10月8日
發(fā)明者路通, 陸添超 申請人:南京大學(xué)