void TrackLineRenderer::DrawProjected(Canvas &canvas, const WindowProjection &projection, const NMEAInfo &basic, const DerivedInfo &calculated, const MapSettings &settings, bool wind_relative) { // projection.GetMapScale() <= 6000; GeoPoint traildrift; if (calculated.wind_available && !wind_relative) { GeoPoint tp1 = FindLatitudeLongitude(basic.location, calculated.wind.bearing, calculated.wind.norm); traildrift = basic.location - tp1; } else { traildrift = GeoPoint(Angle::Zero(), Angle::Zero()); } auto dt = ARC_SWEEP/ARC_STEPS/ std::max(MIN_RATE,calculated.turn_rate_heading_smoothed.Absolute()); Angle heading = basic.attitude.heading; GeoPoint loc = basic.location; RasterPoint pts[ARC_STEPS+1]; pts[0] = projection.GeoToScreen(loc); int i = 1; while (i <= ARC_STEPS) { GeoVector v(basic.true_airspeed*dt, heading); loc = v.EndPoint(loc.Parametric(traildrift, dt)); pts[i] = projection.GeoToScreen(loc); heading += calculated.turn_rate_heading_smoothed*dt; i++; } canvas.Select(look.track_line_pen); canvas.DrawPolyline(pts, i); }