ObjecARX實(shí)現(xiàn)對(duì)圓圖極坐標(biāo)展開獲得方圖
本文并不包含基本的圖形數(shù)據(jù)庫的基本操作,為應(yīng)有的必備內(nèi)容。轉(zhuǎn)換的圓圖實(shí)際上應(yīng)該是由多種元素(如直線,多段線等)組合而成的符號(hào)圖像,難點(diǎn)在于展開的坐標(biāo)合理映射。作者水平有限,歡迎指教。
由于原圖是圓,可以想到使用極坐標(biāo)展開方式,變換圖像幾何坐標(biāo)。
極坐標(biāo)變換的關(guān)鍵在于,根據(jù)極坐標(biāo)變換前的圖像(我們稱為“方圖”)確定極坐標(biāo)變換后的圖像(我們稱為“圓圖”)上每個(gè)實(shí)體關(guān)鍵點(diǎn)的坐標(biāo)值。也即是找到“圓圖”和“方圖”間幾何坐標(biāo)的對(duì)應(yīng)關(guān)系。

如圖所示,實(shí)現(xiàn)極坐標(biāo)變換的關(guān)鍵即在于找到圓圖上任一點(diǎn)P的角度和半徑,在方圖上對(duì)應(yīng)的點(diǎn)p(m,n),然后通過插值算法實(shí)現(xiàn)圓圖上所有實(shí)體關(guān)鍵點(diǎn)的賦值。
方圖上,其行列數(shù)分別為M、N,實(shí)際上這兩個(gè)參數(shù)改變的是圖形的長度縮放和角度變換問題,方圖上的每一列對(duì)應(yīng)為圓圖上的每條半徑,即特定的半徑都能映射到特定的列數(shù),半徑方向存在著一個(gè)長度縮放因子常規(guī)情況下為delta_r = M/R,但在要求1:1圖紙中,可直接設(shè)置為常量1,保持長度不變,圓周方向被分為N等分,即角度因子為delta_t = 2π/N,該因子實(shí)際作用是將被壓縮的橫坐標(biāo)放大展開。
圓圖上,圖像坐標(biāo)(i,j)和世界坐標(biāo)(x,y)有著如下變換關(guān)系:x = j - R, y = R - i;而在AutoCAD中大多數(shù)圖紙都是從世界坐標(biāo)原點(diǎn)開始起稿,所以求P點(diǎn)的角度和半徑成為極坐標(biāo)變換中的首要之事。
那么,圖中P點(diǎn)半徑長度為r = sqrt(x2 + y2),角度theta = arctan(y/x);
圓圖上點(diǎn)P的半徑在方圖上對(duì)應(yīng)的縱坐標(biāo)為m=r/delta_r;
圓圖上點(diǎn)P的角度在方圖上對(duì)應(yīng)的橫坐標(biāo)為n = thata/delta_t。
由于ObjectARX不同于一般的圖像視覺處理軟件,在使用該方法時(shí),圖形數(shù)據(jù)庫可修改是采用圖形坐標(biāo)(i,j)還是世界坐標(biāo)(x,y)。本技術(shù)采用長度同等,角度轉(zhuǎn)正調(diào)整的參數(shù)設(shè)定,相比于圖形坐標(biāo),世界坐標(biāo)有兩個(gè)優(yōu)點(diǎn),一、不需要對(duì)同一個(gè)坐標(biāo)進(jìn)行兩次不同類型的變換,設(shè)定角度跟半徑時(shí)可以更好的代入數(shù)學(xué)公式計(jì)算中,二、不需要預(yù)處理,數(shù)值處理更加簡便,坐標(biāo)偏移后成圖效果好。
代碼看起來很長,實(shí)際上是多種圖形處理的重復(fù),實(shí)際懂的點(diǎn)的轉(zhuǎn)換即可實(shí)現(xiàn)。
寫在文末:一直想用畢設(shè)的東西做個(gè)視頻,比如以比翼琪霏為素材,弄一個(gè)亂糟糟的圓dwg然后輸出后為一個(gè)完整的方圖jpg,給人一種煥然一新解謎的感覺,但七八月弄了好久,效果并不理想。始終想分享一點(diǎn)objectarx的資料到網(wǎng)上,決定把其中這部分內(nèi)容分享出來