42 : width_(
width), height_(
height), score_(0), max_score_(0) {
43 pyramid_.resize(num_levels);
44 for (
size_t level = 0; level < num_levels; ++level) {
45 const size_t level_plus_one = level + 1;
46 const int dim = 1 << level_plus_one;
47 pyramid_[level].setZero(dim, dim);
48 max_score_ += dim * dim * dim * dim;
53 CHECK_GT(pyramid_.size(), 0);
57 CellForPoint(
x,
y, &cx, &cy);
59 for (
int i =
static_cast<int>(pyramid_.size() - 1); i >= 0; --i) {
60 auto& level = pyramid_[i];
63 if (level(cy, cx) == 1) {
64 score_ += level.size();
71 CHECK_LE(score_, max_score_);
75 CHECK_GT(pyramid_.size(), 0);
79 CellForPoint(
x,
y, &cx, &cy);
81 for (
int i =
static_cast<int>(pyramid_.size() - 1); i >= 0; --i) {
82 auto& level = pyramid_[i];
85 if (level(cy, cx) == 0) {
86 score_ -= level.size();
93 CHECK_LE(score_, max_score_);
96 void VisibilityPyramid::CellForPoint(
const double x,
const double y,
size_t* cx,
100 const int max_dim = 1 << pyramid_.size();
101 *cx = Clip<size_t>(
static_cast<size_t>(max_dim *
x / width_), 0,
102 static_cast<size_t>(max_dim - 1));
103 *cy = Clip<size_t>(
static_cast<size_t>(max_dim *
y / height_), 0,
104 static_cast<size_t>(max_dim - 1));
void ResetPoint(const double x, const double y)
void SetPoint(const double x, const double y)