Skip to Content.
Sympa Menu

cgal-discuss - Re: [cgal-discuss] CGAL::difference for 2d polygon return a incorrect result polygon

Subject: CGAL users discussion list

List archive

Re: [cgal-discuss] CGAL::difference for 2d polygon return a incorrect result polygon


Chronological Thread 
  • From: 落 域 <>
  • To: "" <>
  • Subject: Re: [cgal-discuss] CGAL::difference for 2d polygon return a incorrect result polygon
  • Date: Sun, 26 Apr 2020 14:59:33 +0000
  • Accept-language: zh-CN, en-US
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=+JpLa8R0dDLCGORmx/i9Jy+0dfevGov/ZXSrMAOk05U=; b=WHTtLzVcpZQbgmPXXo6iYEIq3RHTt4vJJKVDrO24y3My4DO/hyx0YnYpbX1X7HNx/3IVRL8xA0sjFueg0ql/Ef7+VzTaUB7VVcBrqZyy7+f/EnOFebRKZnNpxLwVndOHjm5cDpEw/H895ZqWoPIzEAlyynsou88jHFMTqrWkPvLna6lFszhvsLZ0suGGF7b5UQY4lKJQq8j9Wmc0/LUdKGVX6xYTGtkGXxkZGehYO1lttx+05mfjRFGN24AVlee/3CHKc64BhWnpgYFtbqAVE0hzIBbt4cmFUMevHe/G+IYl1ZdZ8TOc9LXBPOmhkqxtI1i4eo9jVbT9RgSjcu2wVQ==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=bQjFNAsj4xRdqG5fOrwuhVo1/ibR6Xb6+M7P/5eRtwjbggPXjxmmnk+Q9U53tTDGD01BLLwkyYHd0T0+uOTwQtad0BgwEnkJzcGhXM06YtKKGGxBIuVo1bsjwjAQ9psWjC8rw+P2StII25/48kavoqsHNZwNHMvCv/ChsH9VNhprMl7SdiKlu2B/IDeCkti9jk17sT2Q0yjwLSoQ+MCBkumR+CyO8kQL/YvRrr0FkNjl8RWfry/3XPEyx98A8ae0yoUfSywyPUVB8W/Aw5Dp+jQNzesC7m5pOyuChAMTvBpz1gDU+HX9OW/B+CYZXg6VFdx/Yd3vg8hQlyhcT32+GA==
  • Authentication-results: mail2-smtp-roc.national.inria.fr; spf=None ; spf=Pass ; spf=Pass
  • Ironport-phdr: 9a23:0Raw+B2w8oYr2TXQsmDT+DRfVm0co7zxezQtwd8ZsesWLvjxwZ3uMQTl6Ol3ixeRBMOHsq8C1rWd4/uocFdDyK7JiGoFfp1IWk1NouQttCtkPvS4D1bmJuXhdS0wEZcKflZk+3amLRodQ56mNBXdrXKo8DEdBAj0OxZrKeTpAI7SiNm82/yv95HJbAhEmTqwbalyIRi0ognctccbipZ+J6gszRfEvmFGcPlMy2NyIlKTkRf85sOu85Nm7i9dpfEv+dNeXKvjZ6g3QqBWAzogM2Au+c3krgLDQheV5nsdSWoZjBxFCBXY4R7gX5fxtiz6tvdh2CSfIMb7Q6w4VSik4qx2ThLjlSUJOCMj8GzPisJ+kr9VoA6vqRJ8zY7bYp2aO/Vlc6zHYd8WWXBMUtpNWyFDBI63cosBD/AGPeZdt4T/oUYFrx2jDgSrBOPvziJEimH10KEk3OksEQDL0QwgEt8Oq3nUq8j1NLsWUeCyy6nIzi/PYO9R2Tf48YXFdA0qr/+LXbJ1a8XRyE8vGhvDjlqKsoPqJDeV2foXv2eH6OpgUPqji28hqwFrozig3N0giofTho8T11vK9j15zZ46KNGkUkJ2ZcCoHIFOuyyaOYZ6WN0uTmBwtCok0LIKpYO3cS0XxJg62hLSbuKIfoeU7h7/UeucIyl3i2l5d7+6ghu/8VSsx+vhXceuyllKtDBKktzUu3ANyRPT7s+HR+Nh80m7xzuDyx3f5vhZL041i6bXMpkhzaUumZYJtkTDAzP2l17xjK+LcEUr5/Kk6/z9YrXhup+TKZN7ih3/MqQpnMyzG+M4MhUSX2if/uS8077j8VflT7VNi/06iqjZsJbEKsQHvqO0DBNZ3pwn5hqhFTuqztQVkHcdIF5beR+Ll43pNEvPIPD8A/e/mVOskDJzyvDGOr3tH4vBI3vdnLrufbtw6k5RxQozwN1E4JJUF60BIPb0Wk/2t9zUFAM2Mwuxw+r/EtVyypseWX6TAq+eKK7drVCI6fgrI+WVeYAVuS39JOQ45/71ln80gkQdfKms3ZsPcn+0BPVmI0ODYXrtmNgNC2kKvhBtBNHsk0CIBD5Pe26pDeV7/SA+EIvgDIHZR4nrjqbGxza+BpQRZ2ZIDReHHn7sMomFQPwRcznBH8l6jzYkSb2lHo89yQm15ki90KtiNuOS+ysCtJul2sIy/PzWjRh19Dp6CIOW3GiJCm11hWgVXCRl4aZkvEZBx0efhKhkn+RDR5sU/OJMSg58NJjGzuU8Bcq1QRPEZt7OSVCoRZKtDjg1C94w2NQTeF0uJ9L3xBvM1i7vD74OnKGQH7Q19Ljd1j7/PYw1n33J3a1kg1g9SdZULkWngLR+/k7dHdiavV+ekvNSPVxUiC7JrT3TlzbT4hwFDSZ3TLnBWnccIEDRqIKqtQv5U7ayBOF/YUN6wsmYJ/4SM4C7vRB9XP7mfe/mTSexlmO3WUna74unNNOvQEpHmSLXBQ4DjhwZ+muAOU4mHCC9rmnCDTtoU1Xyf0fr9uo4o3S+HBZtk1O6KnZ53r/wwSY7wOSGQqpIjLUZpCMmrDYyF1G4jYqPWoiw4jF5daAZWusTpVJO1GbXrQt4Z8fyKL1+glkZcEJ8uEa8jhg=

