Skip to content

Commit 58d29de

Browse files
committed
Avoid type double for loop variable
https://wiki.sei.cmu.edu/confluence/display/c/FLP30-C.+Do+not+use+floating-point+variables+as+loop+counters This also removes the nested loops, because in any case only one of these loops was run more than once.
1 parent b0febb4 commit 58d29de

File tree

2 files changed

+28
-13
lines changed

2 files changed

+28
-13
lines changed

src/geom-pole-of-inaccessibility.cpp

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -166,23 +166,38 @@ point_t pole_of_inaccessibility(const polygon_t &polygon, double precision,
166166
envelope.max_x(),
167167
envelope.max_y() * stretch};
168168

169-
double const cell_size =
170-
std::min(stretched_envelope.width(), stretched_envelope.height());
171-
if (cell_size == 0) {
169+
if (stretched_envelope.width() == 0 || stretched_envelope.height() == 0) {
172170
return envelope.min();
173171
}
174172

175173
std::priority_queue<Cell, std::vector<Cell>> cell_queue;
176174

177175
// cover polygon with initial cells
178-
{
176+
if (stretched_envelope.width() == stretched_envelope.height()) {
177+
double const cell_size = stretched_envelope.width();
179178
double const h = cell_size / 2.0;
180-
for (double x = stretched_envelope.min_x();
181-
x < stretched_envelope.max_x(); x += cell_size) {
182-
for (double y = stretched_envelope.min_y();
183-
y < stretched_envelope.max_y(); y += cell_size) {
184-
cell_queue.emplace(point_t{x + h, y + h}, h, polygon, stretch);
185-
}
179+
cell_queue.emplace(stretched_envelope.center(), h, polygon, stretch);
180+
} else if (stretched_envelope.width() < stretched_envelope.height()) {
181+
double const cell_size = stretched_envelope.width();
182+
double const h = cell_size / 2.0;
183+
int const count = static_cast<int>(std::ceil(
184+
stretched_envelope.height() / stretched_envelope.width()));
185+
for (int n = 0; n < count; ++n) {
186+
cell_queue.emplace(
187+
point_t{stretched_envelope.center().x(),
188+
stretched_envelope.min().y() + n * cell_size + h},
189+
h, polygon, stretch);
190+
}
191+
} else {
192+
double const cell_size = stretched_envelope.height();
193+
double const h = cell_size / 2.0;
194+
int const count = static_cast<int>(std::ceil(
195+
stretched_envelope.width() / stretched_envelope.height()));
196+
for (int n = 0; n < count; ++n) {
197+
cell_queue.emplace(
198+
point_t{stretched_envelope.min().x() + n * cell_size + h,
199+
stretched_envelope.center().y()},
200+
h, polygon, stretch);
186201
}
187202
}
188203

@@ -219,8 +234,8 @@ point_t pole_of_inaccessibility(const polygon_t &polygon, double precision,
219234

220235
for (auto dy : {-h, h}) {
221236
for (auto dx : {-h, h}) {
222-
Cell c{point_t{center.x() + dx, center.y() + dy}, h, polygon,
223-
stretch};
237+
Cell const c{point_t{center.x() + dx, center.y() + dy}, h,
238+
polygon, stretch};
224239
if (c.max > best_cell.dist) {
225240
cell_queue.push(c);
226241
}

tests/test-geom-pole-of-inaccessibility.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ TEST_CASE("geom::polygon_t", "[NoDB]")
5454
polygon.inners().emplace_back(
5555
geom::ring_t{{1, 1}, {2, 1}, {2, 2}, {1, 2}, {1, 1}});
5656

57-
geom::geometry_t geom{std::move(polygon)};
57+
geom::geometry_t const geom{std::move(polygon)};
5858
auto const middle =
5959
pole_of_inaccessibility(geom, 0.00001).get<geom::point_t>();
6060
REQUIRE(middle.x() == Approx(3.0).epsilon(0.001));

0 commit comments

Comments
 (0)