From c3037d6d38fd94076adf82b3a3998f84535d8d25 Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Sat, 17 Jul 2021 15:54:13 -0500 Subject: [PATCH] Draw radar range circle using geodesic projection --- CMakeLists.txt | 3 +- external/mapbox-gl-native.cmake | 2 ++ scwx-qt/scwx-qt.cmake | 7 ++-- .../source/scwx/qt/map/radar_range_layer.cpp | 32 ++++++++++++------- 4 files changed, 29 insertions(+), 15 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index dcda2407..d7935fd1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,6 +16,7 @@ conan_cmake_configure(REQUIRES boost/1.76.0 glm/0.9.9.8 gtest/cci.20210126 openssl/1.1.1k + proj/8.1.0 vulkan-loader/1.2.172 GENERATORS cmake cmake_find_package @@ -29,7 +30,7 @@ conan_cmake_autodetect(settings) conan_cmake_install(PATH_OR_REFERENCE . BUILD missing - REMOTE conan-center + REMOTE conancenter SETTINGS ${settings}) include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) diff --git a/external/mapbox-gl-native.cmake b/external/mapbox-gl-native.cmake index 7796350f..b1831df5 100644 --- a/external/mapbox-gl-native.cmake +++ b/external/mapbox-gl-native.cmake @@ -9,6 +9,8 @@ find_package(ZLIB) target_include_directories(mbgl-core PRIVATE ${ZLIB_INCLUDE_DIRS}) target_link_libraries(mbgl-core INTERFACE ${ZLIB_LIBRARIES}) +set(MBGL_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/mapbox-gl-native/include PARENT_SCOPE) + set_target_properties(mbgl-qt PROPERTIES EXCLUDE_FROM_ALL True) set_target_properties(mbgl-test-runner PROPERTIES EXCLUDE_FROM_ALL True) set_target_properties(mbgl-vendor-icu PROPERTIES EXCLUDE_FROM_ALL True) diff --git a/scwx-qt/scwx-qt.cmake b/scwx-qt/scwx-qt.cmake index e043e20e..5dcd9456 100644 --- a/scwx-qt/scwx-qt.cmake +++ b/scwx-qt/scwx-qt.cmake @@ -13,6 +13,7 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(Boost) find_package(glm) +find_package(proj) # QtCreator supports the following variables for Android, which are identical to qmake Android variables. # Check https://doc.qt.io/qt/deployment-android.html for more information. @@ -96,11 +97,13 @@ qt_add_executable(scwx-qt qt6_create_translation_scwx(QM_FILES ${scwx-qt_SOURCE_DIR} ${TS_FILES}) -target_include_directories(scwx-qt PRIVATE ${scwx-qt_SOURCE_DIR}/source) +target_include_directories(scwx-qt PRIVATE ${scwx-qt_SOURCE_DIR}/source + ${MBGL_INCLUDE_DIR}) target_link_libraries(scwx-qt PRIVATE Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::OpenGLWidgets Boost::log qmapboxgl opengl32 - glm::glm) + glm::glm + PROJ::proj) diff --git a/scwx-qt/source/scwx/qt/map/radar_range_layer.cpp b/scwx-qt/source/scwx/qt/map/radar_range_layer.cpp index 17d4d60b..584f5f8e 100644 --- a/scwx-qt/source/scwx/qt/map/radar_range_layer.cpp +++ b/scwx-qt/source/scwx/qt/map/radar_range_layer.cpp @@ -1,8 +1,9 @@ #include #include - +#include #include +#include namespace scwx { @@ -11,18 +12,21 @@ namespace qt static const std::string logPrefix_ = "[scwx::qt::map::radar_range_layer] "; +static constexpr double EARTH_FLATTENING = 1 / 298.257223563; + void RadarRangeLayer::Add(std::shared_ptr map, const QString& before) { BOOST_LOG_TRIVIAL(debug) << logPrefix_ << "Add()"; + geod_geodesic g; + geod_init(&g, mbgl::util::EARTH_RADIUS_M, EARTH_FLATTENING); + constexpr float range = 460.0f * 1000.0f; - constexpr float angleDelta = glm::radians(0.5f); + constexpr float angleDelta = 0.5f; constexpr float angleDeltaH = angleDelta / 2.0f; - const QMapbox::Coordinate radar {38.6986, -90.6828}; - const QMapbox::ProjectedMeters radarMeters { - QMapbox::projectedMetersForCoordinate(radar)}; + const QMapbox::Coordinate radar {38.6986, -90.6828}; float angle = -angleDeltaH; @@ -30,15 +34,19 @@ void RadarRangeLayer::Add(std::shared_ptr map, const QString& before) for (uint16_t azimuth = 0; azimuth <= 720; ++azimuth) { - const float sinTheta = std::sinf(angle); - const float cosTheta = std::cosf(angle); + double latitude; + double longitude; - const float x = range * sinTheta + radarMeters.second; - const float y = range * cosTheta + radarMeters.first; + geod_direct(&g, + radar.first, + radar.second, + angle, + range, + &latitude, + &longitude, + nullptr); - QMapbox::Coordinate point {QMapbox::coordinateForProjectedMeters({y, x})}; - - geometry.append(point); + geometry.append({latitude, longitude}); angle += angleDelta; }