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;}
   }
}

Я просто подавил избыточность вычисления двух одинаковых расстояний;


person Liam    schedule 21.10.2013    source источник


Ответы (2)


Многоугольник состоит из колец. Вы хотите иметь внешнее кольцо (внешнее кольцо). Это доступно с помощью 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 - это имя параметра-шаблона (см. Doc). Функция-член external () для внешнего кольца. В приведенном выше коде используется бесплатная функция external_ring для использования концепции многоугольника, которая должна работать для любого типа многоугольника в Boost.Geometry.

person Barend Gehrels    schedule 21.10.2013
comment
Спасибо за пример, я только что попробовал, и он определенно работает, хотя я не понимаю эту концепцию кольца, но, более того, я все еще ищу что-то более оптимизированное: для многоугольника N точки ваши петли давая мне N ^ 2 операций, когда мне нужно только N (N-1) / 2 для вычисления расстояния (если it1 = it2 не имеет значения и двойной счет. Могу ли я сделать это, используя функцию external () для доступа к точкам? - person Liam; 22.10.2013

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

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

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

person Community    schedule 21.10.2013
comment
Я смотрю только на конечный набор точек, составляющих многоугольник. Не то бесконечное количество очков, которые внутри него. - person Liam; 21.10.2013
comment
Вы имеете в виду, что проверяете только углы? Потому что вам действительно не нужно проверять какой-либо другой пункт. - person ; 21.10.2013
comment
Тогда ваш двойной цикл будет чем-то вроде for j (for i ›j (...)). Выполнение вычисления расстояния arround (n ^ 2 + n) / 2 для n + 1 углов. - person ; 21.10.2013