void ChartRenderer::ScaleYFromData(const LeastSquares &lsdata) { if (lsdata.IsEmpty()) return; if (y.unscaled) { y.min = lsdata.GetMinY(); y.max = lsdata.GetMaxY(); y.unscaled = false; } else { y.min = std::min(y.min, lsdata.GetMinY()); y.max = std::max(y.max, lsdata.GetMaxY()); } if (lsdata.HasResult()) { auto y0 = lsdata.GetYAtMinX(); auto y1 = lsdata.GetYAtMaxX(); y.min = std::min({y.min, y0, y1}); y.max = std::max({y.max, y0, y1}); } if (fabs(y.max - y.min) > 50) { y.scale = (y.max - y.min); if (y.scale > 0) y.scale = (rc.bottom - rc.top - padding_bottom) / y.scale; } else { y.scale = 2000; } }
void ChartRenderer::DrawTrendN(const LeastSquares &lsdata, ChartLook::Style style) { if (!lsdata.HasResult()) return; if (x.unscaled || y.unscaled) return; double xmin = 0.5; double xmax = lsdata.GetCount() + 0.5; double ymin = lsdata.GetYAtMinX(); double ymax = lsdata.GetYAtMaxX(); DrawLine(xmin, ymin, xmax, ymax, look.GetPen(style)); }
/** * Convert a #LeastSquares to a #WaveInfo. Returns * WaveInfo::Undefined() if there is no valid result in the * #LeastSquares instance. */ gcc_pure static WaveInfo GetWaveInfo(const LeastSquares &ls, const FlatProjection &projection, double time) { if (!ls.HasResult()) return WaveInfo::Undefined(); const FlatPoint flat_location(ls.GetMiddleX(), ls.GetAverageY()); const GeoPoint location(projection.Unproject(flat_location)); const GeoPoint a(projection.Unproject(FlatPoint(ls.GetMinX(), ls.GetYAtMinX()))); const GeoPoint b(projection.Unproject(FlatPoint(ls.GetMaxX(), ls.GetYAtMaxX()))); Angle bearing = a.Bearing(b); Angle normal = (bearing + Angle::QuarterCircle()).AsBearing(); return {location, a, b, normal, time}; }