Пример #1
0
void Polygon::splitPolygonAtPoint (const std::list<GeoLib::Polygon*>::iterator& polygon_it)
{
    std::size_t n((*polygon_it)->getNumberOfPoints() - 1), idx0(0), idx1(0);
    std::vector<std::size_t> id_vec(n);
    std::vector<std::size_t> perm(n);
    for (std::size_t k(0); k < n; k++)
    {
        id_vec[k] = (*polygon_it)->getPointID (k);
        perm[k] = k;
    }

    BaseLib::quicksort (id_vec, 0, n, perm);

    for (std::size_t k(0); k < n - 1; k++)
        if (id_vec[k] == id_vec[k + 1])
        {
            idx0 = perm[k];
            idx1 = perm[k + 1];

            if (idx0 > idx1)
                std::swap (idx0, idx1);

            // create two closed polylines
            GeoLib::Polyline polyline0{*(*polygon_it)};
            for (std::size_t j(0); j <= idx0; j++)
                polyline0.addPoint((*polygon_it)->getPointID(j));
            for (std::size_t j(idx1 + 1);
                 j < (*polygon_it)->getNumberOfPoints(); j++)
                polyline0.addPoint((*polygon_it)->getPointID(j));

            GeoLib::Polyline polyline1{*(*polygon_it)};
            for (std::size_t j(idx0); j <= idx1; j++)
                polyline1.addPoint((*polygon_it)->getPointID(j));

            // remove the polygon except the first
            if (*polygon_it != this)
                delete *polygon_it;
            // erase polygon_it and add two new polygons
            auto polygon1_it = _simple_polygon_list.insert(
                _simple_polygon_list.erase(polygon_it), new Polygon(polyline1));
            auto polygon0_it = _simple_polygon_list.insert(
                polygon1_it, new Polygon(polyline0));

            splitPolygonAtPoint(polygon0_it);
            splitPolygonAtPoint(polygon1_it);

            return;
        }
}
Пример #2
0
void Polygon::computeListOfSimplePolygons ()
{
    splitPolygonAtPoint (_simple_polygon_list.begin());
    splitPolygonAtIntersection (_simple_polygon_list.begin());

    for (auto& polygon : _simple_polygon_list)
        polygon->initialise();
}
Пример #3
0
void Polygon::computeListOfSimplePolygons ()
{
    splitPolygonAtPoint (_simple_polygon_list.begin());
    splitPolygonAtIntersection (_simple_polygon_list.begin());

    for (std::list<Polygon*>::iterator it (_simple_polygon_list.begin());
            it != _simple_polygon_list.end(); ++it)
        (*it)->initialise ();
}