@@ -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 }
0 commit comments