25static constexpr uint64_t kZeroLast =
static_cast<uint64_t
>(-1) - 1;
33inline bool Bitmap2D::CheckBit(
const size_t loc,
const uint64_t block)
const {
34 return block & (
static_cast<uint64_t
>(1) << loc);
37inline void Bitmap2D::SetBit(
const size_t loc, uint64_t* block) {
38 (*block) |= (
static_cast<uint64_t
>(1) << loc);
41inline void Bitmap2D::ResetBit(
const size_t loc, uint64_t* block) {
42 (*block) &= (~(
static_cast<uint64_t
>(1) << loc));
45inline void Bitmap2D::SetTailBits(
const size_t tail_num, uint64_t* block) {
46 (*block) |= (~(
static_cast<uint64_t
>(-1) << tail_num));
49inline void Bitmap2D::ResetTailBits(
const size_t tail_num, uint64_t* block) {
50 (*block) &= (
static_cast<uint64_t
>(-1) << tail_num);
53inline void Bitmap2D::SetHeadBits(
const size_t tail_num, uint64_t* block) {
54 (*block) |= (
static_cast<uint64_t
>(-1) << tail_num);
57inline void Bitmap2D::ResetHeadBits(
const size_t tail_num, uint64_t* block) {
58 (*block) &= ~(
static_cast<uint64_t
>(-1) << tail_num);
61inline void Bitmap2D::SetRangeBits(
const size_t head,
const size_t tail,
64 (*block) |= ((
static_cast<uint64_t
>(-1) << tail) & (~(kZeroLast << head)));
67inline void Bitmap2D::ResetRangeBits(
const size_t head,
const size_t tail,
69 (*block) &= ((~(
static_cast<uint64_t
>(-1) << tail)) | (kZeroLast << head));
73 const Eigen::Vector2d& max_range,
74 const Eigen::Vector2d& cell_size) {
85 ((max_range_ - min_range_).array() / cell_size_.array()).cast<size_t>();
87 map_size_[0] = dims_[0];
88 map_size_[1] = (dims_[1] >> 6) + 1;
89 bitmap_.resize(map_size_[0] * map_size_[1], 0);
95 memset(bitmap_.data(), 0,
sizeof(bitmap_[0]) * bitmap_.size());
99inline Bitmap2D::Vec3ui Bitmap2D::RealToBitmap(
const Eigen::Vector2d& p)
const {
100 Vec2ui pix = ((p - min_range_).array() / cell_size_.array()).cast<size_t>();
103 bit_p.x() = major_pix.x();
104 bit_p.y() = major_pix.y() >> 6;
105 bit_p.z() = major_pix.y() & 63;
111 return static_cast<int>(p.x() * map_size_[1] + p.y());
116 return p.x() >= min_range_.x() && p.x() < max_range_.x() &&
117 p.y() >= min_range_.y() && p.y() < max_range_.y();
122 const Vec3ui bit_p = RealToBitmap(p);
123 const int idx = Index(bit_p);
124 return CheckBit(bit_p.z(), bitmap_[idx]);
129 const Vec3ui bit_p = RealToBitmap(p);
130 const int idx = Index(bit_p);
131 return SetBit(bit_p.z(), &bitmap_[idx]);
135 const Vec3ui bit_p = RealToBitmap(p);
136 const int idx = Index(bit_p);
137 return ResetBit(bit_p.z(), &bitmap_[idx]);
141 Eigen::Vector2d real_left, real_right;
145 const Vec3ui left_bit_p = RealToBitmap(real_left);
146 const Vec3ui right_bit_p = RealToBitmap(real_right);
147 if (left_bit_p.y() == right_bit_p.y()) {
148 const int idx = Index(left_bit_p);
149 SetRangeBits(right_bit_p.z(), left_bit_p.z(), &bitmap_[idx]);
152 const size_t left_idx = Index(left_bit_p);
153 const size_t right_idx = Index(right_bit_p);
154 SetHeadBits(left_bit_p.z(), &bitmap_[left_idx]);
155 SetTailBits(right_bit_p.z(), &bitmap_[right_idx]);
156 for (
size_t i = left_idx + 1; i < right_idx; ++i) {
157 bitmap_[i] =
static_cast<uint64_t
>(-1);
162 Eigen::Vector2d real_left, real_right;
166 const Vec3ui left_bit_p = RealToBitmap(real_left);
167 const Vec3ui right_bit_p = RealToBitmap(real_right);
168 if (left_bit_p.y() == right_bit_p.y()) {
169 const int idx = Index(left_bit_p);
170 ResetRangeBits(right_bit_p.z() + 1, left_bit_p.z(), &bitmap_[idx]);
174 const size_t left_idx = Index(left_bit_p);
175 const size_t right_idx = Index(right_bit_p);
176 ResetHeadBits(left_bit_p.z(), &bitmap_[left_idx]);
177 ResetTailBits(right_bit_p.z(), &bitmap_[right_idx]);
178 for (
size_t i = left_idx + 1; i < right_idx; ++i) {
179 bitmap_[i] =
static_cast<uint64_t
>(0);
const Eigen::Vector2d & max_range() const
Return the max_range_
void Set(const Eigen::Vector2d &p)
Set the vector p
int dir_major() const
Return the dir_major_
void SetUp(const DirectionMajor dir_major)
Set the dir_major_ and op_dir_major_
DirectionMajor OppositeDirection(const DirectionMajor dir_major)
Opposite direction of direction_major
bool IsExists(const Eigen::Vector2d &p) const
check the vector p is in bitmap_
void Reset(const Eigen::Vector2d &p)
Reset the vector p
const Eigen::Vector2d & min_range() const
Return the min_range_
int op_dir_major() const
Return the op_dir_major
Eigen::Matrix< size_t, 3, 1 > Vec3ui
void Init(const Eigen::Vector2d &min_range, const Eigen::Vector2d &max_range, const Eigen::Vector2d &cell_size)
Init of Bitmap 2D object
bool Check(const Eigen::Vector2d &p) const
Check the vector p
Eigen::Matrix< size_t, 2, 1 > Vec2ui
const Eigen::Vector2d & cell_size() const
Return the cell_size_