www.pudn.com > GPS ToolKit Pro.rar > SatPicture.cpp


// SatPicture.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "GTKTestPanel.h" 
#include "GTKTestPanelDlg.h" 
#include "SatPicture.h" 
#include "comdef.h" 
#include  
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
#define HEIGHT_MARGIN 6 
#define WIDTH_MARGIN 6 
 
#define PI 3.14159265358979 
 
///////////////////////////////////////////////////////////////////////////// 
// CSatPicture 
 
CSatPicture::CSatPicture() : m_bParamsCaluclated(false) 
{ 
} 
 
CSatPicture::~CSatPicture() 
{ 
} 
 
 
BEGIN_MESSAGE_MAP(CSatPicture, CStatic) 
	//{{AFX_MSG_MAP(CSatPicture) 
	ON_WM_PAINT() 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CSatPicture message handlers 
 
void CSatPicture::OnPaint()  
{ 
	CPaintDC dc(this); // device context for painting 
 
	if(!m_bParamsCaluclated) 
	{ 
		// Set our parameters 
		GetClientRect(&m_clientRect); 
 
		m_outerCircle.left = m_clientRect.left + WIDTH_MARGIN; 
		m_outerCircle.right = m_clientRect.right - WIDTH_MARGIN; 
		m_outerCircle.top = m_clientRect.top + HEIGHT_MARGIN; 
		m_outerCircle.bottom = m_clientRect.bottom - HEIGHT_MARGIN; 
 
		m_outerCircleRadius = (m_outerCircle.right - m_outerCircle.left)/2; 
 
		m_innerCircle.left = m_outerCircle.left + (m_outerCircleRadius / 2); 
		m_innerCircle.right = m_outerCircle.right - (m_outerCircleRadius / 2); 
		m_innerCircle.top = m_outerCircle.top + (m_outerCircleRadius / 2); 
		m_innerCircle.bottom = m_outerCircle.bottom - (m_outerCircleRadius / 2); 
 
		m_tinyCircle.left = m_outerCircle.left + m_outerCircleRadius - 2; 
		m_tinyCircle.right = m_outerCircle.right - (m_outerCircleRadius - 2); 
		m_tinyCircle.top = m_outerCircle.top + (m_outerCircleRadius - 2); 
		m_tinyCircle.bottom = m_outerCircle.bottom - (m_outerCircleRadius - 2); 
 
		m_bParamsCaluclated = true; 
	} 
 
	// Draw background 
	 
	// Clear client area 
	CBrush bgBrush(GetSysColor(COLOR_BTNFACE)); 
	dc.FillRect(&m_clientRect, &bgBrush); 
 
	// Clear brush fill 
	dc.SelectStockObject(NULL_BRUSH); 
 
	// Set FG, BG colors and font 
	dc.SetBkColor(GetSysColor(COLOR_BTNFACE)); 
	dc.SetTextColor(CIRCLECOLOR); 
	dc.SelectStockObject(DEFAULT_GUI_FONT); 
	CPen thePen(PS_SOLID, 0, CIRCLECOLOR); 
	dc.SelectObject(thePen); 
 
	// Draw circles 
	dc.Ellipse(&m_outerCircle); 
	dc.Ellipse(&m_innerCircle); 
	dc.Ellipse(&m_tinyCircle); 
 
	// Compass point labels 
	dc.ExtTextOut(m_outerCircle.left + m_outerCircleRadius - 3, m_outerCircle.top - 6, ETO_OPAQUE, NULL, "N", NULL); 
	dc.ExtTextOut(m_outerCircle.right - 5, m_outerCircle.top + m_outerCircleRadius - 7, ETO_OPAQUE, NULL, "E", NULL); 
	dc.ExtTextOut(m_outerCircle.left + m_outerCircleRadius - 3, m_outerCircle.bottom - 7, ETO_OPAQUE, NULL, "S", NULL); 
	dc.ExtTextOut(m_outerCircle.left - 4, m_outerCircle.top + m_outerCircleRadius - 7, ETO_OPAQUE, NULL, "W", NULL); 
 
	// Calculate and draw satellite positions 
	double r, x, y; 
	long centerPoint = m_outerCircle.left + m_outerCircleRadius; 
	CString strPRN; 
	char lpszPRN[3]; 
	bool bIsFixSat; 
	int i, j; 
 
	for(i = 0; i < m_vecSatelliteInViewPRNs.size(); i++) 
	{ 
		bIsFixSat = false; 
 
		//if(i < SNRBarUbound) 
		 
 
		r = ((90. - m_vecEl[i]) / 90.) * m_outerCircleRadius; 
        x = (sin(m_vecAz[i] * PI / 180.) * r) + centerPoint; 
        y = -(cos(m_vecAz[i] * PI / 180.) * r) + centerPoint; 
 
		// Determine whether this satellite is a fix satellite 
		for(j = 0; j < m_vecFixSatellitePRNs.size(); j++) 
		{ 
			if(m_vecFixSatellitePRNs[j] == m_vecSatelliteInViewPRNs[i]) 
			{ 
				bIsFixSat = true; 
				break; 
			} 
		} 
 
		if(bIsFixSat) 
		{ 
			dc.SetBkColor(FIXSATCOLOR); 
		} 
		else 
		{ 
			dc.SetBkColor(SATINVIEWCOLOR); 
		} 
 
		// Set satellite name string 
		itoa(m_vecSatelliteInViewPRNs[i], lpszPRN, 10); 
		if(m_vecSatelliteInViewPRNs[i] < 10) 
		{ 
			strPRN = CString("0") + lpszPRN; 
		} 
		else 
		{ 
			strPRN = lpszPRN; 
		} 
 
		// Draw Satellite 
		dc.SetTextColor(SATTEXTCOLOR); 
		dc.ExtTextOut((int)x-5, (int)y-5, ETO_OPAQUE, NULL, strPRN, NULL); 
	} 
 
	// Do not call CStatic::OnPaint() for painting messages 
} 
 
void CSatPicture::DrawSatellites(vector &vecFixSatellitePRNs, vector &vecSatelliteInViewPRNs, 
					vector &vecAz, vector &vecEl) 
{ 
	m_vecFixSatellitePRNs = vecFixSatellitePRNs; 
	m_vecSatelliteInViewPRNs = vecSatelliteInViewPRNs; 
	m_vecAz = vecAz; 
	m_vecEl = vecEl; 
 
	Invalidate(); 
}