一、引言
在各種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;
代碼如下:

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51
