向量圖形是電腦圖形學中用點、直線或者多邊形等基於數學方程的幾何圖元表示映像。我們來討論一下在手機上實現向量圖形的方法。
以一幅北京市地區地圖為例,將其顯示在手機上,並實現平移、縮放、旋轉等功能。在Gis系統中,由於地球為球狀天體,需將地球座標經過投影轉換成地圖座標,再經過轉換成裝置螢幕座標來顯示。一般而言,地圖座標系,x軸向右,y軸向上;螢幕座標系x軸向右,y軸向下。如
要將地圖準確顯示在螢幕上,我們需要做一個轉換。首先,找到地圖上某點,將其與螢幕上某點對應起來。這裡為簡單起見,最初我們將地圖中心點與顯示視窗中心點對應起來。假設顯示視窗中心點座標為(m_wScreen/2,m_hScreen/2),地圖中心點座標為(m_pt2DMapCenter.x,m_pt2DMapCenter.y),縮放比例為m_dScale。其中m_pt2DMapCenter是這樣來定義的:
typedef struct
{
double x;
double y;
}POINT2D;
POINT2D m_pt2DMapCenter;
好了,參照上面的座標系圖,我們可以得到一個由地圖座標到螢幕座標的轉換函式
void MapToClient(POINT &ptDst, const POINT2D &ptSrc)
{
double x,y;
x = ptSrc.x - m_pt2DMapCenter.x;
y = ptSrc.y - m_pt2DMapCenter.y;
ptDst.x = (int)(x*m_dScale) + m_wScreen/2;
ptDst.y = m_hScreen/2 - int(y*m_dScale);
}
看一下地圖適配視窗的情形
再看一下縮小顯示的情形
平移的功能,只要調整m_pt2DMapCenter的位置即可
有了思路,旋轉的函數也出來了,以逆時針為旋轉方向,注意m_AngleRatio為弧度而非角度
void MapToClient(POINT &ptDst, const POINT2D &ptSrc)
{
double x,y;
x = (ptSrc.x - m_pt2DMapCenter.x)*cos(m_AngleRatio) - (ptSrc.y - m_pt2DMapCenter.y)*sin(m_AngleRatio);
y = (ptSrc.x - m_pt2DMapCenter.x)*sin(m_AngleRatio) + (ptSrc.y - m_pt2DMapCenter.y)*cos(m_AngleRatio);
ptDst.x = (int)(x*m_dScale) + m_wScreen/2;
ptDst.y = m_hScreen/2 - int(y*m_dScale);
}
以下為旋轉30度角的情形
筆者還研究出一種2D投影的方法,該方法取決於觀察點的位置(x,y,z)和俯視角度,實現稍複雜,在此略過不表,有興趣的同學可以探討。以下為投影后的顯示