Boost :: Geometry, как получить координаты точки внутри многоугольника?

Я кодирую функцию, дающую диаметр ранее определенного многоугольника, используя библиотеку boost :: geometry.

Этот диаметр определяется как максимальное расстояние между двумя его точками. Таким образом, я кодирую двойной цикл, вычисляющий каждое расстояние каждой пары точек, но я не знаю, как получить доступ к координатам точек внутри многоугольника или даже точечным объектам, а затем использую функцию расстояния между двумя приведенными точками. по библиотеке (кстати, какой из них должен быть быстрее?).

Посмотрев на Повышение документов на полигоне Я попытался my_polygon.PointList без успеха …

В итоге я решил использовать модифицированную версию предложения Баренда:

for(auto it1 = boost::begin(boost::geometry::exterior_ring(poly));
it1 != boost::end(boost::geometry::exterior_ring(poly));
++it1)
{
for(auto it2 = it1+1;
it2 != boost::end(boost::geometry::exterior_ring(poly));
++it2)
{
double distance = boost::geometry::distance(*it1, *it2);
if(my_diameter < distance){my_diameter = distance;}
}
}

Я просто подавил избыточность вычисления в два раза одного и того же расстояния;

0

Решение

Полигон состоит из колец. Вы хотите иметь внешнее кольцо (внешнее кольцо). Это доступно с помощью external_ring (aPolygon);

Таким образом, вы можете использовать что-то вроде этого кода для перебора точек многоугольника (для простоты я использую auto, в противном случае объявляю итератор):

for(auto it1 = boost::begin(boost::geometry::exterior_ring(poly));
it1 != boost::end(boost::geometry::exterior_ring(poly));
++it1)
{
for(auto it2 = boost::begin(boost::geometry::exterior_ring(poly));
it2 != boost::end(boost::geometry::exterior_ring(poly));
++it2)
{
// You might skip cases where it1==it2, distance is zero anyway
double distance = boost::geometry::distance(*it1, *it2);
// Compare with a max distance, if larger, assign, etc.
}
}

(петли часто также зацикливаются на внутренних кольцах, но для диаметра, который не является необходимым, если многоугольник четко определен).

Кстати, по поводу вашего вопроса: PointList — это имя шаблона-параметра (см. Документ). Функция-член external () для внешнего кольца. Приведенный выше код использует бесплатную функцию «external_ring» для использования Polygon Concept, которая должна работать для любого типа многоугольника в Boost.Geometry.

3

Другие решения

Вы можете проверить только расстояние между углами, так как максимальное расстояние будет между двумя «углами».

думать об этом только с одной точкой «А» и одним сегментом. Вы увидите, что независимо от того, как вы разместите сегмент, точка сегмента с максимальным расстоянием до A будет одним из двух концов.

кстати, каждый балл? при какой зернистости? их бесконечно много!

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector