44 Bitmap2D* bitmap,
const double extend_dist,
45 const bool no_edge_table) {
49 if (bitmap->
Empty()) {
50 AERROR <<
"bitmap is empty";
53 Eigen::Vector2d poly_min_p, poly_max_p;
54 poly_min_p.setConstant(std::numeric_limits<double>::max());
55 poly_max_p = -poly_min_p;
56 for (
const auto& pt : polygon) {
57 poly_min_p.x() = std::min(pt.x(), poly_min_p.x());
58 poly_min_p.y() = std::min(pt.y(), poly_min_p.y());
60 poly_max_p.x() = std::max(pt.x(), poly_max_p.x());
61 poly_max_p.y() = std::max(pt.y(), poly_max_p.y());
63 if (poly_max_p.x() <= poly_min_p.x()) {
64 AERROR <<
"Invalid polygon";
67 if (poly_max_p.y() <= poly_min_p.y()) {
68 AERROR <<
"Invalid polygon";
71 const Eigen::Vector2d& bitmap_min_range = bitmap->
min_range();
72 const Eigen::Vector2d& bitmap_max_range = bitmap->
max_range();
73 const Eigen::Vector2d& cell_size = bitmap->
cell_size();
74 const int major_dir = bitmap->
dir_major();
78 IntervalIn valid_range;
80 std::max(poly_min_p[major_dir], bitmap_min_range[major_dir]);
82 std::min(poly_max_p[major_dir], bitmap_max_range[major_dir]);
86 (
static_cast<int>((valid_range.first - bitmap_min_range[major_dir]) /
87 cell_size[major_dir]) +
89 cell_size[major_dir] +
90 bitmap_min_range[major_dir];
92 if (valid_range.second < valid_range.first + cell_size[major_dir]) {
93 AWARN <<
"Invalid range: " << valid_range.first <<
" " << valid_range.second
94 <<
". polygon major directory range: " << poly_min_p[major_dir] <<
" "
95 << poly_max_p[major_dir] <<
". cell size: " << cell_size[major_dir];
101 poly_scan_cvter.
Init(polygon);
102 std::vector<std::vector<IntervalOut>> scans_intervals;
104 size_t scans_size =
static_cast<size_t>(
105 (valid_range.second - valid_range.first) / cell_size[major_dir]);
106 scans_intervals.resize(scans_size);
107 for (
size_t i = 0; i < scans_size; ++i) {
108 double scan_loc = valid_range.first + i * cell_size[major_dir];
109 poly_scan_cvter.
ScanCvt(scan_loc,
static_cast<PolyDirMajor
>(major_dir),
110 &(scans_intervals[i]));
113 poly_scan_cvter.
ScansCvt(valid_range,
static_cast<PolyDirMajor
>(major_dir),
114 cell_size[major_dir], &(scans_intervals));
117 double x = valid_range.first;
118 for (
size_t i = 0; i < scans_intervals.size();
119 x += cell_size[major_dir], ++i) {
120 for (
auto scan_interval : scans_intervals[i]) {
121 if (scan_interval.first > scan_interval.second) {
122 AERROR <<
"The input polygon is illegal(complex polygon)";
127 scan_interval.first -= extend_dist;
128 scan_interval.second += extend_dist;
130 IntervalOut valid_y_range;
131 valid_y_range.first =
132 std::max(bitmap_min_range[op_major_dir], scan_interval.first);
133 valid_y_range.second =
134 std::min(bitmap_max_range[op_major_dir], scan_interval.second);
135 if (valid_y_range.first > valid_y_range.second) {
138 bitmap->
Set(x, valid_y_range.first, valid_y_range.second);