正文 VC中矢量圖形快速重畫的技巧(2 / 2)

yMixScreen=yStart;

xMaxScreen=xMixScreen+blc*wScreen; //變量blc為邏輯坐標與實際坐標的比例關係

yMaxScreen=yMixScreen+blc*hScreen; //wScreen,hScreen為當前視圖的高度和寬度

}

2、得到各圖形元素的邊界矩形

一般來說簡單圖形元素主要包括直線、連續直線、多邊形、圓形、圓弧、標注文本等。下麵分別介紹如何得到其邊界矩形。

直線的邊界矩形就是以直線的兩個頂點為對角頂點的矩形。在直線類中加入其函數的實現代碼。

void CLine::GetRect(float *minX, float *minY, float *maxX, float *maxY)

{

*minX=min(m_X1,m_X2); //計算並返回最小x值

*maxX=max(m_X1,m_X2); //計算並返回最大x值

*minY=min(m_Y1,m_Y2); //計算並返回最小y值

*maxY=max(m_Y1,m_Y2); //計算並返回最大y值

}

多邊形可看作封閉的連續直線因此連續直線和多邊形可作為同一類圖形元素處理。連續直線(或多邊形)的邊界矩形就是它所有頂點的最小和最大坐標。在連續直線(或多邊形)類中加入其函數的實現代碼。

void CPline::GetRect(float *minX, float *minY, float *maxX, float *maxY)

{

float x1,y1,x2,y2; //用第一個頂點的坐標初試化變量

x1=m_PointList[0].x; x2=m_PointList[0].y;

y1=m_PointList[0].x; y2=m_PointList[0].y;

// m_PointList為存儲多邊形頂點坐標的數組

for(int i=1;ixMaxScreen || maxxyMaxScreen || maxy

return 0; //如不相交函數返回0

else

return 1; //如果相交就返回1

}

函數的四個參數是邊界矩形區域的左下角(minx,miny)和右下角(maxx,maxy)的實際坐標。最後把判斷結果加入到各類圖形元素的繪製函數中使其能夠先判斷圖形元素的邊界矩形是否與屏幕區域相交來決定是否對圖形元素進行繪製。以直線類CLine為例在其函數DrawLine()中加入以下代碼:

void DrawLine(CDC *pDC,int m_DrawMode,int m_DrawMode1,short BackColor);

{

void GetRect(float *minX, float *minY, float *maxX, float *maxY ); //得到邊界矩形的函數

if (RectCross(float minX,float minY,float maxX,float maxY)) //判斷是否相交

{繪製圖形元素程序略;

else return;

}

};

對於其它圖形元素類,同樣在其繪製函數中加入類似的代碼不再一一列出。

參考文獻:

[1]陳建春. Visual C++開發GIS係統—開發實例剖析.電子工業出版社[M].北京,2000.9

[2]Microsoft Corporation著,欣力等譯.Win32程序員參考大全(二)[M].北京:清華大學出版社,1995.