/** * Shifts and rotates the given polygon * @param poly Points specifying the polygon * @param n Number of points of the polygon * @param xs Pixels to shift in the x-direction * @param ys Pixels to shift in the y-direction * @param angle Angle of rotation */ void PolygonRotateShift(POINT* poly, const int n, const int xs, const int ys, const double angle) { static double lastangle = -1; static int cost=1024, sint=0; if(angle != lastangle) { lastangle = angle; // TODO TB: use ifastsine() here or does DEG_TO_INT take to long? int deg = DEG_TO_INT(AngleLimit360(angle)); cost = ICOSTABLE[deg]*InfoBoxLayout::scale; sint = ISINETABLE[deg]*InfoBoxLayout::scale; } const int xxs = xs*1024+512; const int yys = ys*1024+512; POINT *p = poly; const POINT *pe = poly+n; while (p<pe) { int x= p->x; int y= p->y; p->x = (x*cost - y*sint + xxs)/1024; p->y = (y*cost + x*sint + yys)/1024; p++; } }
// // Since many functions call LatLon2screen, and only a few need multimap checks for display angle, // we separate functions to avoid slow downs. First used by CalculateScreenPositionsGroundline // void MapWindow::LatLon2ScreenMultimap(pointObj *ptin, POINT *ptout, const int n, const int skip) { static double lastangle = -1; static int cost=1024, sint=0; LKASSERT(Current_Multimap_TopZoom!=0); const double mDisplayAngle = Current_Multimap_TopAngle; if(mDisplayAngle != lastangle) { lastangle = mDisplayAngle; int deg = DEG_TO_INT(AngleLimit360(mDisplayAngle)); cost = ICOSTABLE[deg]; sint = ISINETABLE[deg]; } const int xxs = Current_Multimap_TopOrig.x*1024-512; const int yys = Current_Multimap_TopOrig.y*1024+512; const double mDrawScale = Current_Multimap_TopZoom; const double mPanLongitude = PanLongitude; const double mPanLatitude = PanLatitude; pointObj* p = ptin; const pointObj* ptend = ptin+n; while (p<ptend) { int Y = Real2Int((mPanLatitude-p->y)/mDrawScale); int X = Real2Int((mPanLongitude-p->x)*fastcosine(p->y)/mDrawScale); ptout->x = (xxs-X*cost + Y*sint)/1024; ptout->y = (Y*cost + X*sint + yys)/1024; ptout++; p+= skip; } }
void threadsafePolygonRotateShift(POINT* poly, const int n, const int xs, const int ys, const double angle) { int deg = DEG_TO_INT(AngleLimit360(angle)); int cost = ICOSTABLE[deg]*ScreenScale; int sint = ISINETABLE[deg]*ScreenScale; const int xxs = xs*1024+512; const int yys = ys*1024+512; POINT *p = poly; const POINT *pe = poly+n; while (p<pe) { int x= p->x; int y= p->y; p->x = (x*cost - y*sint + xxs)/1024; p->y = (y*cost + x*sint + yys)/1024; p++; } }
// // This function must be reinitialised on resolution change // void PolygonRotateShift(POINT* poly, const int n, const int xs, const int ys, const double angle) { static double lastangle = -1; static int cost=1024, sint=0; if(angle != lastangle) { lastangle = angle; int deg = DEG_TO_INT(AngleLimit360(angle)); cost = ICOSTABLE[deg]*ScreenScale; sint = ISINETABLE[deg]*ScreenScale; } const int xxs = xs*1024+512; const int yys = ys*1024+512; POINT *p = poly; const POINT *pe = poly+n; while (p<pe) { int x= p->x; int y= p->y; p->x = (x*cost - y*sint + xxs)/1024; p->y = (y*cost + x*sint + yys)/1024; p++; } }
// draw aircraft void RenderPlaneSideview(LKSurface& Surface, double fDist, double fAltitude,double brg, DiagrammStruct* psDia ) { //BOOL bInvCol = true ; //INVERTCOLORS #define NO_AP_PTS 17 int deg = DEG_TO_INT(AngleLimit360(brg)); double fCos = COSTABLE[deg]; double fSin = SINETABLE[deg]; int TAIL = 6; int PROFIL = 1; int FINB = 3; int BODY = 2; int NOSE = 7; int WING = (int) (22.0 ); int TUBE = (int) (14.0 ) ; int FINH = 6+BODY; POINT Start; int HEAD = TUBE / 2; TUBE = 3 * TUBE/ 2; POINT AircraftSide [8] = { {(int)(fSin * (HEAD+0 ) ), -BODY-1}, // 1 {(int)(fSin * (HEAD+NOSE) ), 0}, // 2 {(int)(fSin * (HEAD+0 ) ), BODY+1}, // 3 {(int)(fSin * (-TUBE) ), BODY}, // 4 -1 {(int)(fSin * -TUBE ), -FINH}, // 5 {(int)(fSin * (-TUBE+FINB) ), -FINH}, // 6 {(int)(fSin * (-TUBE+FINB+3) ), -BODY+1}, // 7 +1 {(int)(fSin * (HEAD+0) ), -BODY-1} // 8 }; #define FACT 2 BODY = (int)((double)(BODY+1) * fCos * fCos); int DIA = (BODY + PROFIL); /* both wings */ POINT AircraftWing [13] = { {(int)(fCos * BODY ) , -DIA}, // 1 {(int)(fCos * (int)( FACT*BODY) ), -PROFIL}, // 2 {(int)(fCos * WING ) , -PROFIL}, // 3 {(int)(fCos * WING ), 0* PROFIL}, // 4 {(int)(fCos * (int)( FACT*BODY) ) , PROFIL}, // 5 {(int)(fCos * BODY ), DIA}, // 6 {(int)(fCos * -BODY ) , DIA}, // 7 {(int)(fCos * (int)( -FACT*BODY)), PROFIL}, // 8 {(int)(fCos * -WING ), 0* PROFIL }, // 9 {(int)(fCos * -WING ) , -PROFIL} , // 10 {(int)(fCos * (int)( -FACT*BODY)), -PROFIL}, // 11 {(int)(fCos * -BODY ) , -DIA}, // 12 {(int)(fCos * BODY ), -DIA} // 13 }; POINT AircraftWingL [7] = { {(int)(0 * -BODY ), DIA }, // 1 {(int)(fCos * (int)( -FACT*BODY)), PROFIL }, // 2 {(int)(fCos * -WING ), 0* PROFIL }, // 3 {(int)(fCos * -WING ), -PROFIL }, // 4 {(int)(fCos * (int)( -FACT*BODY)), -PROFIL }, // 5 {(int)(0 * -BODY ), -DIA }, // 6 {(int)(0 * -BODY ), DIA } // 7 }; POINT AircraftWingR [7] = { {(int)(0 * BODY ) , -DIA }, // 1 {(int)(fCos * (int)( FACT*BODY) ) , -PROFIL }, // 2 {(int)(fCos * WING ) , -PROFIL }, // 3 {(int)(fCos * WING ) , 0* PROFIL}, // 4 {(int)(fCos * (int)( FACT*BODY) ) , PROFIL }, // 5 {(int)(0 * BODY ) , DIA }, // 6 {(int)(0 * BODY ) , -DIA } // 7 }; POINT AircraftTail [5] = { {(int)(fCos * TAIL - fSin*TUBE), -FINH}, // 1 {(int)(fCos * TAIL - fSin*TUBE), -FINH +PROFIL}, // 2 {(int)(fCos * -TAIL - fSin*TUBE), -FINH +PROFIL}, // 3 {(int)(fCos * -TAIL - fSin*TUBE), -FINH }, // 4 {(int)(fCos * TAIL - fSin*TUBE), -FINH}, // 5 }; Start.x = CalcDistanceCoordinat(fDist, psDia); Start.y = CalcHeightCoordinat(fAltitude, psDia); const auto oldPen = Surface.SelectObject(LK_BLACK_PEN); const auto oldBrush = Surface.SelectObject(LKBrush_White); PolygonRotateShift(AircraftWing, 13, Start.x, Start.y, 0); PolygonRotateShift(AircraftSide, 8, Start.x, Start.y, 0); PolygonRotateShift(AircraftTail, 5, Start.x, Start.y, 0); PolygonRotateShift(AircraftWingL, 7, Start.x, Start.y, 0); PolygonRotateShift(AircraftWingR, 7, Start.x, Start.y, 0); #ifndef UNDITHER LKBrush GreenBrush(RGB_GREEN); LKBrush RedBrush(RGB_RED); #else LKBrush GreenBrush(RGB_WHITE); LKBrush RedBrush(RGB_BLACK); #endif if((brg < 180)) { Surface.SelectObject(RedBrush); Surface.Polygon(AircraftWingL ,7 ); Surface.SelectObject(LKBrush_White); Surface.Polygon(AircraftSide ,8 ); Surface.SelectObject(GreenBrush); Surface.Polygon(AircraftWingR ,7 ); Surface.SelectObject(oldBrush); } else { Surface.SelectObject(GreenBrush); Surface.Polygon(AircraftWingR ,7 ); Surface.SelectObject(LKBrush_White); Surface.Polygon(AircraftSide ,8 ); Surface.SelectObject(RedBrush); Surface.Polygon(AircraftWingL ,7 ); Surface.SelectObject(oldBrush); } if((brg < 90)|| (brg > 270)) { Surface.Polygon(AircraftTail ,5 ); } Surface.SelectObject(oldPen); Surface.SelectObject(oldBrush); } //else !asp_heading_task
// draw aircraft void RenderPlaneSideview(HDC hdc, double fDist, double fAltitude,double brg, DiagrammStruct* psDia ) { //BOOL bInvCol = true ; //INVERTCOLORS #define NO_AP_PTS 17 int deg = DEG_TO_INT(AngleLimit360(brg)); double fCos = COSTABLE[deg]; double fSin = SINETABLE[deg]; int TAIL = 6; int PROFIL = 1; int FINB = 3; int BODY = 2; int NOSE = 7; int WING = (int) (22.0 ); int TUBE = (int) (14.0 ) ; int FINH = 6+BODY; POINT Start; int HEAD = TUBE / 2; TUBE = 3 * TUBE/ 2; POINT AircraftSide [8] = { {(int)(fSin * (HEAD+0 ) ), -BODY-1}, // 1 {(int)(fSin * (HEAD+NOSE) ), 0}, // 2 {(int)(fSin * (HEAD+0 ) ), BODY+1}, // 3 {(int)(fSin * (-TUBE) ), BODY}, // 4 -1 {(int)(fSin * -TUBE ), -FINH}, // 5 {(int)(fSin * (-TUBE+FINB) ), -FINH}, // 6 {(int)(fSin * (-TUBE+FINB+3) ), -BODY+1}, // 7 +1 {(int)(fSin * (HEAD+0) ), -BODY-1} // 8 }; #define FACT 2 BODY = (int)((double)(BODY+1) * fCos * fCos); int DIA = (BODY + PROFIL); /* both wings */ POINT AircraftWing [13] = { {(int)(fCos * BODY ) , -DIA}, // 1 {(int)(fCos * (int)( FACT*BODY) ), -PROFIL}, // 2 {(int)(fCos * WING ) , -PROFIL}, // 3 {(int)(fCos * WING ), 0* PROFIL}, // 4 {(int)(fCos * (int)( FACT*BODY) ) , PROFIL}, // 5 {(int)(fCos * BODY ), DIA}, // 6 {(int)(fCos * -BODY ) , DIA}, // 7 {(int)(fCos * (int)( -FACT*BODY)), PROFIL}, // 8 {(int)(fCos * -WING ), 0* PROFIL }, // 9 {(int)(fCos * -WING ) , -PROFIL} , // 10 {(int)(fCos * (int)( -FACT*BODY)), -PROFIL}, // 11 {(int)(fCos * -BODY ) , -DIA}, // 12 {(int)(fCos * BODY ), -DIA} // 13 }; POINT AircraftWingL [7] = { {(int)(0 * -BODY ), DIA }, // 1 {(int)(fCos * (int)( -FACT*BODY)), PROFIL }, // 2 {(int)(fCos * -WING ), 0* PROFIL }, // 3 {(int)(fCos * -WING ), -PROFIL }, // 4 {(int)(fCos * (int)( -FACT*BODY)), -PROFIL }, // 5 {(int)(0 * -BODY ), -DIA }, // 6 {(int)(0 * -BODY ), DIA } // 7 }; POINT AircraftWingR [7] = { {(int)(0 * BODY ) , -DIA }, // 1 {(int)(fCos * (int)( FACT*BODY) ) , -PROFIL }, // 2 {(int)(fCos * WING ) , -PROFIL }, // 3 {(int)(fCos * WING ) , 0* PROFIL}, // 4 {(int)(fCos * (int)( FACT*BODY) ) , PROFIL }, // 5 {(int)(0 * BODY ) , DIA }, // 6 {(int)(0 * BODY ) , -DIA } // 7 }; POINT AircraftTail [5] = { {(int)(fCos * TAIL - fSin*TUBE), -FINH}, // 1 {(int)(fCos * TAIL - fSin*TUBE), -FINH +PROFIL}, // 2 {(int)(fCos * -TAIL - fSin*TUBE), -FINH +PROFIL}, // 3 {(int)(fCos * -TAIL - fSin*TUBE), -FINH }, // 4 {(int)(fCos * TAIL - fSin*TUBE), -FINH}, // 5 }; Start.x = CalcDistanceCoordinat(fDist, psDia); Start.y = CalcHeightCoordinat(fAltitude, psDia); HBRUSH oldBrush; HPEN oldPen; /* if(bInvCol) { oldPen = (HPEN)SelectObject(hdc, GetStockObject(WHITE_PEN)); oldBrush = (HBRUSH)SelectObject(hdc, GetStockObject(BLACK_BRUSH)); } else */ { oldPen = (HPEN) SelectObject(hdc, GetStockObject(BLACK_PEN)); oldBrush = (HBRUSH)SelectObject(hdc, GetStockObject(WHITE_BRUSH)); } //SelectObject(hdc, GetStockObject(BLACK_PEN)); PolygonRotateShift(AircraftWing, 13, Start.x, Start.y, 0); PolygonRotateShift(AircraftSide, 8, Start.x, Start.y, 0); PolygonRotateShift(AircraftTail, 5, Start.x, Start.y, 0); PolygonRotateShift(AircraftWingL, 7, Start.x, Start.y, 0); PolygonRotateShift(AircraftWingR, 7, Start.x, Start.y, 0); HBRUSH GreenBrush = CreateSolidBrush(COLORREF RGB_GREEN); HBRUSH RedBrush = CreateSolidBrush(COLORREF RGB_RED); if((brg < 180)) { SelectObject(hdc, RedBrush); Polygon(hdc,AircraftWingL ,7 ); SelectObject(hdc, GetStockObject(WHITE_BRUSH)); Polygon(hdc,AircraftSide ,8 ); SelectObject(hdc, GreenBrush); Polygon(hdc,AircraftWingR ,7 ); SelectObject(hdc, oldBrush); } else { SelectObject(hdc, GreenBrush); Polygon(hdc,AircraftWingR ,7 ); SelectObject(hdc, GetStockObject(WHITE_BRUSH)); Polygon(hdc,AircraftSide ,8 ); SelectObject(hdc, RedBrush); Polygon(hdc,AircraftWingL ,7 ); SelectObject(hdc, oldBrush); //Polygon(hdc,AircraftWing ,13); } if((brg < 90)|| (brg > 270)) { Polygon(hdc,AircraftTail ,5 ); } SelectObject(hdc, oldPen); SelectObject(hdc, oldBrush); DeleteObject(RedBrush); DeleteObject(GreenBrush); } //else !asp_heading_task