sorry, i sent another email for my question contain my simple test code and test data, please ignore this one

发自我的iPhone

在 2020年4月26日,下午7:00,Efi Fogel <> 写道:


Please provide a simple test case, nicely indented, using only point type from EPEC (exact predicates exact constructions),  that can be used to reproduce the problem.

   ____  _        ____             _
  /_____/_) o    /__________  __  //
 (____ (   (    (    (_/ (_/-(-'_(/
                         _/




Hi,
    I'm newer to use cgal, I want to split the given polygon by another
polygon. Then I choose the CGAL::difference function. But in some cases,
it's function return incorrect result polygon for me.

Here is my code:

// TArray is a template for an array, FVector2D is a struct for a 2d point,
use float number type.

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
#include <CGAL/Boolean_set_operations_2.h>
#include <CGAL/Polygon_2.h>
#include <CGAL/Polygon_with_holes_2.h>
#include <CGAL/Polygon_set_2.h>

#include <list>

typedef CGAL::Exact_predicates_exact_constructions_kernel exactKernel;
typedef exactKernel::Point_2                              exactPoint_2;
typedef CGAL::Polygon_2<exactKernel>                      exactPolygon_2;
typedef CGAL::Polygon_with_holes_2<exactKernel>         
exactPolygon_with_holes_2;
typedef CGAL::Polygon_set_2<exactKernel>                 
exactPolygon_set_2;
typedef exactKernel::Segment_2                            exactSegment_2;
typedef exactKernel::Point_2                                                      exactPoint_2;
typedef exactKernel::Vector_2                                                     exactVector_2;

void UPaveMethodFunctionLibrary::FiltrationPolygon(const
TArray<FPolygonData>& InHolesPolygon, TArray<FVector2D>&
OutFiltrationPolygon)
{
        if (OutFiltrationPolygon.Num() < 3 || InHolesPolygon.Num() == 0){
                return;
        }

        exactPolygon_2 targetPolygon;
        std::list<exactPolygon_2> holesPolygon;

        for (int32 filtrationPolygonIndex = 0; filtrationPolygonIndex <
OutFiltrationPolygon.Num(); ++filtrationPolygonIndex)
        {

targetPolygon.push_back(exactPoint_2(OutFiltrationPolygon[filtrationPolygonIndex].X,
OutFiltrationPolygon[filtrationPolygonIndex].Y));
        }

        if (targetPolygon.is_clockwise_oriented()) {
                targetPolygon.reverse_orientation();
        }

        for (int32 holePolygonIndex = 0; holePolygonIndex < InHolesPolygon.Num();
++holePolygonIndex)
        {
                exactPolygon_2 currentHolePolygon;

                for (int32 holePointIndex = 0; holePointIndex <
InHolesPolygon[holePolygonIndex].Polygon.Num(); ++holePointIndex)
                {

currentHolePolygon.push_back(exactPoint_2(InHolesPolygon[holePolygonIndex].Polygon[holePointIndex].X,
InHolesPolygon[holePolygonIndex].Polygon[holePointIndex].Y));
                }

                if (currentHolePolygon.is_clockwise_oriented()) {
                        currentHolePolygon.reverse_orientation();
                }

                holesPolygon.push_back(currentHolePolygon);
        }

        bool IsExistInList = false;

        std::list<exactPolygon_2> tempholesPolygon;

        for (std::list<exactPolygon_2>::const_iterator holePolygonListIt =
holesPolygon.cbegin(); holePolygonListIt != holesPolygon.cend();
++holePolygonListIt)
        {
                for (exactPolygon_2::Edge_const_iterator holePolygonIt =
holePolygonListIt->edges_begin(); holePolygonIt !=
holePolygonListIt->edges_end(); ++holePolygonIt)
                {
                        for (exactPolygon_2::Edge_const_iterator targetPolygonIt =
targetPolygon.edges_begin(); targetPolygonIt != targetPolygon.edges_end();
++targetPolygonIt)
                        {
                                if (targetPolygonIt->collinear_has_on(holePolygonIt->start()) &&
targetPolygonIt->collinear_has_on(holePolygonIt->end()))
                                {
                                        IsExistInList = true;
                                        tempholesPolygon.push_back(*holePolygonListIt);
                                        break;
                                }
                        }
                        if (IsExistInList){
                                break;
                        }
                }
                IsExistInList = false;
        }

        if (tempholesPolygon.size() == 0){
                return;
        }

        for (exactPolygon_2 currentHolePolygon : tempholesPolygon)
        {
                std::list<exactPolygon_with_holes_2> differencePolygons;

                CGAL::difference(targetPolygon, currentHolePolygon,
std::back_inserter(differencePolygons));

                if (differencePolygons.size() != 1) {
                        return;
                }

                targetPolygon = differencePolygons.front().outer_boundary();
                if (targetPolygon.is_clockwise_oriented()) {
                        targetPolygon.reverse_orientation();
                }
        }

        if (targetPolygon.size() < 3 || !targetPolygon.is_simple()){
                return;
        }

        OutFiltrationPolygon.Empty();

        for (exactPolygon_2::Vertex_const_iterator it =
targetPolygon.vertices_begin(); it != targetPolygon.vertices_end(); it++)
        {
                double pointX = CGAL::to_double(it->x());
                double pointY = CGAL::to_double(it->y());
                OutFiltrationPolygon.AddUnique(FVector2D(pointX, pointY));
        }
}



--
Sent from: http://cgal-discuss.949826.n4.nabble.com/

--
You are currently subscribed to cgal-discuss.
To unsubscribe or access the archives, go to
https://sympa.inria.fr/sympa/info/cgal-discuss





Archive powered by MHonArc 2.6.18.

Top of Page