GeoBounds SearchPointVector::CalculateGeoBounds() const { GeoBounds bb = GeoBounds::Invalid(); for (const auto &i : *this) bb.Extend(i.GetLocation()); return bb; }
void OZPreviewRenderer::Draw(Canvas &canvas, const ObservationZonePoint &oz, const RasterPoint pt, unsigned radius, const TaskLook &look, const AirspaceRendererSettings &airspace_settings, const AirspaceLook &airspace_look) { fixed scale; GeoPoint center; if (IsAncientHardware()) { scale = fixed(radius) / ((const CylinderZone &)oz).GetRadius(); center = oz.GetReference(); } else { OZBoundary boundary = oz.GetBoundary(); GeoBounds bounds = GeoBounds::Invalid(); for (auto i = boundary.begin(), end = boundary.end(); i != end; ++i) bounds.Extend(*i); center = bounds.GetCenter(); fixed geo_width = bounds.GetGeoWidth(); fixed geo_heigth = bounds.GetGeoHeight(); scale = fixed(radius * 2) / std::max(geo_heigth, geo_width); } WindowProjection projection; projection.SetScreenSize({radius * 2, radius * 2}); projection.SetScreenOrigin(pt.x, pt.y); projection.SetGeoLocation(center); projection.SetScale(scale); projection.SetScreenAngle(Angle::Zero()); projection.UpdateScreenBounds(); OZRenderer ozv(look, airspace_look, airspace_settings); ozv.Draw(canvas, OZRenderer::LAYER_SHADE, projection, oz, 1); ozv.Draw(canvas, OZRenderer::LAYER_INACTIVE, projection, oz, 1); ozv.Draw(canvas, OZRenderer::LAYER_ACTIVE, projection, oz, 1); }