studio_geo_algo_c.h 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. /**
  2. ******************************************************************************
  3. * @file : studio_geo_algo_c.h
  4. * @author : wangyingjie
  5. * @brief : C 语言版几何算法库,包含常用的空间计算、线段抽稀、去除离群点等几何操作算法。
  6. * 提供多种几何计算函数,如计算点之间的距离、方位角、点到线段的最短距离、以及线段的抽稀处理(Douglas-Peucker算法等)。
  7. * 适用于笛卡尔坐标系和大地坐标系(经纬度)的应用场景。
  8. * @attention : None
  9. * @date : 2025/5/11
  10. ******************************************************************************
  11. */
  12. #ifndef STUDIO_GEO_ALGO_C_H
  13. #define STUDIO_GEO_ALGO_C_H
  14. #include "studio_geo_c.h"
  15. /////////////////// 基础适量算法 ///////////////////
  16. /// 计算两点之间的距离的平方 (笛卡尔坐标系)
  17. /// @param p1
  18. /// @param p2
  19. /// @return
  20. double distance_squared_c(const studio_point_c *p1, const studio_point_c *p2);
  21. /// 计算点到线段的距离的平方 (笛卡尔坐标系)
  22. /// \param p 点
  23. /// \param start 线段起点
  24. /// \param end 线段终点
  25. /// \return 距离的平方 (单位 米)
  26. double point_line_dist_square_c(const studio_point_c *p, const studio_point_c *start, const studio_point_c *end);
  27. /// 计算两点之间的方位角 (笛卡尔坐标系)
  28. /// 方位角是从点 p_from 指向点 p_to 的向量与正北方向的顺时针夹角,单位为度
  29. /// @param p_from
  30. /// @param p_to
  31. /// @return
  32. double azimuth_angle_c(const studio_point_c *p_from, const studio_point_c *p_to);
  33. /// 计算两个经纬度之间的距离的平方 (大地坐标系)
  34. /// @param p1
  35. /// @param p2
  36. /// @return 距离的平方 (单位 米)
  37. double distance_squared_gcs_c(const studio_point_c *p1, const studio_point_c *p2);
  38. /// 计算经纬度点到经纬度线的距离的平方 (大地坐标系)
  39. /// \param p 点
  40. /// \param start 线段起点
  41. /// \param end 线段终点
  42. /// \return 距离的平方 (单位 米)
  43. double point_line_dist_square_gcs_c(const studio_point_c *p, const studio_point_c *start, const studio_point_c *end);
  44. /// 计算两点之间的方位角 (大地坐标系)
  45. /// 方位角是从点 p_from 指向点 p_to 的向量与正北方向的顺时针夹角,单位为度
  46. /// @param p_from
  47. /// @param p_to
  48. /// @return
  49. double azimuth_angle_gcs_c(const studio_point_c *p_from, const studio_point_c *p_to);
  50. /// <summary>
  51. /// 计算经纬度点移动一定距离后的新点
  52. /// </summary>
  53. /// <param name="pt"></param>
  54. /// <param name="delta_x">X方向移动距离,单位为米</param>
  55. /// <param name="delta_y">Y方向移动距离,单位为米</param>
  56. /// <returns></returns>
  57. studio_point_c lonlat_move_by(const studio_point_c *pt, double delta_x, double delta_y);
  58. /////////////////// 矢量(线)抽稀算法 ///////////////////
  59. /// Douglas-Peucker算法,线段压缩
  60. /// \param points 线段
  61. /// \param start 线段起点索引
  62. /// \param end 线段终点索引
  63. /// \param epsilon 抽稀容差,若某点到当前线段的最大垂直距离超过epsilon,则保留该点,单位与适量坐标系的单位一致
  64. /// \param indices 存储简化后的点索引
  65. /// \param index_count 存储简化后的点索引数量
  66. void douglas_peucker_c(const studio_line_c *points, size_t start, size_t end, double epsilon, unsigned int *indices, unsigned int *index_count);
  67. /// 矢量线段抽稀算法
  68. /// \param line 原始线段
  69. /// \param max_points 压缩后最大点
  70. /// \param epsilon 抽稀容差,若某点到当前线段的最大垂直距离超过epsilon,则保留该点,单位与适量坐标系的单位一致
  71. /// \param vacuate_line 抽稀后的线段
  72. /// \return
  73. bool line_vacuate_c(const studio_line_c *line, const int max_points, const double epsilon, studio_line_c *vacuate_line);
  74. /// 矢量线段抽稀算法 大地坐标系(GCS), 坐标点为十进制经纬度
  75. /// @param line 原始线段
  76. /// @param max_points 压缩后最大点
  77. /// @param epsilon 抽稀容差,若某点到当前线段的最大垂直距离超过epsilon,这里单位是米
  78. /// @param vacuate_line 抽稀后的线段
  79. /// @return
  80. bool line_vacuate_gcs_c(const studio_line_c *line, const int max_points, const double epsilon, studio_line_c *vacuate_line);
  81. /////////////////// 移除线段中的离群点 ///////////////////
  82. /// 计算哈希值
  83. /// \param value
  84. /// \param size
  85. /// \return
  86. unsigned int hash(unsigned int value, unsigned int size);
  87. /// 移除重复点 保持原有顺序
  88. /// \param indices 点索引
  89. /// \param size 点索引数量
  90. void remove_duplicates(unsigned int **indices, unsigned int *size);
  91. /// 移除线段中的离群点
  92. /// @param line 原始线段
  93. /// @param distance 离群点距离
  94. /// @param outliers_line 滤波后的线段
  95. /// @return
  96. bool remove_outliers_c(const studio_line_c *line, double distance, studio_line_c *outliers_line);
  97. #endif // STUDIO_GEO_ALGO_C_H