• Windows Mobile上的矢量图形显示


          矢量图形是计算机图形学中用点、直线或者多边形等基于数学方程的几何图元表示图像。我们来讨论一下在手机上实现矢量图形的方法。

          以一幅北京市区域地图为例,将其显示在手机上,并实现平移、缩放、旋转等功能。在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)和俯视角度,实现稍复杂,在此略过不表,有兴趣的同学可以探讨。以下为投影后的显示
           

  • 相关阅读:
    线性回归和逻辑回归
    行列式,叉积 (2)
    K最邻近算法(K-Nearest Neighbor,KNN)(初探)
    线性感知机和SVM(初探)
    向量点积(Dot Product)
    聚类(初探)
    sqlserver全文检索
    诗词背诵
    初级英语04
    初级英语03
  • 原文地址:https://www.cnblogs.com/fengju/p/6173536.html
Copyright © 2020-2023  润新知