TIFFView.cpp
上传用户:lbr_007
上传日期:2019-05-31
资源大小:282k
文件大小:19k
源码类别:

传真(Fax)编程

开发平台:

Visual C++

  1. // TIFFView.cpp : implementation of the TIFFView class
  2. //
  3. #include "stdafx.h"
  4. #include "TIFFSample.h"
  5. #include "TIFFFrame.h"
  6. #include "TIFFDoc.h"
  7. #include "TIFFView.h"
  8. #include "RegPtDLG.h"
  9. #include "FlightDLG.h"
  10. #include <string>
  11. #include <geo.h>
  12. #include <dibijg.h>
  13. using namespace std;
  14. #ifdef _DEBUG
  15. #define new DEBUG_NEW
  16. #undef THIS_FILE
  17. static char THIS_FILE[] = __FILE__;
  18. #endif
  19. TIFFView * g_view = 0;
  20. extern CStatusBar * g_statusBar;
  21. /////////////////////////////////////////////////////////////////////////////
  22. // TIFFView
  23. IMPLEMENT_DYNCREATE(TIFFView, CScrollView)
  24. BEGIN_MESSAGE_MAP(TIFFView, CScrollView)
  25. //{{AFX_MSG_MAP(TIFFView)
  26. ON_WM_LBUTTONDOWN()
  27. ON_WM_LBUTTONUP()
  28. ON_WM_MOUSEMOVE()
  29. ON_UPDATE_COMMAND_UI(ID_VIEW_IMGBAR, OnUpdateImageList)
  30. ON_COMMAND(ID_VIEW_IMGBAR, OnImageList)
  31. ON_UPDATE_COMMAND_UI(ID_VIEW_2D, OnUpdateView2D)
  32. ON_COMMAND(ID_VIEW_2D, OnView2D)
  33. ON_UPDATE_COMMAND_UI(ID_VIEW_3D, OnUpdateView3D)
  34. ON_COMMAND(ID_VIEW_3D, OnView3D)
  35. ON_UPDATE_COMMAND_UI(ID_VIEW_REG, OnUpdateRegistration)
  36. ON_COMMAND(ID_VIEW_REG, OnRegistration)
  37. ON_WM_SIZE()
  38. ON_UPDATE_COMMAND_UI(ID_TOOLS_FLY, OnUpdateToolsFly)
  39. ON_COMMAND(ID_TOOLS_FLY, OnToolsFly)
  40. ON_WM_TIMER()
  41. ON_UPDATE_COMMAND_UI(ID_VIEW_STOPFLIGHT, OnUpdateViewStopflight)
  42. ON_COMMAND(ID_VIEW_STOPFLIGHT, OnViewStopflight)
  43. //}}AFX_MSG_MAP
  44. // Standard printing commands
  45. ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
  46. ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
  47. ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
  48. END_MESSAGE_MAP()
  49. /////////////////////////////////////////////////////////////////////////////
  50. // TIFFView construction/destruction
  51. TIFFView::TIFFView() : m_cs(0,0)
  52. {
  53. m_shownImage = 0;
  54. g_view = this;
  55. m_leftDown = false;
  56. m_isGeo = false;
  57. m_scaleFactor = 1.0;
  58. m_view2D = true;
  59. m_registrationMode = false;
  60. }
  61. TIFFView::~TIFFView()
  62. {
  63. }
  64. BOOL TIFFView::PreCreateWindow(CREATESTRUCT& cs)
  65. {
  66. // TODO: Modify the Window class or styles here by modifying
  67. //  the CREATESTRUCT cs
  68. return CScrollView::PreCreateWindow(cs);
  69. }
  70. /////////////////////////////////////////////////////////////////////////////
  71. // TIFFView drawing
  72. void TIFFView::OnDraw(CDC* pDC)
  73. {
  74. TIFFDoc* pDoc = GetDocument();
  75. ASSERT_VALID(pDoc);
  76. if (pDC->IsPrinting())
  77. {
  78. DIBSection * dib = GetDocument()->GetDIB(m_shownImage);
  79. if (dib && dib->IsCreated())
  80. {
  81. int wpix = pDC->GetDeviceCaps(HORZRES);
  82. int hpix = pDC->GetDeviceCaps(VERTRES);
  83. int imgWidth = dib->Width();
  84. int imgHeight = dib->Height();
  85. double horzScale = (double)wpix / (double)imgWidth;
  86. double vertScale = (double)hpix / (double)imgHeight;
  87. DIBSection tmpDIB;
  88. if (horzScale < vertScale)
  89. {
  90. hpix = (int)(imgHeight*horzScale);
  91. }
  92. else
  93. {
  94. wpix = (int)(imgWidth*vertScale);
  95. }
  96. BeginWaitCursor();
  97. {
  98. dib->ResizeImage(tmpDIB, wpix, hpix);
  99. }
  100. EndWaitCursor();
  101. pDC->BitBlt( 0, 0, wpix, hpix, tmpDIB.GetDC(), 0, 0, SRCCOPY);
  102. }
  103. }
  104. else
  105. {
  106. ShowImage();
  107. }
  108. }
  109. void TIFFView::StretchImage(double scale_factor)
  110. {
  111. if (m_view2D)
  112. {
  113. double delta = fabs(scale_factor - m_scaleFactor);
  114. if (delta > 0.01)
  115. {
  116. DIBSection * dib = GetDocument()->GetDIB(m_shownImage);
  117. if (dib && dib->IsCreated())
  118. {
  119. int w = (int)(0.50 + scale_factor * dib->Width());
  120. int h = (int)(0.50 + scale_factor * dib->Height());
  121. BeginWaitCursor();
  122. {
  123. dib->ResizeImage(m_viewDIB, w, h);
  124. }
  125. EndWaitCursor();
  126. m_cs.cx = w;
  127. m_cs.cy = h;
  128. SetScrollSizes(MM_TEXT, m_cs);
  129. ShowImage();
  130. }
  131. m_scaleFactor = scale_factor;
  132. }
  133. }
  134. else
  135. {
  136. m_view_matrix = m_earth3D.GetModelState();
  137. m_view_matrix.SetScale(scale_factor,scale_factor,scale_factor);
  138. m_earth3D.SetModelState(m_view_matrix);
  139. ShowImage();
  140. }
  141. }
  142. void TIFFView::Stretched2Unstretched(int xin, int yin, int& xout, int& yout)
  143. {
  144. xout = (int)(0.50 + (double)xin / m_scaleFactor);
  145. yout = (int)(0.50 + (double)yin / m_scaleFactor);
  146. }
  147. void TIFFView::OnInitialUpdate()
  148. {
  149. CScrollView::OnInitialUpdate();
  150. CSize sizeTotal;
  151. sizeTotal.cx = sizeTotal.cy = 100;
  152. SetScrollSizes(MM_TEXT, sizeTotal);
  153. if (m_dlg.m_hWnd == NULL)
  154. {
  155. m_dlg.Create(IDD_TIFFDIR_DLG, this);
  156. }
  157. if (!m_earth3D.IsInitialized())
  158. {
  159. CRect r;
  160. GetClientRect(&r);
  161. m_earth3D.CreateImage(r.Width(),r.Height());
  162. //m_earth3D.RebuildEarth();
  163. //m_earth3D.RebuildTexture();
  164. }
  165. //DIBSection tmpDIB;
  166. //OpenIJG2DIB("land1024x512.jpg",tmpDIB);
  167. //m_earth3D.SetTexture(tmpDIB);
  168. TIFFFrame * frm = (TIFFFrame *)GetParentFrame();
  169. if (frm)
  170. {
  171. frm->HideList();
  172. }
  173. }
  174. void TIFFView::ShowImage(void)
  175. {
  176. if (m_view2D)
  177. {
  178. if (m_viewDIB.IsCreated())
  179. {
  180. CClientDC dc(this);
  181. CPoint sp = GetScrollPosition();
  182. CRect r;
  183. GetClientRect(&r);
  184. UINT32 w = m_viewDIB.Width();
  185. UINT32 h = m_viewDIB.Height();
  186. if (w < r.Width())
  187. {
  188. dc.PatBlt(w,0,r.Width(),r.Height(), WHITENESS);
  189. }
  190. if (h < r.Height())
  191. {
  192. dc.PatBlt(0,h,r.Width(),r.Height(), WHITENESS);
  193. }
  194. m_viewDIB.Draw(&dc, sp.x, sp.y);
  195. PlotClickPoints(dc);
  196. }
  197. }
  198. else
  199. {
  200. if (m_earth3D.IsInitialized())
  201. {
  202. m_earth3D.RenderImage();
  203. m_earth3D.DrawImage(this);
  204. }
  205. }
  206. }
  207. void TIFFView::PlotClickPoints(CClientDC& dc)
  208. {
  209. if (m_isGeo)
  210. {
  211. double x, y;
  212. COLORREF cr = RGB(255,64,64);
  213. COLORREF cr2 = RGB(255,255,255);
  214. CPoint sp = GetScrollPosition();
  215. int size = m_pts.size();
  216. for (int i = 0; i < size; i++){
  217. m_utmProj.forward(m_pts[i].m_lat,m_pts[i].m_lon,x,y);
  218. x -= m_gr.m_tieX;
  219. y = m_gr.m_tieY - y;
  220. x /= m_gr.m_resX;
  221. y /= m_gr.m_resY;
  222. x *= m_scaleFactor;
  223. y *= m_scaleFactor;
  224. x -= sp.x;
  225. y -= sp.y;
  226. dc.FillSolidRect((int)x-2,(int)y-2,6,6,cr2);
  227. dc.FillSolidRect((int)x-3,(int)y-3,6,6,cr);
  228. }
  229. }
  230. }
  231. /////////////////////////////////////////////////////////////////////////////
  232. // TIFFView printing
  233. BOOL TIFFView::OnPreparePrinting(CPrintInfo* pInfo)
  234. {
  235. // default preparation
  236. return DoPreparePrinting(pInfo);
  237. }
  238. void TIFFView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  239. {
  240. // TODO: add extra initialization before printing
  241. }
  242. void TIFFView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  243. {
  244. // TODO: add cleanup after printing
  245. }
  246. /////////////////////////////////////////////////////////////////////////////
  247. // TIFFView diagnostics
  248. #ifdef _DEBUG
  249. void TIFFView::AssertValid() const
  250. {
  251. CScrollView::AssertValid();
  252. }
  253. void TIFFView::Dump(CDumpContext& dc) const
  254. {
  255. CScrollView::Dump(dc);
  256. }
  257. TIFFDoc* TIFFView::GetDocument() // non-debug version is inline
  258. {
  259. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(TIFFDoc)));
  260. return (TIFFDoc*)m_pDocument;
  261. }
  262. #endif //_DEBUG
  263. /////////////////////////////////////////////////////////////////////////////
  264. // TIFFView message handlers
  265. void TIFFView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) 
  266. {
  267. bool showList = false;
  268. m_pts.clear();
  269. TIFFDoc * doc = GetDocument();
  270. if (doc)
  271. {
  272. TIFFFrame * frm = (TIFFFrame *)GetParentFrame();
  273. if (frm)
  274. {
  275. frm->HideList();
  276. }
  277. ArrayContainer<DIBSection *> * dibs = doc->GetDIBs();
  278. if (dibs)
  279. {
  280. int size = dibs->GetSize();
  281. m_dlg.SetImageCount(size);
  282. m_shownImage = 0;
  283. if (size > 1)
  284. {
  285. showList = true;
  286. }
  287. DIBSection * dib = doc->GetDIB(m_shownImage);
  288. m_isGeo = false;
  289. if (dib && dib->IsCreated())
  290. {
  291. m_isGeo = dib->IsGeoImage();
  292. int w = (int)(0.50 + m_scaleFactor * dib->Width());
  293. int h = (int)(0.50 + m_scaleFactor * dib->Height());
  294. BeginWaitCursor();
  295. {
  296. dib->ResizeImage(m_viewDIB, w, h);
  297. }
  298. EndWaitCursor();
  299. m_cs.cx = w;
  300. m_cs.cy = h;
  301. if (m_isGeo)
  302. {
  303. m_gr = dib->GetGeoReference();
  304. m_isGeo = true;
  305. string ellps;
  306. switch (m_gr.m_ellipse){
  307. case GEORef::Clarke1866:
  308. {
  309. ellps = "clrk66";
  310. }
  311. break;
  312. case GEORef::WGS84:
  313. {
  314. ellps = "WGS84";
  315. }
  316. break;
  317. case GEORef::WGS72:
  318. {
  319. ellps = "WGS72";
  320. }
  321. break;
  322. case GEORef::UnknownEllipsoid:
  323. {
  324. ellps = "WGS84";
  325. }
  326. break;
  327. }
  328. m_utmProj.setup(m_gr.m_zone,ellps.c_str());
  329. m_earth3D.SetGeoImage(dib, &m_utmProj);
  330. m_earth3D.RebuildImage();
  331. }
  332. }
  333. else
  334. {
  335. CRect r;
  336. GetClientRect(&r);
  337. m_cs.cx = r.Width();
  338. m_cs.cy = r.Height();
  339. }
  340. SetScrollSizes(MM_TEXT, m_cs);
  341. InvalidateRect(NULL, true);
  342. }
  343. }
  344. if (m_dlg.m_hWnd)
  345. {
  346. m_dlg.ShowWindow( showList ? SW_SHOW : SW_HIDE );
  347. m_dlg.UpdateList();
  348. }
  349. }
  350. void TIFFView::SetImage(UINT32 ndx)
  351. {
  352. DIBSection * dib = GetDocument()->GetDIB(ndx);
  353. if (dib && dib->IsCreated())
  354. {
  355. int w = (int)(0.50 + m_scaleFactor * dib->Width());
  356. int h = (int)(0.50 + m_scaleFactor * dib->Height());
  357. BeginWaitCursor();
  358. {
  359. dib->ResizeImage(m_viewDIB, w, h);
  360. }
  361. EndWaitCursor();
  362. m_cs.cx = w;
  363. m_cs.cy = h;
  364. SetScrollSizes(MM_TEXT, m_cs);
  365. m_shownImage = ndx;
  366. ShowImage();
  367. }
  368. }
  369. void TIFFView::OnLButtonDown(UINT nFlags, CPoint point) 
  370. {
  371. if (m_registrationMode)
  372. {
  373. CPoint sp = GetScrollPosition();
  374. point.x += sp.x;
  375. point.y += sp.y;
  376. int xout, yout;
  377. Stretched2Unstretched(point.x,point.y,xout,yout);
  378. if (m_isGeo)
  379. {
  380. double lat, lon;
  381. if (m_view2D)
  382. {
  383. double x = m_gr.m_tieX+m_gr.m_resX*(double)xout;
  384. double y = m_gr.m_tieY-m_gr.m_resY*(double)yout;
  385. m_utmProj.inverse(x,y,lat,lon);
  386. RegPtDLG dlg;
  387. dlg.SetPosition(lat,lon);
  388. if (dlg.DoModal() == IDOK)
  389. {
  390. ClickPoint pt(dlg.GetLat(),dlg.GetLon(),dlg.GetName(),dlg.GetAltitude());
  391. m_pts.push_back(pt);
  392. TIFFFrame * frm = (TIFFFrame *)GetParentFrame();
  393. if (frm)
  394. {
  395. frm->UpdateList();
  396. frm->ShowList();
  397. }
  398. ShowImage();
  399. }
  400. }
  401. else
  402. {
  403. int id;
  404. m_earth3D.PickObject(point.x,point.y,id);
  405. if (m_earth3D.PickedPoint())
  406. {
  407. lat = m_earth3D.GetPickedLat();
  408. lon = m_earth3D.GetPickedLon();
  409. RegPtDLG dlg;
  410. dlg.SetPosition(lat,lon);
  411. if (dlg.DoModal() == IDOK)
  412. {
  413. ClickPoint pt(dlg.GetLat(),dlg.GetLon(),dlg.GetName(),dlg.GetAltitude());
  414. m_pts.push_back(pt);
  415. TIFFFrame * frm = (TIFFFrame *)GetParentFrame();
  416. if (frm)
  417. {
  418. frm->UpdateList();
  419. frm->ShowList();
  420. }
  421. ShowImage();
  422. }
  423. }
  424. }
  425. }
  426. m_registrationMode = false;
  427. }
  428. else
  429. {
  430. m_leftDown = true;
  431. m_clickPoint = point;
  432. if (m_view2D)
  433. {
  434. }
  435. else
  436. {
  437. m_view_matrix = m_earth3D.GetModelState();
  438. }
  439. }
  440. CScrollView::OnLButtonDown(nFlags, point);
  441. }
  442. void TIFFView::OnLButtonUp(UINT nFlags, CPoint point) 
  443. {
  444. m_leftDown = false;
  445. //CScrollView::OnLButtonUp(nFlags, point);
  446. }
  447. void TIFFView::OnMouseMove(UINT nFlags, CPoint point) 
  448. {
  449. CPoint sp = GetScrollPosition();
  450. memset(m_status, 0, (size_t)80);
  451. memset(m_status1, 0, (size_t)80);
  452. memset(m_status2, 0, (size_t)80);
  453. memset(m_status3, 0, (size_t)80);
  454. if (m_view2D)
  455. {
  456. if (m_leftDown)
  457. {
  458. int xDelta = point.x - m_clickPoint.x;
  459. int yDelta = point.y - m_clickPoint.y;
  460. m_clickPoint = point;
  461. sp.x -= xDelta;
  462. sp.y -= yDelta;
  463. sp.x =  (sp.x < 0) ? 0 : sp.x;
  464. sp.y = (sp.y < 0) ? 0 : sp.y;
  465. sp.x = (sp.x > m_cs.cx) ? m_cs.cx : sp.x;
  466. sp.y = (sp.y > m_cs.cy) ? m_cs.cy : sp.y;
  467. CRect r;
  468. GetClientRect(&r);
  469. int spxMax = m_viewDIB.Width() - r.Width();
  470. int spyMax = m_viewDIB.Height() - r.Height();
  471. if (spxMax < 0) spxMax = 0;
  472. if (spyMax < 0) spyMax = 0;
  473. sp.x = (sp.x < spxMax) ? sp.x : spxMax;
  474. sp.y = (sp.y < spyMax) ? sp.y : spyMax;
  475. ScrollToPosition(sp);
  476. ShowImage();
  477. }
  478. int xin = sp.x + point.x;
  479. int yin = sp.y + point.y;
  480. int xout, yout;
  481. Stretched2Unstretched( xin, yin, xout, yout );
  482. sprintf(m_status1,"%dx%d", xin, yin);
  483. if (g_statusBar)
  484. {
  485. g_statusBar->SetPaneText(1, m_status1);
  486. }
  487. if (m_isGeo)
  488. {
  489. double lat, lon;
  490. double x = m_gr.m_tieX+m_gr.m_resX*(double)xout;
  491. double y = m_gr.m_tieY-m_gr.m_resY*(double)yout;
  492. sprintf(m_status2,"( %.1f, %.1f )",x,y);
  493. m_utmProj.inverse(x,y,lat,lon);
  494. INT32 latDeg, latMin, lonDeg, lonMin;
  495. double latSec, lonSec;
  496. m_utmProj.DD2DMS(lat,latDeg,latMin,latSec);
  497. m_utmProj.DD2DMS(lon,lonDeg,lonMin,lonSec);
  498. sprintf(m_status3,"( %d-%.2d-%2.1f %c, %d-%.2d-%2.1f %c )",
  499. latDeg,latMin,latSec,(lat<0.0)?'S':'N', lonDeg, lonMin, lonSec,
  500. (lon<0.0)?'W':'E');
  501. }
  502. }
  503. else
  504. {
  505. if (m_leftDown)
  506. {
  507. int xdiff = point.x - m_clickPoint.x;
  508. int ydiff = point.y - m_clickPoint.y;
  509. double yrot = (double)xdiff/9.0;
  510. double xrot = (double)ydiff/9.0;
  511. double zrot = 0.0;
  512. while (xrot < 0.0) xrot += 360.0;
  513. while (xrot > 360.0) xrot -= 360.00000001;
  514. while (yrot < 0.0) yrot += 360.0;
  515. while (yrot > 360.0) yrot -= 360.00000001;
  516. Matrix3D mat = m_view_matrix;
  517. mat.AddRotation(xrot,yrot,zrot);
  518. m_earth3D.SetModelState(mat);
  519. ShowImage();
  520. }
  521. }
  522. if (g_statusBar)
  523. {
  524. g_statusBar->SetPaneText(2, m_status2);
  525. g_statusBar->SetPaneText(3, m_status3);
  526. }
  527. CScrollView::OnMouseMove(nFlags, point);
  528. }
  529. void TIFFView::OnUpdateImageList(CCmdUI* pCmdUI) 
  530. {
  531. pCmdUI->Enable();
  532. pCmdUI->SetCheck(m_dlg.IsWindowVisible());
  533. }
  534. void TIFFView::OnImageList() 
  535. {
  536. m_dlg.ShowWindow(m_dlg.IsWindowVisible() ? SW_HIDE : SW_SHOW);
  537. }
  538. void TIFFView::OnUpdateView2D(CCmdUI* pCmdUI) 
  539. {
  540. pCmdUI->Enable();
  541. pCmdUI->SetCheck(m_view2D);
  542. }
  543. void TIFFView::OnView2D() 
  544. {
  545. m_view2D = true;
  546. m_registrationMode = false;
  547. CSize cs;
  548. cs.cx = m_viewDIB.Width();
  549. cs.cy = m_viewDIB.Height();
  550. SetScrollSizes(MM_TEXT, cs);
  551. ShowImage();
  552. }
  553. void TIFFView::OnUpdateView3D(CCmdUI* pCmdUI) 
  554. {
  555. pCmdUI->Enable();
  556. pCmdUI->SetCheck(!m_view2D);
  557. }
  558. void TIFFView::OnView3D() 
  559. {
  560. m_view2D = false;
  561. m_registrationMode = false;
  562. CRect r;
  563. GetClientRect(&r);
  564. m_earth3D.SizeImage(r.Width(),r.Height());
  565. m_earth3D.RebuildImage();
  566. //
  567. // we don't want any scroll bars
  568. //
  569. CSize cs;
  570. cs.cx = 5;
  571. cs.cy = 5;
  572. SetScrollSizes(MM_TEXT, cs);
  573. ShowImage();
  574. }
  575. void TIFFView::OnUpdateRegistration(CCmdUI* pCmdUI)
  576. {
  577. pCmdUI->Enable();
  578. }
  579. void TIFFView::OnRegistration(void)
  580. {
  581. m_registrationMode = m_registrationMode ? false : true;
  582. }
  583. void TIFFView::OnSize(UINT nType, int cx, int cy) 
  584. {
  585. CScrollView::OnSize(nType, cx, cy);
  586. if ((cx > 0) && (cy > 0))
  587. {
  588. if (m_view2D)
  589. {
  590. CSize cs;
  591. cs.cx = m_viewDIB.Width();
  592. cs.cy = m_viewDIB.Height();
  593. SetScrollSizes(MM_TEXT, cs);
  594. }
  595. else
  596. {
  597. CRect r;
  598. GetClientRect(&r);
  599. //
  600. // we don't want any scroll bars
  601. //
  602. CSize cs;
  603. cs.cx = 5;
  604. cs.cy = 5;
  605. SetScrollSizes(MM_TEXT, cs);
  606. bool skip = false;
  607. DIBSection * dib = m_earth3D.GetDIB();
  608. if (dib)
  609. {
  610. if ((dib->Width() == r.Width()) && (dib->Height() == r.Height()))
  611. skip = true;
  612. }
  613. if (!skip)
  614. {
  615. m_earth3D.SizeImage(r.Width(),r.Height());
  616. m_earth3D.RebuildImage();
  617. m_earth3D.RebuildEarth();
  618. }
  619. ShowImage();
  620. }
  621. }
  622. }
  623. void TIFFView::OnUpdateToolsFly(CCmdUI* pCmdUI) 
  624. {
  625. //
  626. // we only want to enable user to fly if they are in 3D mode,
  627. // and if the image they are looking at is a geo image, and if
  628. // they have defined some points to fly...
  629. //
  630. bool showFlyMenu = m_view2D ? false : (m_pts.size()>1) ? m_isGeo : false;
  631. pCmdUI->Enable(showFlyMenu);
  632. }
  633. void TIFFView::OnToolsFly() 
  634. {
  635. FlightDLG dlg;
  636. if (dlg.DoModal() == IDOK)
  637. {
  638. m_flyFirstPerson = dlg.GetFirstPerson();
  639. m_flyDuration = dlg.GetDuration();
  640. // basically going to setup 100 equally spaced points along the
  641. // route (i.e. from the first point to the last)
  642. m_totalFrames = 100;
  643. double dx, u[3], v[3], lat1, lon1, lat2, lon2, alt1, alt2;
  644. double D = 0.0;
  645. int i, j;
  646. int size = m_pts.size();
  647. for (i = 0; i < (size-1); i++){
  648. lat1 = m_pts[i].m_lat;
  649. lon1 = m_pts[i].m_lon;
  650. lat2 = m_pts[i+1].m_lat;
  651. lon2 = m_pts[i+1].m_lon;
  652. D += GeoCalc::GCDistance(lat1,lon1,lat2,lon2);
  653. }
  654. // dividing the total distance by the number of divisions
  655. dx = D / (m_totalFrames-1);
  656. // following loop sets up the individual way points to fly through
  657. // ultimately we will be interpolating between these points.
  658. V3D v3d;
  659. m_flyWayPoints.clear();
  660. for (i = 0; i < (size-1); i++){
  661. lat1 = m_pts[i].m_lat;
  662. lon1 = m_pts[i].m_lon;
  663. lat2 = m_pts[i+1].m_lat;
  664. lon2 = m_pts[i+1].m_lon;
  665. alt1 = m_pts[i].m_alt;
  666. alt2 = m_pts[i+1].m_alt;
  667. int total = (int)GeoCalc::GCDistance(lat1,lon1,lat2,lon2)/dx;
  668. m_earth3D.GeoToXYZ(lat1, lon1, u[0], u[1], u[2],1.0 + alt1/GEO::ERADM);
  669. m_earth3D.GeoToXYZ(lat2, lon2, v[0], v[1], v[2],1.0 + alt2/GEO::ERADM);
  670. for (j = 0; j < total; j++){
  671. double p = (double)j/(double)total;
  672. v3d.m_x = u[0] + p * (v[0] - u[0]);
  673. v3d.m_y = u[1] + p * (v[1] - u[1]);
  674. v3d.m_z = u[2] + p * (v[2] - u[2]);
  675. m_flyWayPoints.push_back(v3d);
  676. }
  677. }
  678. // get the start time (in ticks)
  679. m_flyStart = GetTickCount();
  680. m_earth3D.SetFlyMode(true);
  681. SetTimer(m_flyTimer, 3, NULL);
  682. }
  683. }
  684. void TIFFView::OnTimer(UINT nIDEvent) 
  685. {
  686. if (nIDEvent == m_flyTimer)
  687. {
  688. UINT32 ticks = GetTickCount();
  689. double comp = (double)m_flyWayPoints.size() * (double)(ticks - m_flyStart)/((double)m_flyDuration*1000.0);
  690. if (comp < (double)(m_flyWayPoints.size() - 1))
  691. {
  692. double u[3], v[3];
  693. UINT32 last = (UINT32)comp;
  694. UINT32 next = last + 1;
  695. // interpolate the current position
  696. u[0] = m_flyWayPoints[last].m_x + (comp - (double)last) * (m_flyWayPoints[next].m_x - m_flyWayPoints[last].m_x);
  697. u[1] = m_flyWayPoints[last].m_y + (comp - (double)last) * (m_flyWayPoints[next].m_y - m_flyWayPoints[last].m_y);
  698. u[2] = m_flyWayPoints[last].m_z + (comp - (double)last) * (m_flyWayPoints[next].m_z - m_flyWayPoints[last].m_z);
  699. // this is an attempt to make the turns a little smoother
  700. if (last < 98)
  701. next++;
  702. // v is the where the nose of the airplane is pointing to
  703. v[0] = m_flyWayPoints[next].m_x;
  704. v[1] = m_flyWayPoints[next].m_y;
  705. v[2] = m_flyWayPoints[next].m_z;
  706. // setting the position, the look-at point, and the flight mode
  707. m_earth3D.SetFlyPosition(u,v,m_flyFirstPerson);
  708. m_earth3D.RenderImage();
  709. m_earth3D.DrawImage(this);
  710. }
  711. else
  712. {
  713. KillTimer(m_flyTimer);
  714. m_earth3D.SetFlyMode(false);
  715. m_earth3D.RebuildImage();
  716. m_flyWayPoints.clear();
  717. ShowImage();
  718. }
  719. }
  720. CScrollView::OnTimer(nIDEvent);
  721. }
  722. void TIFFView::OnUpdateViewStopflight(CCmdUI* pCmdUI) 
  723. {
  724. pCmdUI->Enable(m_earth3D.GetFlyMode());
  725. }
  726. void TIFFView::OnViewStopflight() 
  727. {
  728. KillTimer(m_flyTimer);
  729. m_flyWayPoints.clear();
  730. m_earth3D.SetFlyMode(false);
  731. m_earth3D.RebuildImage();
  732. ShowImage();
  733. }