• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            大龍的博客

            常用鏈接

            統計

            最新評論

            同一坐標系中,由任意兩點計算地圖旋轉角度(轉載)

            一、引言

            在各種GIS/GPS應 用中,地圖旋轉是不可或缺的一部分,尤其明顯的是用在實時導航,對象跟蹤等應用方面。用來計算地圖旋轉時偏轉角的坐標點有動態和靜態兩種之分。動態在這里 指的是在已知當前點的情況下,下一點的具體位置是不確定的;而靜態指的是下一點的具體位置是確定的。動態的應用我們常見到的是GPS導航、游戲中的賽車(多賽道、可轉彎等)以 及調度等中的實時地圖旋轉,而靜態更常見的是作為一種功能的演示,如模擬導航,模擬賽車等。地圖旋轉只有在同一坐標系中進行才有意義,地圖旋轉角度的計算 才有依據,本文主要著重點在于如何由前后兩點計算地圖旋轉角度,同時主要考慮動態的方式,靜態方式的旋轉地圖原理是一樣的,就不分開介紹了。

            二、約定和術語

            ²      參考坐標系:本文所依據的坐標系為北京54下的依據高斯克呂格投影所建立的坐標系,即高斯平面坐標系,它的圖像如圖:


            X
            代表為正北方向,Y代表正東方向,為了使y值都為正,將縱坐標軸西移500km

            ²      正切函數是直角三角形中,對邊與鄰邊的比值。放在直角坐標系中(如圖)即 tanθ=y/x

            其中tanθ的定義域為(-∏/2,+∏/2),值域為(-,+)

            ²         偏轉角:約定偏轉角為北偏東的角度,將地圖按照偏轉角進行旋轉后將始終朝著運動方向行駛。在高斯平面坐標系中,正北即為X軸,正東即為Y軸,所以tanθ還是為y/x,只是角度的位置有了變化,如圖所示。

            ²         反正切:函數y=tanx的反函數叫做反正切函數,記做:y=arctanx.
            定義域:R;值域:(-π/2,π/2)
            三、計算偏轉角

            假設存在一起始點pntBegin,并且存在一個原點為pntBegin的平面坐標系,同時約定要旋轉的角度為rotateAngle,則下一點pntDest根據方位有幾種情況,其示意圖如下,我們可以分類進行討論:


            l       pntDest.x1>=pntBegin.x0,則該點在第一和第四象限,具體對應點為pntDest(1)pntDest(4),分別對應的北偏東角度為α(1)和α(4),根據Y值的不同,我們又可以分兩種情況,

            n       若pntDest.y>=pntBegin.y://在第一象限
            rotateAngle=arctan2(fabs(p0.x-p1.x),fabs(p0.y-p1.y));

            n       若pntDest.y<pntBegin.y://在第四象限
            rotateAngle=arctan2(fabs(p0.x-p1.x),fabs(p0.y-p1.y));

            rotateAngle=∏-rotateAngle;

            l       pntDest.x1<pntBegin.x0,則該點在第二和第三象限,具體對應點為pntDest(2)pntDest(3),分別對應的北偏東角度為α(2)和α(3),根據Y值的不同,分兩種情況進行討論,

            n       若pntDest.y>=pntBegin.y://在第二象限
            rotateAngle=arctan2(fabs(p0.x-p1.x),fabs(p0.y-p1.y));
            rotateAngle= 2*∏-rotateAngle;

            n       若pntDest.y<pntBegin.y://在第三象限
            rotateAngle=arctan2(fabs(p0.x-p1.x),fabs(p0.y-p1.y));

            rotateAngle=∏+rotateAngle;

            四、在超圖平臺中實現
            :開發語言為VC6,平臺為eSuperMap;

            代碼如下:

             1
             2void CCarNaviView::RotateMap(CPoint pntBegin,CPoint pntNext)
             3{    
             4    //計算旋轉角度
             5    double dAngle=CalculateRotateAngle(pntBegin,pntNext);
             6    //地圖旋轉
             7    m_MapWnd.GetDrawParam()->SetMapRotationAngle( dAngle );
             8    m_MapWnd.Refresh();
             9}

            10
            11/**//// \brief 由前后兩點計算當前地圖偏轉角并進行地圖旋轉
            12/// \param pntbegin 起始點
            13/// \param pntbegin 下一點
            14/// \return 地圖要旋轉的角度(北偏東)
            15/// \remark 為適應習慣用法,點坐標的表示方法為cpoint(x,y),如pntbegin(x,y)代表的含義為:
            16///          x->正東,即為高斯投影中的Y,y->正北,代表高斯投影中的x

            17double CCarNaviView::CalculateRotateAngle(CPoint pntBegin,CPoint pntNext)
            18{
            19    CPoint pntFirst(pntBegin);
            20    CPoint pntSecond(pntNext);
            21    
            22    double dRotateAngle = atan2(fabs(pntBegin.x-pntNext.x),fabs(pntBegin.y-pntNext.y));
            23    
            24    //如果下一點的橫坐標大于前一點(在第一和第四象限)
            25    if (pntNext.x>=pntFirst.x)
            26    {
            27        //在第一象限(0<=dRotateAngle<=90)
            28        if (pntNext.y>=pntFirst.y)
            29        {
            30            //不做任何處理
            31            dRotateAngle=dRotateAngle;
            32        }

            33        else
            34        {
            35            dRotateAngle=PI-dRotateAngle;
            36        }

            37    }

            38    else//(在第二和第三象限)
            39    {
            40        //第二象限
            41        if (pntNext.y>=pntFirst.y)
            42        {
            43            dRotateAngle=2*PI-dRotateAngle;
            44        }

            45        else//第三象限
            46        {
            47            dRotateAngle=PI+dRotateAngle;
            48        }

            49    }

            50    return dRotateAngle;
            51}

            posted on 2012-05-17 03:53 大龍 閱讀(697) 評論(0)  編輯 收藏 引用

            青青草国产97免久久费观看| 亚洲伊人久久综合中文成人网| 狠狠色丁香婷婷久久综合不卡| 1000部精品久久久久久久久| 久久香蕉一级毛片| 久久精品国产一区二区| 一级女性全黄久久生活片免费 | 欧美日韩精品久久免费| 无码日韩人妻精品久久蜜桃 | 久久综合给合综合久久| 97精品伊人久久久大香线蕉| 高清免费久久午夜精品| 91精品国产综合久久久久久| 久久免费美女视频| 99久久精品免费看国产一区二区三区| 色播久久人人爽人人爽人人片aV| 精品久久久久中文字幕一区| 无码精品久久久久久人妻中字| 亚洲va久久久噜噜噜久久 | 精品久久一区二区三区| 国产国产成人久久精品| 亚洲中文久久精品无码ww16| 久久人人爽人人爽人人AV| 久久久老熟女一区二区三区| 99久久人妻无码精品系列| 久久人人爽人人爽人人片AV不 | 99精品国产99久久久久久97| 久久久久亚洲Av无码专| 久久精品这里热有精品| 亚洲精品无码专区久久同性男| 人妻少妇久久中文字幕| 久久―日本道色综合久久| 亚洲国产小视频精品久久久三级| 久久久久国产精品熟女影院| 久久精品亚洲乱码伦伦中文| 久久国产欧美日韩精品 | 亚洲精品美女久久久久99小说 | 久久久久国产日韩精品网站| 人妻少妇久久中文字幕| 婷婷久久综合九色综合九七| 久久久久99精品成人片欧美|