void MDU::ADI( HDC hDC, double pitch, double roll, double yaw )
{
// center (122,94) r = 57
// view r = 49, ball r = 49 * sqrt( 2 )
// 90º pitch/yaw "FOV"
// apply roll
XFORM WTroll;
WTroll.eM11 = (FLOAT)cos( roll * RAD );
WTroll.eM12 = (FLOAT)(-sin( roll * RAD ));
WTroll.eM21 = -WTroll.eM12;
WTroll.eM22 = WTroll.eM11;
WTroll.eDx = (FLOAT)(50 * (1 - WTroll.eM11 - WTroll.eM21));
WTroll.eDy = (FLOAT)(50 * (1 - WTroll.eM11 + WTroll.eM21));
SetGraphicsMode( hDC_ADI, GM_ADVANCED );
SetWorldTransform( hDC_ADI, &WTroll );
if (pitch > 180) pitch -= 360;// TODO get rid of this
// 0º pitch line/labels
double sinpitch = sin( pitch * RAD );
double cospitch = cos( pitch * RAD );
int hP;
double hP2;
SetTextColor( hDC_ADI, CR_BLACK );
SetBkColor( hDC_ADI, CR_WHITE );
if (fabs( pitch ) <= 45)
{
hP = Round( 69.296 * sinpitch );
if (pitch < 0)
{
SelectObject( hDC_ADI, WhiteBrush );
SelectObject( hDC_ADI, WhitePen );
Rectangle( hDC_ADI, 0, 0, 100, 50 );
SelectObject( hDC_ADI, LightGrayBrush );
SelectObject( hDC_ADI, LightGrayPen );
Chord( hDC_ADI, -19, 50 - hP, 119, 50 + hP, 119, 50, -19, 50 );
Rectangle( hDC_ADI, 0, 50, 100, 100 );
SelectObject( hDC_ADI, BlackPen );
Arc( hDC_ADI, -19, 50 - hP, 119, 50 + hP, 119, 50, -19, 50 );
}
else
{
SelectObject( hDC_ADI, LightGrayBrush );
SelectObject( hDC_ADI, LightGrayPen );
Rectangle( hDC_ADI, 0, 50, 100, 100 );
SelectObject( hDC_ADI, WhiteBrush );
SelectObject( hDC_ADI, WhitePen );
Chord( hDC_ADI, -19, 50 - hP, 119, 50 + hP, -19, 50, 119, 50 );
Rectangle( hDC_ADI, 0, 0, 100, 50 );
SelectObject( hDC_ADI, BlackPen );
Arc( hDC_ADI, -19, 50 - hP, 119, 50 + hP, -19, 50, 119, 50 );
}
hP = 46 + Round( 66.935245 * sinpitch );
TextOut( hDC_ADI, 31, hP, "0", 1 );
TextOut( hDC_ADI, 67, hP, "0", 1 );
}
else if (pitch > 0)
{
SelectObject( hDC_ADI, WhiteBrush );
Rectangle( hDC_ADI, 0, 0, 100, 100 );
}
else
{
SelectObject( hDC_ADI, LightGrayBrush );
Rectangle( hDC_ADI, 0, 0, 100, 100 );
}
// pitch lines/labels for +30º/+60º/+90º/+120º/+150º
SelectObject( hDC_ADI, DarkGrayPen );
// +30º
if (fabs( pitch - 30 ) <= 45)
{
hP2 = sinpitch * 60.012499 - cospitch * 34.648232;//hP = 69.296 * sin( (pitch - 30) * RAD );
hP = Round( hP2 );
if (pitch < 30) Arc( hDC_ADI, -19, 50 - hP, 119, 50 + hP, 119, 50, -19, 50 );
else Arc( hDC_ADI, -19, 50 - hP, 119, 50 + hP, -19, 50, 119, 50 );
hP = 46 + Round( hP2 * 0.965926 );
TextOut( hDC_ADI, 31, hP, "3", 1 );
TextOut( hDC_ADI, 67, hP, "3", 1 );
}
// +60º
if (fabs( pitch - 60 ) <= 45)
{
hP2 = sinpitch * 34.648232 - cospitch * 60.012499;
hP = Round( hP2 );
if (pitch < 60) Arc( hDC_ADI, -19, 50 - hP, 119, 50 + hP, 119, 50, -19, 50 );
else Arc( hDC_ADI, -19, 50 - hP, 119, 50 + hP, -19, 50, 119, 50 );
hP = 46 + Round( hP2 * 0.965926 );
TextOut( hDC_ADI, 31, hP, "6", 1 );
TextOut( hDC_ADI, 67, hP, "6", 1 );
}
// +90º
if (fabs( pitch - 90 ) <= 45)
{
hP2 = 69.296465 * (-cospitch);
hP = Round( hP2 );
if (pitch < 90) Arc( hDC_ADI, -19, 50 - hP, 119, 50 + hP, 119, 50, -19, 50 );
else Arc( hDC_ADI, -19, 50 - hP, 119, 50 + hP, -19, 50, 119, 50 );
hP = 46 + Round( hP2 * 0.965926 );
TextOut( hDC_ADI, 31, hP, "9", 1 );
TextOut( hDC_ADI, 67, hP, "9", 1 );
}
// +120º
if (fabs( pitch - 120 ) <= 45)
{
hP2 = (-sinpitch) * 34.648232 - cospitch * 60.012499;
hP = Round( hP2 );
if (pitch < 120) Arc( hDC_ADI, -19, 50 - hP, 119, 50 + hP, 119, 50, -19, 50 );
else Arc( hDC_ADI, -19, 50 - hP, 119, 50 + hP, -19, 50, 119, 50 );
hP = 46 + Round( hP2 * 0.965926 );
TextOut( hDC_ADI, 30, hP, "12", 2 );
TextOut( hDC_ADI, 66, hP, "12", 2 );
}
// +150º
if (fabs( pitch - 150 ) <= 45)
{
hP2 = (-sinpitch) * 60.012499 - cospitch * 34.648232;
hP = Round( hP2 );
if (pitch < 150) Arc( hDC_ADI, -19, 50 - hP, 119, 50 + hP, 119, 50, -19, 50 );
else Arc( hDC_ADI, -19, 50 - hP, 119, 50 + hP, -19, 50, 119, 50 );
hP = 46 + Round( hP2 * 0.965926 );
TextOut( hDC_ADI, 30, hP, "15", 2 );
TextOut( hDC_ADI, 66, hP, "15", 2 );
}
// pitch lines/labels for -30º/-60º/-90º/-120º/-150º
SelectObject( hDC_ADI, WhitePen );
SetTextColor( hDC_ADI, CR_WHITE );
SetBkColor( hDC_ADI, CR_LIGHT_GRAY );
// -30º
if (fabs( pitch + 30 ) <= 45)
{
hP2 = sinpitch * 60.012499 + cospitch * 34.648232;
hP = Round( hP2 );
if (pitch < -30) Arc( hDC_ADI, -19, 50 - hP, 119, 50 + hP, 119, 50, -19, 50 );
else Arc( hDC_ADI, -19, 50 - hP, 119, 50 + hP, -19, 50, 119, 50 );
hP = 46 + Round( hP2 * 0.965926 );
TextOut( hDC_ADI, 30, hP, "33", 2 );
TextOut( hDC_ADI, 66, hP, "33", 2 );
}
// -60º
if (fabs( pitch + 60 ) <= 45)
{
hP2 = sinpitch * 34.648232 + cospitch * 60.012499;
hP = Round( hP2 );
if (pitch < -60) Arc( hDC_ADI, -19, 50 - hP, 119, 50 + hP, 119, 50, -19, 50 );
else Arc( hDC_ADI, -19, 50 - hP, 119, 50 + hP, -19, 50, 119, 50 );
hP = 46 + Round( hP2 * 0.965926 );
TextOut( hDC_ADI, 30, hP, "30", 2 );
TextOut( hDC_ADI, 66, hP, "30", 2 );
}
// -90º
if (fabs( pitch + 90 ) <= 45)
{
hP2 = 69.296 * cospitch;
hP = Round( hP2 );
if (pitch < -90) Arc( hDC_ADI, -19, 50 - hP, 119, 50 + hP, 119, 50, -19, 50 );
else Arc( hDC_ADI, -19, 50 - hP, 119, 50 + hP, -19, 50, 119, 50 );
hP = 46 + Round( hP2 * 0.965926 );
TextOut( hDC_ADI, 30, hP, "27", 2 );
TextOut( hDC_ADI, 66, hP, "27", 2 );
}
// -120º
if (fabs( pitch + 120 ) <= 45)
{
hP2 = (-sinpitch) * 34.648232 + cospitch * 60.012499;
hP = Round( hP2 );
if (pitch < -120) Arc( hDC_ADI, -19, 50 - hP, 119, 50 + hP, 119, 50, -19, 50 );
else Arc( hDC_ADI, -19, 50 - hP, 119, 50 + hP, -19, 50, 119, 50 );
hP = 46 + Round( hP2 * 0.965926 );
TextOut( hDC_ADI, 30, hP, "24", 2 );
TextOut( hDC_ADI, 66, hP, "24", 2 );
}
// -150º
if (fabs( pitch + 150 ) <= 45)
{
hP2 = (-sinpitch) * 60.012499 + cospitch * 34.648232;
hP = Round( hP2 );
if (pitch < -150) Arc( hDC_ADI, -19, 50 - hP, 119, 50 + hP, 119, 50, -19, 50 );
else Arc( hDC_ADI, -19, 50 - hP, 119, 50 + hP, -19, 50, 119, 50 );
hP = 46 + Round( hP2 * 0.965926 );
TextOut( hDC_ADI, 30, hP, "21", 2 );
TextOut( hDC_ADI, 66, hP, "21", 2 );
}
// TODO yaw
// HACK
// "central plane"
SelectObject( hDC_ADI, WhiteBrush );
SelectObject( hDC_ADI, BlackPen );
Rectangle( hDC_ADI, 48, 0, 52, 100 );
SelectObject( hDC_ADI, DarkGrayPen );
MoveToEx( hDC_ADI, 50, 0, NULL );
LineTo( hDC_ADI, 50, 100 );
SelectObject( hDC_ADI, DarkGrayPen );
// yaw line 30º (above horizon)
MoveToEx( hDC_ADI, 85, 0, NULL );
LineTo( hDC_ADI, 85, 50 + Round( 60.012096 * sinpitch ) );
// yaw line 330º (above horizon)
MoveToEx( hDC_ADI, 15, 0, NULL );
LineTo( hDC_ADI, 15, 50 + Round( 60.012096 * sinpitch ) );
SelectObject( hDC_ADI, WhitePen );
// yaw line 30º (below horizon)
MoveToEx( hDC_ADI, 85, 100, NULL );
LineTo( hDC_ADI, 85, 50 + Round( 60.012096 * sinpitch ) );
// yaw line 330º (below horizon)
MoveToEx( hDC_ADI, 15, 100, NULL );
LineTo( hDC_ADI, 15, 50 + Round( 60.012096 * sinpitch ) );
// TODO yaw labels
// roll triangle
SelectObject( hDC_ADI, LightGreenPen );
SelectObject( hDC_ADI, LightGreenBrush );
POINT tri[3];
tri[0].x = 50;
tri[0].y = 1;
tri[1].x = 46;
tri[1].y = 9;
tri[2].x = 54;
tri[2].y = 9;
Polygon( hDC_ADI, tri, 3 );
// clean up
ModifyWorldTransform( hDC_ADI, &WTroll, MWT_IDENTITY );
SetGraphicsMode( hDC_ADI, GM_COMPATIBLE );
// flight director
SelectObject( hDC_ADI, LightGreenThickPen );
Arc( hDC_ADI, 44, 44, 56, 57, 44, 50, 56, 50 );
SelectObject( hDC_ADI, LightGreenPen );
SelectObject( hDC_ADI, LightGreenBrush );
Rectangle( hDC_ADI, 49, 33, 51, 67 );
Rectangle( hDC_ADI, 33, 49, 67, 51 );
// digital RPY
if (pitch < 0) pitch += 360;// TODO get rid of this
SetTextColor( hDC, CR_WHITE );
char cbuf[8];
sprintf_s( cbuf, 8, "%03.0f", roll );
TextOut( hDC, 180, 25, cbuf, strlen( cbuf ) );
sprintf_s( cbuf, 8, "%03.0f", pitch );
TextOut( hDC, 180, 32, cbuf, strlen( cbuf ) );
sprintf_s( cbuf, 8, "%03.0f", yaw );
TextOut( hDC, 180, 39, cbuf, strlen( cbuf ) );
BitBlt( hDC_ADI, 0, 0, 100, 100, hDC_ADIMASK, 0, 0, SRCAND );
BitBlt( hDC, 72, 44, 100, 100, hDC_ADI, 0, 0, SRCPAINT );
return;
}