孫艷崇 孫國平
(1.遼寧省交通高等??茖W校,遼寧沈陽 110122;2.沈陽市勘察測繪研究院,遼寧沈陽 110004)
在用VC語言開發(fā)繪圖程序中,主要利用的一個類是設備上下文對象類(CDC類),CDC類定義了一系列圖形對象及其相關的繪圖函數(shù),其中包括處理顯示器或打印機等設備上下文的成員函數(shù),以及處理與窗口客戶區(qū)對應的顯示上下文的成員函數(shù)等。
在VC中,CDC類有成員函數(shù)Arc(),可以實現(xiàn)圓弧的繪制;使用此函數(shù)時,需要已知圓弧的外切矩形的四個角點的坐標,以及圓弧起點和端點的坐標。而在EVC中,其CDC類中沒有繪制圓弧的函數(shù),所以在用EVC開發(fā)測圖系統(tǒng)時,其中圓弧的繪制函數(shù)需要自行編制;圓弧繪制函數(shù)的算法有很多,本文介紹了一種新的三點繪制圓弧的算法,其思路是采用坐標正反算法,按一定圓心角計算圓弧點的坐標,然后利用繪制直線的函數(shù)(MoveTo()和LineTo()),采用直線逼近的方法實現(xiàn)。
1)坐標方位角的定義。
在測繪學科中,為了計算坐標的方便,除了需要知道距離,還需要知道方向,這一方向是通過坐標方位角來描述的,坐標方位角的定義是從某點的坐標縱軸方向線起,依順時針方向到目標方向線之間的水平夾角。
2)坐標正算。
坐標正算,就是根據(jù)直線的邊長、坐標方位角和一個端點的坐標,計算直線另一個端點的坐標的工作。
3)坐標反算。
根據(jù)直線的起點和終點的坐標,計算直線的水平距離和坐標方位角的過程叫坐標反算。
在用EVC開發(fā)測圖系統(tǒng)中,各圖元的繪制都是以類的形式實現(xiàn)的,且由于所繪制的圖形要加以保存,所以相關的圖元類要直接或間接的從Cobject類派生,這樣就可以實現(xiàn)類的串行化,從而實現(xiàn)圖形數(shù)據(jù)的保存。下面介紹三點繪制圓弧的類中,同圓弧繪制相關的數(shù)據(jù)成員及成員函數(shù)的定義。
double radius;
//定義圓弧的半徑
void centerandradius(double x1,x2,x3,y1,y2,y3);
//通過弧上的三點,計算圓弧的圓心坐標和半徑,并對center_x,center_y及 radius賦值
double azimuth(double f_x,double f_y,double e_x,double e_y);
//計算一條直線的坐標方位角,以弧度為單位
void arc(CPoint point[3],CDC*pdc);
//通過給定的三點及窗口的句柄,在特定的窗口,按順時針繪制圓弧
};
實現(xiàn)三點圓弧的繪制,需要首先計算出圓弧的圓心和半徑,其計算方法是:通過給定的三點組成一個三角形,然后構(gòu)造出任意兩條邊的垂直平分線的直線方程,最后對這兩條直線方程求解,即可計算出圓弧的圓心坐標,從而通過圓心坐標和給定三點中的任意一點計算圓弧的半徑。其圓弧的圓心坐標和半徑的計算函數(shù)如下:
測量學中,方位角的定義是:沿坐標北方向順時針旋轉(zhuǎn)到該直線的角度,在計算圓弧上點的坐標時,首先選定圓弧的起始點和終止點,然后分別計算出起點到圓心的坐標方位角和終點到圓心的坐標方位角。
其函數(shù)的具體實現(xiàn)如下:
//計算起點或端點到圓心的橫坐標增量double D_x=e_x-f_x;
//計算起點或端點到圓心的縱坐標增量
if(D_x==0&&D_y>0)
return pi/2;
//如果縱坐標增量等于0,且橫坐標增量大于0,坐標方位角等于 π/2(90°)
else if(D_x==0&&D_y<0)
return pi/2+pi;
//如果縱坐標增量等于0,且橫坐標增量小于0,坐標方位角等于 π/2+π(270°)
else
{double azimth=atan(D_y/D_x);if(D_x<0)
return azimth+pi;
//如果縱坐標增量小于0,坐標方位角等于計算的反正切值加上π的和
else
return azimth;
//如果縱坐標增量大于0,坐標方位角等于計算出的反正切值,此時計算的方位角可能出現(xiàn)負值,但對后面圓弧點的坐標計算公式?jīng)]有影響,所以可以直接返回計算的反正切值
}}
在實現(xiàn)三點圓弧繪制的函數(shù)中,需要調(diào)用函數(shù)centerandradius(),獲取圓心坐標和半徑,然后調(diào)用方位角計算函數(shù)azimuth()計算起終點到圓心的坐標方位角,最后按一定圓心角間隔計算圓弧點的坐標,其函數(shù)的具體實現(xiàn)如下:
//通過圓弧上的三點獲取圓弧的圓心坐標及半徑
const double PI=3.1415926;
double azimuth1=azimuth(center_x,center_y,point[0].x,point[0].y);
//計算起點到圓心的坐標方位角
double azimuth2=azimuth(center_x,center_y,point[2].x,point[2].y);
//計算終點到圓心的坐標方位角
doublemaxnum=azimuth2-azimuth1;
//計算起終點到圓心的坐標方位角的差值
if(maxnum<0)
{maxnum=maxnum+(2*PI);
//計算的差值如是負數(shù),需要加上2π
在嵌入式開發(fā)測圖系統(tǒng)時發(fā)現(xiàn):用VC開發(fā)桌面繪圖系統(tǒng)比較容易實現(xiàn)的功能,例如:圖形的無極縮放、樣條曲線函數(shù)的繪制及圖元屬性的定義等等,在EVC開發(fā)嵌入式繪圖系統(tǒng)中,要想實現(xiàn)這些功能,都是較麻煩的,因為在EVC中沒有實現(xiàn)此功能的基本函數(shù),所有功能都需要用戶從底層自己開發(fā)。將計算機技術的進步與測繪工程實踐相結(jié)合,可以極大提高生產(chǎn)效率、降低生產(chǎn)成本,直接在WinCE GPS手簿上開發(fā)測圖系統(tǒng)相比在PDA上開發(fā)更加方便,因為省去了全站儀和PDA數(shù)據(jù)通訊的開發(fā)環(huán)節(jié),這樣降低了開發(fā)周期,而且用GPS進行數(shù)據(jù)采集相比全站儀更加方便快捷,因為只要將基準站架設好之后,不用轉(zhuǎn)站就可以用流動站采集數(shù)據(jù)?;谝陨蟽?yōu)點,直接在WinCE GPS手簿上開發(fā)成圖系統(tǒng)能提高工作效率,這也將成為數(shù)字化測圖的一個新的發(fā)展方向。
[1]孫 群.數(shù)字測圖系統(tǒng)研制報告[R].鄭州:解放軍信息工程大學測繪學院,2005.
[2]顧孝烈,鮑 峰.測量學[M].上海:同濟大學出版社,2006.
[3]傅 曦,齊 宇.嵌入式系統(tǒng)Windows CE開發(fā)技巧與實例[M].北京:化學工業(yè)出版社,2004.