• <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>

            大龍的博客

            常用鏈接

            統(tǒng)計(jì)

            最新評(píng)論

            同一坐標(biāo)系中,由任意兩點(diǎn)計(jì)算地圖旋轉(zhuǎn)角度(轉(zhuǎn)載)

            一、引言

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

            二、約定和術(shù)語(yǔ)

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


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

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

            其中tanθ的定義域?yàn)椋?/span>-∏/2,+∏/2),值域?yàn)?/span>(-,+)

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

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

            假設(shè)存在一起始點(diǎn)pntBegin,并且存在一個(gè)原點(diǎn)為pntBegin的平面坐標(biāo)系,同時(shí)約定要旋轉(zhuǎn)的角度為rotateAngle,則下一點(diǎn)pntDest根據(jù)方位有幾種情況,其示意圖如下,我們可以分類(lèi)進(jìn)行討論:


            l       pntDest.x1>=pntBegin.x0,則該點(diǎn)在第一和第四象限,具體對(duì)應(yīng)點(diǎn)為pntDest(1)pntDest(4),分別對(duì)應(yīng)的北偏東角度為α(1)和α(4),根據(jù)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,則該點(diǎn)在第二和第三象限,具體對(duì)應(yīng)點(diǎn)為pntDest(2)pntDest(3),分別對(duì)應(yīng)的北偏東角度為α(2)和α(3),根據(jù)Y值的不同,分兩種情況進(jìn)行討論,

            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;

            四、在超圖平臺(tái)中實(shí)現(xiàn)
            :開(kāi)發(fā)語(yǔ)言為VC6,平臺(tái)為eSuperMap;

            代碼如下:

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

            10
            11/**//// \brief 由前后兩點(diǎn)計(jì)算當(dāng)前地圖偏轉(zhuǎn)角并進(jìn)行地圖旋轉(zhuǎn)
            12/// \param pntbegin 起始點(diǎn)
            13/// \param pntbegin 下一點(diǎn)
            14/// \return 地圖要旋轉(zhuǎn)的角度(北偏東)
            15/// \remark 為適應(yīng)習(xí)慣用法,點(diǎn)坐標(biāo)的表示方法為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    //如果下一點(diǎn)的橫坐標(biāo)大于前一點(diǎn)(在第一和第四象限)
            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) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            青青草原综合久久大伊人| 久久综合国产乱子伦精品免费| 97精品伊人久久久大香线蕉| 99久久99久久精品国产| 亚洲а∨天堂久久精品| 久久精品毛片免费观看| 亚洲国产精品综合久久一线| jizzjizz国产精品久久| 性做久久久久久久久浪潮| 丁香五月网久久综合| 欧美一级久久久久久久大片| 韩国三级大全久久网站| 狠狠色丁香久久婷婷综合| 久久久久人妻一区精品| 国产∨亚洲V天堂无码久久久| 久久久久久久综合狠狠综合| 精品综合久久久久久88小说| 久久综合综合久久综合| 波多野结衣AV无码久久一区| 久久精品国产精品亚洲艾草网美妙 | 久久天天躁狠狠躁夜夜2020一| 99久久久久| 国产精品久久永久免费| 久久久久亚洲精品无码蜜桃| 久久婷婷五月综合色奶水99啪| 久久国产精品二国产精品| 91久久香蕉国产熟女线看| 国产三级久久久精品麻豆三级| 亚洲精品无码久久久久sm| 久久人人添人人爽添人人片牛牛| 亚洲国产精品嫩草影院久久| 久久夜色撩人精品国产| 久久精品二区| 91麻豆国产精品91久久久| 免费久久人人爽人人爽av| 色99久久久久高潮综合影院| 亚洲午夜久久久| 日本强好片久久久久久AAA| 国产三级久久久精品麻豆三级 | 久久久久久久人妻无码中文字幕爆| 97视频久久久|