本文整理汇总了C++中LKSurface::Polygon方法的典型用法代码示例。如果您正苦于以下问题:C++ LKSurface::Polygon方法的具体用法?C++ LKSurface::Polygon怎么用?C++ LKSurface::Polygon使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类LKSurface
的用法示例。
在下文中一共展示了LKSurface::Polygon方法的9个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: DrawBestCruiseTrack
void MapWindow::DrawBestCruiseTrack(LKSurface& Surface, const POINT& Orig)
{
if (OvertargetMode>OVT_TASK) return;
if (!ValidTaskPoint(ActiveTaskPoint)) return;
if (DerivedDrawInfo.WaypointDistance < 0.010) return;
// dont draw bestcruise indicator if not needed
if (fabs(DerivedDrawInfo.BestCruiseTrack-DerivedDrawInfo.WaypointBearing)<2) { // 091202 10 to 2
return;
}
const auto hpOld = Surface.SelectObject(LKPen_Blue_N1);
const auto hbOld = Surface.SelectObject(LKBrush_Blue);
if (Appearance.BestCruiseTrack == ctBestCruiseTrackDefault){
int dy = (long)(70);
POINT Arrow[7] = { {-1,-40}, {1,-40}, {1,0}, {6,8}, {-6,8}, {-1,0}, {-1,-40}};
Arrow[2].y -= dy;
Arrow[3].y -= dy;
Arrow[4].y -= dy;
Arrow[5].y -= dy;
PolygonRotateShift(Arrow, 7, Orig.x, Orig.y,
DerivedDrawInfo.BestCruiseTrack-DisplayAngle);
Surface.Polygon(Arrow,7);
} else
if (Appearance.BestCruiseTrack == ctBestCruiseTrackAltA){
POINT Arrow[] = { {-1,-40}, {-1,-62}, {-6,-62}, {0,-70}, {6,-62}, {1,-62}, {1,-40}, {-1,-40}};
PolygonRotateShift(Arrow, sizeof(Arrow)/sizeof(Arrow[0]),
Orig.x, Orig.y,
DerivedDrawInfo.BestCruiseTrack-DisplayAngle);
Surface.Polygon(Arrow, (sizeof(Arrow)/sizeof(Arrow[0])));
}
Surface.SelectObject(hpOld);
Surface.SelectObject(hbOld);
}
示例2: DrawFilledLineGraph
void Statistics::DrawFilledLineGraph(LKSurface& Surface, const RECT& rc,
LeastSquares* lsdata,
const LKColor& color) {
POINT line[4];
for (int i=0; i<lsdata->sum_n-1; i++) {
line[0].x = (int)((lsdata->xstore[i]-x_min)*xscale)+rc.left+BORDER_X;
line[0].y = (int)((y_max-lsdata->ystore[i])*yscale)+rc.top;
line[1].x = (int)((lsdata->xstore[i+1]-x_min)*xscale)+rc.left+BORDER_X;
line[1].y = (int)((y_max-lsdata->ystore[i+1])*yscale)+rc.top;
line[2].x = line[1].x;
line[2].y = rc.bottom-BORDER_Y;
line[3].x = line[0].x;
line[3].y = rc.bottom-BORDER_Y;
Surface.Polygon(line, 4);
}
}
示例3: LKDrawFLARMTraffic
//.........这里部分代码省略.........
sc_name = sc;
sc_name.y -= NIBLSCALE(16);
sc_av = sc_name;
_tcscpy(lbuffer,_T(""));
if (DrawInfo.FLARM_Traffic[i].Cn && DrawInfo.FLARM_Traffic[i].Cn[0]!=_T('?')) { // 100322
_tcscat(lbuffer,DrawInfo.FLARM_Traffic[i].Cn);
}
if (DrawInfo.FLARM_Traffic[i].Average30s>=0.1) {
size_t len = _tcslen(lbuffer);
if (len > 0)
_stprintf(lbuffer + len,_T(":%.1f"),LIFTMODIFY*DrawInfo.FLARM_Traffic[i].Average30s);
else
_stprintf(lbuffer,_T("%.1f"),LIFTMODIFY*DrawInfo.FLARM_Traffic[i].Average30s);
}
displaymode.Border=1;
if (_tcslen(lbuffer)>0)
TextInBox(Surface, &rc, lbuffer, sc.x+tscaler, sc.y+tscaler, &displaymode, false);
// red circle
if ((DrawInfo.FLARM_Traffic[i].AlarmLevel>0) && (DrawInfo.FLARM_Traffic[i].AlarmLevel<4)) {
DrawBitmapIn(Surface, sc, hFLARMTraffic,true);
}
#if 1 // 1
Arrow[0].x = -4;
Arrow[0].y = 5;
Arrow[1].x = 0;
Arrow[1].y = -6;
Arrow[2].x = 4;
Arrow[2].y = 5;
Arrow[3].x = 0;
Arrow[3].y = 2;
Arrow[4].x = -4;
Arrow[4].y = 5;
for (int q=0; q < 5; q++)
{
Arrow[q].x = (LONG) ((double)Arrow[q].x * 1.7);
Arrow[q].y = (LONG) ((double)Arrow[q].y * 1.7);
}
#else
Arrow[0].x = scaler[0];
Arrow[0].y = scaler[1];
Arrow[1].x = 0;
Arrow[1].y = scaler[2];
Arrow[2].x = scaler[3];
Arrow[2].y = scaler[1];
Arrow[3].x = 0;
Arrow[3].y = scaler[4];
Arrow[4].x = scaler[0];
Arrow[4].y = scaler[1];
#endif
/*
switch (DrawInfo.FLARM_Traffic[i].Status) { // 100321
case LKT_GHOST:
Surface.SelectObject(yellowBrush);
break;
case LKT_ZOMBIE:
Surface.SelectObject(redBrush);
break;
default:
Surface.SelectObject(greenBrush);
break;
}
*/
/*************************************************************************
* calculate climb color
*************************************************************************/
int iVarioIdx = (int)(2*DrawInfo.FLARM_Traffic[i].Average30s -0.5)+NO_VARIO_COLORS/2;
if(iVarioIdx < 0) iVarioIdx =0;
if(iVarioIdx >= NO_VARIO_COLORS) iVarioIdx =NO_VARIO_COLORS-1;
Surface.SelectObject(*variobrush[iVarioIdx]);
switch (DrawInfo.FLARM_Traffic[i].Status) { // 100321
case LKT_GHOST:
Surface.Rectangle(sc.x-iRectangleSize, sc.y-iRectangleSize,sc.x+iRectangleSize, sc.y+iRectangleSize);
break;
case LKT_ZOMBIE:
Surface.DrawCircle(sc.x, sc.x, iCircleSize, rc, true );
break;
default:
PolygonRotateShift(Arrow, 5, sc.x, sc.y, DrawInfo.FLARM_Traffic[i].TrackBearing - DisplayAngle);
Surface.Polygon(Arrow,5);
break;
}
}
}
Surface.SelectObject(oldfont);
Surface.SelectObject(hpold);
}
示例4: Paint
//.........这里部分代码省略.........
MapWindow::DrawBitmapIn(Surface, sc, hBitmap,true);
} else {
cshape->renderSpecial(Surface, sc.x, sc.y, rc);
}
}
}
}
#else
// -------------------------- PRINTING ICONS ---------------------------------------------
// no bitmaps for small town over a certain zoom level and no bitmap if no label at all levels
bool nobitmap=false, noiconwithnolabel=false;
if (scaleCategory==90 || scaleCategory==100) {
noiconwithnolabel=true;
if (MapWindow::MapScale>4) nobitmap=true;
}
if (checkVisible(*shape, screenRect))
for (int tt = 0; tt < shape->numlines; tt++) {
for (int jj=0; jj< shape->line[tt].numpoints; jj++) {
POINT sc;
MapWindow::LatLon2Screen(shape->line[tt].point[jj].x, shape->line[tt].point[jj].y, sc);
if (!nobitmap)
#if 101016
// only paint icon if label is printed too
if (noiconwithnolabel) {
if (cshape->renderSpecial(Surface, sc.x, sc.y,labelprinted))
MapWindow::DrawBitmapIn(Surface, sc, hBitmap,true);
} else {
MapWindow::DrawBitmapIn(Surface, sc, hBitmap,true);
cshape->renderSpecial(Surface, sc.x, sc.y,labelprinted);
}
#else
MapWindow::DrawBitmapIn(Surface, sc, hBitmap,true);
cshape->renderSpecial(Surface, sc.x, sc.y);
#endif
}
}
}
#endif // Use optimized point icons 1.23e
break;
case(MS_SHAPE_LINE):
if (checkVisible(*shape, screenRect))
for (int tt = 0; tt < shape->numlines; ++tt) {
int minx = rc.right;
int miny = rc.bottom;
int msize = min(shape->line[tt].numpoints, MAXCLIPPOLYGON);
MapWindow::LatLon2Screen(shape->line[tt].point, pt, msize, 1);
for (int jj=0; jj< msize; ++jj) {
if (pt[jj].x<=minx) {
minx = pt[jj].x;
miny = pt[jj].y;
}
}
Surface.Polyline(pt, msize, rc);
cshape->renderSpecial(Surface,minx,miny,rc);
}
break;
case(MS_SHAPE_POLYGON):
// if it's a water area (nolabels), print shape up to defaultShape, but print
// labels only up to custom label levels
if ( nolabels ) {
if (checkVisible(*shape, screenRect)) {
for (int tt = 0; tt < shape->numlines; ++tt) {
int msize = min(shape->line[tt].numpoints/iskip, MAXCLIPPOLYGON);
MapWindow::LatLon2Screen(shape->line[tt].point, pt, msize*iskip, iskip);
Surface.Polygon(pt, msize, rc);
}
}
} else
if (checkVisible(*shape, screenRect)) {
for (int tt = 0; tt < shape->numlines; ++tt) {
int minx = rc.right;
int miny = rc.bottom;
int msize = min(shape->line[tt].numpoints/iskip, MAXCLIPPOLYGON);
MapWindow::LatLon2Screen(shape->line[tt].point, pt, msize*iskip, iskip);
for (int jj=0; jj< msize; ++jj) {
if (pt[jj].x<=minx) {
minx = pt[jj].x;
miny = pt[jj].y;
}
}
Surface.Polygon(pt, msize, rc);
cshape->renderSpecial(Surface,minx,miny,rc);
}
}
break;
default:
break;
}
}
示例5: DrawRunway
//.........这里部分代码省略.........
if(!bOutland)
{
if (picto)
Surface.DrawCircle(Center.x, Center.y, p, true);
else
Surface.DrawCircle(Center.x, Center.y, p, rc, true);
}
if(bRunway)
{
POINT Runway[5] = {
{ b, l }, // 1
{-b, l }, // 2
{-b,-l }, // 3
{ b,-l }, // 4
{ b,l } // 5
};
if(!bOutland)
{
#ifndef DITHER
if(solid)
Surface.SelectObject(LKBrush_DarkGrey );
else
Surface.SelectObject(LKBrush_White);
#else
if(solid)
Surface.SelectObject(LKBrush_Black);
else
Surface.SelectObject(LKBrush_White);
#endif
}
if(picto) {
threadsafePolygonRotateShift(Runway, 5, Center.x, Center.y, wp->RunwayDir);
} else {
PolygonRotateShift(Runway, 5, Center.x, Center.y, wp->RunwayDir- (int)MapWindow::GetDisplayAngle());
}
Surface.Polygon(Runway ,5 );
} // bRunway
if(fScaleFact >= 0.9) {
if(bGlider)
{
int iScale = (int)(fScaleFact*2.0);
double fFact = 0.04*fScaleFact/1.5;
if(iScale==0) iScale=1;
POINT WhiteWing [17] = {
{ (long)(-228 * fFact ) , (long)(13 * fFact)}, //1
{ (long) (-221 * fFact ) , (long)(-5 * fFact)}, //2
{ (long) (-102 * fFact ) , (long)(-50 * fFact)}, //3
{ (long) (8 * fFact ) , (long)( 5 * fFact)}, //4
{ (long) (149 * fFact ) , (long)(-55 * fFact)}, //5
{ (long) (270 * fFact ) , (long)(-12 * fFact)}, //6
{ (long) (280 * fFact ) , (long)( 5 * fFact)}, //7
{ (long) (152 * fFact ) , (long)(-30 * fFact)}, //8
{ (long) (48 * fFact ) , (long)( 27 * fFact)}, //9
{ (long) (37 * fFact ) , (long)( 44 * fFact)}, //10
{ (long)(-20 * fFact ) , (long)( 65 * fFact)}, //11
{ (long)(-29 * fFact ) , (long)( 80 * fFact)}, //12
{ (long)(-56 * fFact ) , (long)( 83 * fFact)}, //13
{ (long)(-50 * fFact ) , (long)( 40 * fFact)}, //14
{ (long)(-30 * fFact ) , (long)( 27 * fFact)}, //15
{ (long)(-103 * fFact ) , (long)(-26 * fFact)}, //16
{ (long)(-228 * fFact ) , (long)( 13 * fFact)} //17
示例6: RenderPlaneSideview
//.........这里部分代码省略.........
{(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
示例7: RenderFAISector
int RenderFAISector (LKSurface& Surface, const RECT& rc , double lat1, double lon1, double lat2, double lon2, int iOpposite , const LKColor& fillcolor)
{
POINT Pt1;
float fFAI_Percentage = FAI_NORMAL_PERCENTAGE;
double fDist_a, fDist_b, fDist_c, fAngle;
int i;
int iPolyPtr=0;
double lat_d,lon_d;
double alpha, fDistTri, cos_alpha=0;
POINT apSectorPolygon[MAX_FAI_SECTOR_PTS+1];
DistanceBearing(lat1, lon1, lat2, lon2, &fDist_c, &fAngle);
if(fabs(fDist_c) < 1000.0) /* distance too short for a FAI sector */
return -1;
double fDistMax = fDist_c/FAI_NORMAL_PERCENTAGE;
double fDistMin = fDist_c/(1.0-2.0*FAI28_45Threshold);
double fDelta_Dist = 2.0* fDist_c*fFAI_Percentage / (double)(FAI_SECTOR_STEPS-1);
double fA, fB;
double fMinLeg, fMaxLeg,fDiff=0;
double dir = -1.0;
BOOL bBigFAISector = false;
if(fDistMax > FAI28_45Threshold)
{
bBigFAISector = true;
fDistMax = fDist_c/FAI_BIG_PERCENTAGE;
}
if(fDistMin < FAI28_45Threshold)
{
fDistMin = fDist_c/(1.0-2.0*FAI_NORMAL_PERCENTAGE);
}
if (iOpposite >0)
{
dir = 1.0;
}
//#define HELP_LINES
#ifdef HELP_LINES
int x2,y2, style;
FindLatitudeLongitude(lat1, lon1, AngleLimit360 (fAngle), fDist_c/2, &lat_d, &lon_d);
x1 = (lon_d - lon_c)*fastcosine(lat_d);
y1 = (lat_d - lat_c);
FindLatitudeLongitude(lat_d, lon_d, AngleLimit360 (fAngle-90.0), fDist_c, &lat_d, &lon_d);
x2 = (lon_d - lon_c)*fastcosine(lat_d);
y2 = (lat_d - lat_c);
Surface.DrawLine(rc, x1, y1, x2, y2, style);
#endif
/********************************************************************
* right below threshold 1
********************************************************************/
fA = fDistMin;
if(fDistMax > FAI28_45Threshold)
fB = FAI28_45Threshold;
else
fB = fDistMax ;
if(fA<fB)
{
fDelta_Dist =(fB-fA)/ (double)(FAI_SECTOR_STEPS-1);
fDistTri = fA;
for(i =0 ;i < FAI_SECTOR_STEPS; i++)
{
fDist_a = FAI_NORMAL_PERCENTAGE * fDistTri;
fDist_b = fDistTri - fDist_a - fDist_c;
LKASSERT(fDist_c*fDist_b!=0);
cos_alpha = ( fDist_b*fDist_b + fDist_c*fDist_c - fDist_a*fDist_a )/(2.0*fDist_c*fDist_b);
alpha = acos(cos_alpha)*180/PI * dir;
FindLatitudeLongitude(lat1, lon1, AngleLimit360( fAngle + alpha ) , fDist_b, &lat_d, &lon_d);
MapWindow::LatLon2Screen(lon_d, lat_d, Pt1);
LKASSERT(iPolyPtr < MAX_FAI_SECTOR_PTS);
apSectorPolygon[iPolyPtr++] = Pt1;
fDistTri += fDelta_Dist;
}
}
/********************************************************************
* right threshold extender 2
********************************************************************/
if(fDistMin < FAI28_45Threshold)
if(bBigFAISector && (fDistMin < FAI28_45Threshold))
{
fMaxLeg = FAI28_45Threshold*FAI_BIG_MAX_PERCENTAGE;
fMinLeg = FAI28_45Threshold*FAI_BIG_PERCENTAGE;
fA = FAI28_45Threshold*FAI_NORMAL_PERCENTAGE;
fB = FAI28_45Threshold-fMaxLeg-fDist_c;
if(fB < fMinLeg)
//.........这里部分代码省略.........
示例8: iround
void MapWindow::DrawWindAtAircraft2(LKSurface& Surface, const POINT& Orig, const RECT& rc) {
int i;
POINT Start;
TCHAR sTmp[12];
static SIZE tsize = {0,0};
if (DerivedDrawInfo.WindSpeed<1) {
return; // JMW don't bother drawing it if not significant
}
if (tsize.cx == 0){
const auto oldFont = Surface.SelectObject(MapWindowBoldFont);
Surface.GetTextSize(TEXT("99"), 2, &tsize);
Surface.SelectObject(oldFont);
tsize.cx = tsize.cx/2;
}
int wmag = iround(4.0*DerivedDrawInfo.WindSpeed);
Start.y = Orig.y;
Start.x = Orig.x;
int kx = tsize.cx/ScreenScale/2;
POINT Arrow[7] = { {0,-20}, {-6,-26}, {0,-20},
{6,-26}, {0,-20},
{8+kx, -24},
{-8-kx, -24}};
for (i=1;i<4;i++)
Arrow[i].y -= wmag;
PolygonRotateShift(Arrow, 7, Start.x, Start.y,
DerivedDrawInfo.WindBearing-DisplayAngle);
//
// Draw Wind Arrow
//
POINT Tail[2] = {{0,-20}, {0,-26-min(20,wmag)*3}};
double angle = AngleLimit360(DerivedDrawInfo.WindBearing-DisplayAngle);
for(i=0; i<2; i++) {
if (ScreenScale>1) {
Tail[i].x *= ScreenScale;
Tail[i].y *= ScreenScale;
}
protateshift(Tail[i], angle, Start.x, Start.y);
}
// optionally draw dashed line for wind arrow
Surface.DrawLine(PEN_DASH, 1, Tail[0], Tail[1], LKColor(0,0,0), rc);
// Paint wind value only while circling
if ( (mode.Is(Mode::MODE_CIRCLING)) ) {
_stprintf(sTmp, _T("%d"), iround(DerivedDrawInfo.WindSpeed * SPEEDMODIFY));
TextInBoxMode_t TextInBoxMode = {0};
TextInBoxMode.AlligneCenter = true; // { 16 | 32 }; // JMW test {2 | 16};
TextInBoxMode.WhiteBorder = true;
if (Arrow[5].y>=Arrow[6].y) {
TextInBox(Surface, &rc, sTmp, Arrow[5].x-kx, Arrow[5].y, 0, &TextInBoxMode);
} else {
TextInBox(Surface, &rc, sTmp, Arrow[6].x-kx, Arrow[6].y, 0, &TextInBoxMode);
}
}
const auto hpOld = Surface.SelectObject(LKPen_Black_N2);
const auto hbOld = Surface.SelectObject(LKBrush_Grey);
Surface.Polygon(Arrow,5);
Surface.SelectObject(hbOld);
Surface.SelectObject(hpOld);
}
示例9: RenderAirspaceTerrain
void RenderAirspaceTerrain(LKSurface& Surface, double PosLat, double PosLon, double brg, DiagrammStruct* psDiag) {
RECT rc = psDiag->rc;
//rc.bottom +=BORDER_Y;
double range = psDiag->fXMax - psDiag->fXMin; // km
double hmax = psDiag->fYMax;
double lat, lon;
int i, j;
if (!IsDithered() && IsMultimapTerrain()) {
RenderSky(Surface, rc, SKY_HORIZON_COL, SKY_SPACE_COL, GC_NO_COLOR_STEPS);
} else {
Surface.FillRect(&rc, MapWindow::hInvBackgroundBrush[BgMapColor]);
}
FindLatitudeLongitude(PosLat, PosLon, brg, psDiag->fXMin, &lat, &lon);
POINT apTerrainPolygon[AIRSPACE_SCANSIZE_X + 4] = {};
double d_lat[AIRSPACE_SCANSIZE_X] = {};
double d_lon[AIRSPACE_SCANSIZE_X] = {};
double d_h[AIRSPACE_SCANSIZE_X] = {};
#define FRAMEWIDTH 2
RasterTerrain::Lock(); // want most accurate rounding here
RasterTerrain::SetTerrainRounding(0, 0);
double fj;
for (j = 0; j < AIRSPACE_SCANSIZE_X; j++) { // scan range
fj = (double) j * 1.0 / (double) (AIRSPACE_SCANSIZE_X - 1);
FindLatitudeLongitude(lat, lon, brg, range*fj, &d_lat[j], &d_lon[j]);
d_h[j] = RasterTerrain::GetTerrainHeight(d_lat[j], d_lon[j]);
if (d_h[j] == TERRAIN_INVALID) d_h[j] = 0; //@ 101027 BUGFIX
hmax = max(hmax, d_h[j]);
}
RasterTerrain::Unlock();
/********************************************************************************
* scan line
********************************************************************************/
if (IsMultimapAirspace())
Sideview_iNoHandeldSpaces = CAirspaceManager::Instance().ScanAirspaceLineList(d_lat, d_lon, d_h, Sideview_pHandeled, MAX_NO_SIDE_AS); // Sideview_pHandeled[GC_MAX_NO];
else
Sideview_iNoHandeldSpaces = 0;
#if BUGSTOP
LKASSERT(Sideview_iNoHandeldSpaces < MAX_NO_SIDE_AS);
#endif
if (Sideview_iNoHandeldSpaces >= MAX_NO_SIDE_AS) Sideview_iNoHandeldSpaces = MAX_NO_SIDE_AS - 1;
/********************************************************************************
* bubble sort to start with biggest airspaces
********************************************************************************/
int iSizeLookupTable[MAX_NO_SIDE_AS];
for (i = 0; i < Sideview_iNoHandeldSpaces; i++)
iSizeLookupTable[i] = i;
for (i = 0; i < Sideview_iNoHandeldSpaces; i++) {
#if BUGSTOP
LKASSERT(iSizeLookupTable[i] < MAX_NO_SIDE_AS);
#endif
for (j = i; j < Sideview_iNoHandeldSpaces; j++) {
#if BUGSTOP
LKASSERT(iSizeLookupTable[j] < MAX_NO_SIDE_AS);
#endif
if (iSizeLookupTable[i] >= MAX_NO_SIDE_AS) continue;
if (iSizeLookupTable[j] >= MAX_NO_SIDE_AS) continue;
if (Sideview_pHandeled[iSizeLookupTable[i]].iAreaSize < Sideview_pHandeled[iSizeLookupTable[j]].iAreaSize) {
int iTmp = iSizeLookupTable[i];
iSizeLookupTable[i] = iSizeLookupTable[j];
iSizeLookupTable[j] = iTmp;
}
}
}
/**********************************************************************************
* transform into diagram coordinates
**********************************************************************************/
double dx1 = (double) (rc.right) / (double) (AIRSPACE_SCANSIZE_X - 1);
int x0 = rc.left;
LKASSERT(Sideview_iNoHandeldSpaces < MAX_NO_SIDE_AS);
for (i = 0; i < Sideview_iNoHandeldSpaces; i++) {
Sideview_pHandeled[i].rc.left = (long) ((Sideview_pHandeled[i].rc.left) * dx1) + x0 - FRAMEWIDTH / 2;
Sideview_pHandeled[i].rc.right = (long) ((Sideview_pHandeled[i].rc.right) * dx1) + x0 + FRAMEWIDTH / 2;
Sideview_pHandeled[i].rc.bottom = CalcHeightCoordinat((double) Sideview_pHandeled[i].rc.bottom, psDiag) + FRAMEWIDTH / 2;
Sideview_pHandeled[i].rc.top = CalcHeightCoordinat((double) Sideview_pHandeled[i].rc.top, psDiag) - FRAMEWIDTH / 2;
Sideview_pHandeled[i].iMaxBase = Sideview_pHandeled[i].rc.bottom;
Sideview_pHandeled[i].iMinTop = Sideview_pHandeled[i].rc.top;
int iN = Sideview_pHandeled[i].iNoPolyPts;
#if BUGSTOP
LKASSERT(iN < GC_MAX_POLYGON_PTS);
#endif
if (iN >= GC_MAX_POLYGON_PTS) iN = GC_MAX_POLYGON_PTS - 1;
if (Sideview_pHandeled[i].bRectAllowed == false) {
for (j = 0; j < iN; j++) {
Sideview_pHandeled[i].apPolygon[j].x = (long) (((Sideview_pHandeled[i].apPolygon[j].x) * dx1) + x0);
Sideview_pHandeled[i].apPolygon[j].y = CalcHeightCoordinat((double) Sideview_pHandeled[i].apPolygon[j].y, psDiag);
if (j != iN - 1) {
if ((j < iN / 2)) {
Sideview_pHandeled[i].iMaxBase = min((long) Sideview_pHandeled[i].iMaxBase, (long) Sideview_pHandeled[i].apPolygon[j].y);
//.........这里部分代码省略.........