/** ****************************************************************************** * @file : studio_geo_algo_c.h * @author : wangyingjie * @brief : C 语言版 几何算法库: DP算法 * @attention : None * @date : 2025/5/11 ****************************************************************************** */ #ifndef STUDIO_GEO_ALGO_C_H #define STUDIO_GEO_ALGO_C_H #include "studio_geo_c.h" /////////////////// 矢量(线)抽稀算法 /////////////////// /// 计算两点之间的距离的平方 /// @param p1 /// @param p2 /// @return double distance_squared(const studio_point_c *p1, const studio_point_c *p2); /// 计算点到线段的距离的平方 /// \param p 点 /// \param start 线段起点 /// \param end 线段终点 /// \return 距离的平方 double point_line_dist_square_c(const studio_point_c *p, const studio_point_c *start, const studio_point_c *end); /// Douglas-Peucker算法,线段压缩 /// \param points 线段 /// \param start 线段起点索引 /// \param end 线段终点索引 /// \param epsilon 抽稀容差,若某点到当前线段的最大垂直距离超过epsilon,则保留该点,单位与适量坐标系的单位一致 /// \param indices 存储简化后的点索引 /// \param index_count 存储简化后的点索引数量 void douglas_peucker_c(const studio_line_c *points, size_t start, size_t end, double epsilon, unsigned int *indices, unsigned int *index_count); /// 矢量线段抽稀算法 /// \param line 线段 /// \param max_points 压缩后最大点 /// \param epsilon 抽稀容差,若某点到当前线段的最大垂直距离超过epsilon,则保留该点,单位与适量坐标系的单位一致 /// \param vacuate_line 抽稀后的线段 /// \return bool line_vacuate_c(const studio_line_c *line, const int max_points, const double epsilon, studio_line_c *vacuate_line); /// 计算哈希值 /// \param value /// \param size /// \return unsigned int hash(unsigned int value, unsigned int size); /// 移除重复点 保持原有顺序 /// \param indices 点索引 /// \param size 点索引数量 void remove_duplicates(unsigned int **indices, unsigned int *size); /////////////////// 移除线段中的离群点 /////////////////// /// 移除线段中的离群点 /// @param line 原始线段 /// @param distance 离群点距离 /// @param outliers_line 滤波后的线段 /// @return bool remove_outliers_c(const studio_line_c *line, double distance, studio_line_c *outliers_line); #endif // STUDIO_GEO_ALGO_C_H