diff --git a/scwx-qt/scwx-qt.cmake b/scwx-qt/scwx-qt.cmake index e8555458..e043e20e 100644 --- a/scwx-qt/scwx-qt.cmake +++ b/scwx-qt/scwx-qt.cmake @@ -52,9 +52,11 @@ set(SRC_MAIN source/scwx/qt/main/main.cpp set(UI_MAIN source/scwx/qt/main/main_window.ui) set(HDR_MAP source/scwx/qt/map/map_widget.hpp source/scwx/qt/map/radar_layer.hpp + source/scwx/qt/map/radar_range_layer.hpp source/scwx/qt/map/triangle_layer.hpp) set(SRC_MAP source/scwx/qt/map/map_widget.cpp source/scwx/qt/map/radar_layer.cpp + source/scwx/qt/map/radar_range_layer.cpp source/scwx/qt/map/triangle_layer.cpp) set(HDR_UTIL source/scwx/qt/util/shader_program.hpp) set(SRC_UTIL source/scwx/qt/util/shader_program.cpp) diff --git a/scwx-qt/source/scwx/qt/map/map_widget.cpp b/scwx-qt/source/scwx/qt/map/map_widget.cpp index 46c6167c..67b7b928 100644 --- a/scwx-qt/source/scwx/qt/map/map_widget.cpp +++ b/scwx-qt/source/scwx/qt/map/map_widget.cpp @@ -1,6 +1,7 @@ #include "map_widget.hpp" #include +#include #include #include @@ -66,7 +67,8 @@ void MapWidget::changeStyle() void MapWidget::AddLayers() { // QMapboxGL::addCustomLayer will take ownership of the QScopedPointer - QScopedPointer pHost(new RadarLayer(map_)); + QScopedPointer pHost( + new RadarLayer(map_)); QString before = "ferry"; @@ -82,6 +84,7 @@ void MapWidget::AddLayers() } map_->addCustomLayer("radar", pHost, before); + RadarRangeLayer::Add(map_, before); } void MapWidget::keyPressEvent(QKeyEvent* ev) diff --git a/scwx-qt/source/scwx/qt/map/radar_range_layer.cpp b/scwx-qt/source/scwx/qt/map/radar_range_layer.cpp new file mode 100644 index 00000000..17d4d60b --- /dev/null +++ b/scwx-qt/source/scwx/qt/map/radar_range_layer.cpp @@ -0,0 +1,61 @@ +#include + +#include + +#include + +namespace scwx +{ +namespace qt +{ + +static const std::string logPrefix_ = "[scwx::qt::map::radar_range_layer] "; + +void RadarRangeLayer::Add(std::shared_ptr map, const QString& before) +{ + BOOST_LOG_TRIVIAL(debug) << logPrefix_ << "Add()"; + + constexpr float range = 460.0f * 1000.0f; + + constexpr float angleDelta = glm::radians(0.5f); + constexpr float angleDeltaH = angleDelta / 2.0f; + + const QMapbox::Coordinate radar {38.6986, -90.6828}; + const QMapbox::ProjectedMeters radarMeters { + QMapbox::projectedMetersForCoordinate(radar)}; + + float angle = -angleDeltaH; + + QMapbox::Coordinates geometry; + + for (uint16_t azimuth = 0; azimuth <= 720; ++azimuth) + { + const float sinTheta = std::sinf(angle); + const float cosTheta = std::cosf(angle); + + const float x = range * sinTheta + radarMeters.second; + const float y = range * cosTheta + radarMeters.first; + + QMapbox::Coordinate point {QMapbox::coordinateForProjectedMeters({y, x})}; + + geometry.append(point); + + angle += angleDelta; + } + + QMapbox::Feature rangeCircle {QMapbox::Feature::LineStringType, + {{geometry}}}; + + map->addSource( + "rangeCircleSource", + {{"type", "geojson"}, {"data", QVariant::fromValue(rangeCircle)}}); + map->addLayer({{"id", "rangeCircleLayer"}, + {"type", "line"}, + {"source", "rangeCircleSource"}}, + before); + map->setPaintProperty( + "rangeCircleLayer", "line-color", "rgba(128, 128, 128, 128)"); +} + +} // namespace qt +} // namespace scwx diff --git a/scwx-qt/source/scwx/qt/map/radar_range_layer.hpp b/scwx-qt/source/scwx/qt/map/radar_range_layer.hpp new file mode 100644 index 00000000..e7d9f575 --- /dev/null +++ b/scwx-qt/source/scwx/qt/map/radar_range_layer.hpp @@ -0,0 +1,16 @@ +#pragma once + +#include + +namespace scwx +{ +namespace qt +{ + +namespace RadarRangeLayer +{ +void Add(std::shared_ptr map, const QString& before = QString()); +}; + +} // namespace qt +} // namespace scwx