You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

34 lines
1.1 KiB
C++

2 months ago
// filter.cpp - 点云 XY 过滤实现
#include "filter.h"
#include "config.h"
#include <cmath>
// mm,判定为原点的容差(与 config.h 中 ORIGIN_TOL_MM 一致,此处直接引用)
bool is_origin_point(double x_mm, double y_mm) {
return std::abs(x_mm) < ORIGIN_TOL_MM && std::abs(y_mm) < ORIGIN_TOL_MM;
}
bool point_in_polygon(double px, double py,
const std::vector<std::pair<double, double>>& poly, int n)
{
bool inside = false;
for (int i = 0, j = n - 1; i < n; j = i++)
{
double xi = poly[i].first, yi = poly[i].second;
double xj = poly[j].first, yj = poly[j].second;
if (((yi > py) != (yj > py)) &&
(px < (xj - xi) * (py - yi) / (yj - yi) + xi))
{
inside = !inside;
}
}
return inside;
}
bool xy_filter_allowed(double x_mm, double y_mm) {
if (is_origin_point(x_mm, y_mm)) return false; // 原点噪点丢弃
if (!FILTER_ENABLE) return true; // 未启用多边形过滤则全保留
return point_in_polygon(x_mm, y_mm, Filter_Polygon, Filter_Poly_N);
}