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
- [cgal-discuss] CGAL::difference for 2d polygon return a incorrect result polygon, Luoyu, 04/26/2020
- Re: [cgal-discuss] CGAL::difference for 2d polygon return a incorrect result polygon, Efi Fogel, 04/26/2020
- Re: [cgal-discuss] CGAL::difference for 2d polygon return a incorrect result polygon, 落 域, 04/26/2020
- Re: [cgal-discuss] CGAL::difference for 2d polygon return a incorrect result polygon, Efi Fogel, 04/26/2020
Archive powered by MHonArc 2.6.18.