mirror of https://github.com/CGAL/cgal
Merge remote-tracking branch 'cgal/master' into BGL-Openmesh_selection-GF
This commit is contained in:
commit
1066666ad8
|
|
@ -426,7 +426,7 @@ void test_algebraic_structure_intern(
|
|||
//commutative
|
||||
assert(a+b+c==c+b+a);
|
||||
assert(a*b*c==c*b*a);
|
||||
//distributiv
|
||||
//distributive
|
||||
assert((a-b)*c==a*c-b*c);
|
||||
assert((a+b)*c==a*c+b*c);
|
||||
//binom
|
||||
|
|
|
|||
|
|
@ -111,13 +111,10 @@ void CurveInputMethod::beginInput_()
|
|||
|
||||
static inline void clearPainterPath(QPainterPath& ppath)
|
||||
{
|
||||
#if (QT_VERSION >= QT_VERSION_CHECK(5, 13, 0))
|
||||
ppath.clear();
|
||||
#else
|
||||
ppath = {};
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
void CurveInputMethod::reset()
|
||||
{
|
||||
this->resetInput();
|
||||
|
|
|
|||
|
|
@ -67,11 +67,7 @@ void GridGraphicsItem::setSpacing(int spacing_)
|
|||
static inline qreal
|
||||
horizontalAdvance(const QFontMetrics& fm, const QString& text)
|
||||
{
|
||||
#if (QT_VERSION >= QT_VERSION_CHECK(5, 11, 0))
|
||||
return fm.horizontalAdvance(text);
|
||||
#else
|
||||
return fm.boundingRect(text).width();
|
||||
#endif
|
||||
}
|
||||
|
||||
void GridGraphicsItem::paint(
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# Input is based on the curves and points indexes from intersect.pt
|
||||
# intersect.xcv. The first two numbers are the numbers of the input curves
|
||||
# to be intersected. After that there is the number of intesections and
|
||||
# to be intersected. After that there is the number of intersections and
|
||||
# 2-3 numbers representing each intersection. Meaning, the input is of the form:
|
||||
# intersect <id of 1st x-curve> <id of 2nd x-curve> \
|
||||
# <expected number of intersections> [<type of intersection> \
|
||||
|
|
|
|||
|
|
@ -76,62 +76,13 @@ class External_structure_builder : public Modifier_base<typename Nef_::SNC_and_P
|
|||
|
||||
SNC_structure* sncp(sncpl.sncp);
|
||||
SNC_point_locator* pl(sncpl.pl);
|
||||
|
||||
|
||||
|
||||
Unique_hash_map<SHalfedge_handle, SFace_handle> sedge2sface;
|
||||
/*
|
||||
SFace_iterator sfi;
|
||||
CGAL_forall_sfaces(sfi, *sncp) {
|
||||
SFace_cycle_iterator sfc;
|
||||
for(sfc = sfi->sface_cycles_begin(); sfc != sfi->sface_cycles_end(); ++sfc) {
|
||||
if(sfc.is_shalfedge()){
|
||||
SHalfedge_around_sface_circulator eaf(sfc), end(eaf);
|
||||
CGAL_For_all(eaf,end) {
|
||||
SHalfedge_handle se(eaf);
|
||||
sedge2sface[eaf] = sfi;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// CGAL::SNC_io_parser<SNC_structure> O0(std::cerr, *sncp, false);
|
||||
// O0.print();
|
||||
|
||||
SHalfedge_iterator sei;
|
||||
CGAL_forall_shalfedges(sei, *sncp) {
|
||||
SHalfedge_handle se(sei);
|
||||
if(sedge2sface[se] == SFace_handle()) {
|
||||
SM_decorator SD(&*sei->source()->source());
|
||||
SFace_handle sf_new = SD.new_sface();
|
||||
sf_new->mark() = sei->incident_sface()->mark();
|
||||
|
||||
CGAL_NEF_TRACEN("new entry sedge " << sei->source()->point()
|
||||
<< "->" << sei->twin()->source()->point()
|
||||
<< " at " << sei->source()->source()->point());
|
||||
|
||||
SD.link_as_face_cycle(sei, sf_new);
|
||||
|
||||
SHalfedge_around_sface_circulator eaf(se), end(eaf);
|
||||
CGAL_For_all(eaf,end) {
|
||||
SHalfedge_handle se(eaf);
|
||||
sedge2sface[eaf] = sf_new;
|
||||
}
|
||||
|
||||
// TODO: relink inner sface cycles
|
||||
}
|
||||
}
|
||||
*/
|
||||
SNC_point_locator* old_pl = pl;
|
||||
pl = pl->clone();
|
||||
sncpl.pl = pl;
|
||||
delete old_pl;
|
||||
SNC_external_structure C(*sncp,pl);
|
||||
C.clear_external_structure();
|
||||
C.build_external_structure();
|
||||
|
||||
// CGAL::SNC_io_parser<SNC_structure> Ox(std::cerr, *sncp, false);
|
||||
// Ox.print();
|
||||
delete old_pl;
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,53 @@
|
|||
#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
|
||||
#include <CGAL/Polyhedron_3.h>
|
||||
#include <CGAL/Nef_polyhedron_3.h>
|
||||
#include <CGAL/IO/Nef_polyhedron_iostream_3.h>
|
||||
#include <CGAL/Nef_3/SNC_indexed_items.h>
|
||||
#include <CGAL/convex_decomposition_3.h>
|
||||
#include <list>
|
||||
|
||||
typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel;
|
||||
typedef CGAL::Polyhedron_3<Kernel> Polyhedron_3;
|
||||
typedef CGAL::Nef_polyhedron_3<Kernel, CGAL::SNC_indexed_items> Nef_polyhedron_3;
|
||||
typedef Nef_polyhedron_3::Volume_const_iterator Volume_const_iterator;
|
||||
|
||||
std::size_t run(std::string path)
|
||||
{
|
||||
Polyhedron_3 input;
|
||||
std::ifstream(path) >> input;
|
||||
|
||||
Nef_polyhedron_3 N(input);
|
||||
|
||||
CGAL::convex_decomposition_3(N);
|
||||
std::list<Polyhedron_3> convex_parts;
|
||||
|
||||
Volume_const_iterator ci = ++N.volumes_begin();
|
||||
for( ; ci != N.volumes_end(); ++ci) {
|
||||
if(ci->mark()) {
|
||||
Polyhedron_3 P;
|
||||
N.convert_inner_shell_to_polyhedron(ci->shells_begin(), P);
|
||||
convex_parts.push_back(P);
|
||||
}
|
||||
}
|
||||
|
||||
// int i=0;
|
||||
for (const Polyhedron_3& P : convex_parts)
|
||||
{
|
||||
// std::ofstream("out_"+std::to_string(i++)+".off") << std::setprecision(17) << P;
|
||||
assert(P.size_of_vertices()!=0);
|
||||
}
|
||||
|
||||
return convex_parts.size();
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
std::size_t val = run("data/in1.off");
|
||||
assert(val==9);
|
||||
val = run("data/in2.off");
|
||||
assert(val==10);
|
||||
val = run("data/in3.off");
|
||||
assert(val==13);
|
||||
val = run("data/in4.off");
|
||||
assert(val==17);
|
||||
}
|
||||
|
|
@ -0,0 +1,117 @@
|
|||
OFF 40 76 0
|
||||
5 -5 4
|
||||
5 -5 2
|
||||
5 5 2
|
||||
5 5 4
|
||||
5 -5 -2
|
||||
5 -5 -4
|
||||
5 5 -4
|
||||
5 5 -2
|
||||
-5 5 4
|
||||
-5 -5 4
|
||||
-4 -4 4
|
||||
-4 4 4
|
||||
4 4 4
|
||||
4 -4 4
|
||||
-5 -5 -4
|
||||
-5 5 -4
|
||||
-4 4 -4
|
||||
-4 -4 -4
|
||||
4 -4 -4
|
||||
4 4 -4
|
||||
-5 5 2
|
||||
-5 -5 2
|
||||
-5 -5 -2
|
||||
-5 5 -2
|
||||
4 4 2
|
||||
4 -4 2
|
||||
4 -4 -2
|
||||
4 4 -2
|
||||
-4 4 2
|
||||
-4 -4 2
|
||||
-4 4 -2
|
||||
-4 -4 -2
|
||||
6 -6 2
|
||||
6 -6 -2
|
||||
6 6 -2
|
||||
6 6 2
|
||||
-6 6 2
|
||||
-6 -6 2
|
||||
-6 -6 -2
|
||||
-6 6 -2
|
||||
3 0 2 3
|
||||
3 2 0 1
|
||||
3 4 6 7
|
||||
3 6 4 5
|
||||
3 3 12 0
|
||||
3 3 11 12
|
||||
3 11 8 10
|
||||
3 8 11 3
|
||||
3 13 0 12
|
||||
3 10 0 13
|
||||
3 10 9 0
|
||||
3 9 10 8
|
||||
3 5 18 6
|
||||
3 5 17 18
|
||||
3 17 14 16
|
||||
3 14 17 5
|
||||
3 19 6 18
|
||||
3 16 6 19
|
||||
3 16 15 6
|
||||
3 15 16 14
|
||||
3 21 8 20
|
||||
3 8 21 9
|
||||
3 14 23 15
|
||||
3 23 14 22
|
||||
3 2 8 3
|
||||
3 8 2 20
|
||||
3 6 23 7
|
||||
3 23 6 15
|
||||
3 21 0 9
|
||||
3 0 21 1
|
||||
3 14 4 22
|
||||
3 4 14 5
|
||||
3 25 12 24
|
||||
3 12 25 13
|
||||
3 18 27 19
|
||||
3 27 18 26
|
||||
3 10 28 11
|
||||
3 28 10 29
|
||||
3 31 16 30
|
||||
3 16 31 17
|
||||
3 28 12 11
|
||||
3 12 28 24
|
||||
3 16 27 30
|
||||
3 27 16 19
|
||||
3 25 10 13
|
||||
3 10 25 29
|
||||
3 18 31 26
|
||||
3 31 18 17
|
||||
3 32 34 35
|
||||
3 34 32 33
|
||||
3 35 2 32
|
||||
3 35 20 2
|
||||
3 20 36 21
|
||||
3 36 20 35
|
||||
3 1 32 2
|
||||
3 21 32 1
|
||||
3 21 37 32
|
||||
3 37 21 36
|
||||
3 28 25 24
|
||||
3 25 28 29
|
||||
3 33 4 34
|
||||
3 33 22 4
|
||||
3 22 38 23
|
||||
3 38 22 33
|
||||
3 7 34 4
|
||||
3 23 34 7
|
||||
3 23 39 34
|
||||
3 39 23 38
|
||||
3 31 27 26
|
||||
3 27 31 30
|
||||
3 38 36 39
|
||||
3 36 38 37
|
||||
3 34 36 35
|
||||
3 36 34 39
|
||||
3 38 32 37
|
||||
3 32 38 33
|
||||
|
|
@ -0,0 +1,144 @@
|
|||
OFF
|
||||
48 92 0
|
||||
|
||||
2 2 2
|
||||
2 -2 2
|
||||
-2 2 2
|
||||
-2 -2 2
|
||||
-2 2 4
|
||||
2 2 4
|
||||
-2 -2 4
|
||||
2 -2 4
|
||||
5 -5 4
|
||||
-4 4 4
|
||||
5 5 4
|
||||
4 -4 4
|
||||
-5 -5 4
|
||||
-4 -4 -4
|
||||
5 -5 -4
|
||||
4 4 -4
|
||||
-5 5 -4
|
||||
-5 5 4
|
||||
5 5 -4
|
||||
-5 -5 -4
|
||||
4 4 4
|
||||
4 -4 -2
|
||||
-4 -4 4
|
||||
-4 4 -2
|
||||
-4 4 -4
|
||||
4 4 -2
|
||||
4 -4 -4
|
||||
6 -6 2
|
||||
5 5 2
|
||||
-5 5 2
|
||||
6 6 2
|
||||
5 -5 2
|
||||
-5 -5 2
|
||||
-6 -6 2
|
||||
5 -5 -2
|
||||
-5 -5 -2
|
||||
6 -6 -2
|
||||
5 5 -2
|
||||
-5 5 -2
|
||||
-6 6 -2
|
||||
-4 -4 -2
|
||||
-6 6 2
|
||||
6 6 -2
|
||||
-6 -6 -2
|
||||
-4 -4 2
|
||||
-4 4 2
|
||||
4 4 2
|
||||
4 -4 2
|
||||
3 2 4 5
|
||||
3 7 6 3
|
||||
3 5 7 1
|
||||
3 6 7 5
|
||||
3 3 6 4
|
||||
3 5 0 2
|
||||
3 3 1 7
|
||||
3 1 0 5
|
||||
3 5 4 6
|
||||
3 4 2 3
|
||||
3 8 28 10
|
||||
3 28 8 31
|
||||
3 34 18 37
|
||||
3 18 34 14
|
||||
3 10 20 8
|
||||
3 10 9 20
|
||||
3 9 17 22
|
||||
3 17 9 10
|
||||
3 11 8 20
|
||||
3 22 8 11
|
||||
3 22 12 8
|
||||
3 12 22 17
|
||||
3 14 26 18
|
||||
3 14 13 26
|
||||
3 13 19 24
|
||||
3 19 13 14
|
||||
3 15 18 26
|
||||
3 24 18 15
|
||||
3 24 16 18
|
||||
3 16 24 19
|
||||
3 32 17 29
|
||||
3 17 32 12
|
||||
3 19 38 16
|
||||
3 38 19 35
|
||||
3 28 17 10
|
||||
3 17 28 29
|
||||
3 18 38 37
|
||||
3 38 18 16
|
||||
3 32 8 12
|
||||
3 8 32 31
|
||||
3 19 34 35
|
||||
3 34 19 14
|
||||
3 47 20 46
|
||||
3 20 47 11
|
||||
3 26 25 15
|
||||
3 25 26 21
|
||||
3 22 45 9
|
||||
3 45 22 44
|
||||
3 40 24 23
|
||||
3 24 40 13
|
||||
3 45 20 9
|
||||
3 20 45 46
|
||||
3 24 25 23
|
||||
3 25 24 15
|
||||
3 47 22 11
|
||||
3 22 47 44
|
||||
3 26 40 21
|
||||
3 40 26 13
|
||||
3 27 42 30
|
||||
3 42 27 36
|
||||
3 30 28 27
|
||||
3 30 29 28
|
||||
3 29 41 32
|
||||
3 41 29 30
|
||||
3 31 27 28
|
||||
3 32 27 31
|
||||
3 32 33 27
|
||||
3 33 32 41
|
||||
3 2 0 45
|
||||
3 1 44 47
|
||||
3 36 34 42
|
||||
3 36 35 34
|
||||
3 35 43 38
|
||||
3 43 35 36
|
||||
3 37 42 34
|
||||
3 38 42 37
|
||||
3 38 39 42
|
||||
3 39 38 43
|
||||
3 40 25 21
|
||||
3 25 40 23
|
||||
3 43 41 39
|
||||
3 41 43 33
|
||||
3 42 41 30
|
||||
3 41 42 39
|
||||
3 43 27 33
|
||||
3 27 43 36
|
||||
3 44 1 3
|
||||
3 44 3 45
|
||||
3 45 3 2
|
||||
3 46 45 0
|
||||
3 46 0 47
|
||||
3 47 0 1
|
||||
|
||||
|
|
@ -0,0 +1,180 @@
|
|||
OFF
|
||||
60 116 0
|
||||
|
||||
1 1 4
|
||||
1 0.33333333333333337 4
|
||||
1 -1 4
|
||||
0.33333333333333337 -1 4
|
||||
-1 -1 4
|
||||
-1 0.33333333333333337 4
|
||||
-1 1 4
|
||||
0.33333333333333337 1 4
|
||||
-2 2 2
|
||||
5 -5 4
|
||||
-4 4 4
|
||||
5 5 4
|
||||
4 -4 4
|
||||
-5 -5 4
|
||||
-4 -4 -4
|
||||
5 -5 -4
|
||||
4 4 -4
|
||||
-5 5 -4
|
||||
-5 5 4
|
||||
5 5 -4
|
||||
-5 -5 -4
|
||||
4 4 4
|
||||
4 -4 -2
|
||||
-4 -4 4
|
||||
-4 4 -2
|
||||
-4 4 -4
|
||||
4 4 -2
|
||||
4 -4 -4
|
||||
6 -6 2
|
||||
5 5 2
|
||||
-5 5 2
|
||||
6 6 2
|
||||
5 -5 2
|
||||
-5 -5 2
|
||||
-6 -6 2
|
||||
5 -5 -2
|
||||
-5 -5 -2
|
||||
6 -6 -2
|
||||
5 5 -2
|
||||
-5 5 -2
|
||||
-6 6 -2
|
||||
-4 -4 -2
|
||||
-6 6 2
|
||||
6 6 -2
|
||||
-6 -6 -2
|
||||
-2 -2 2
|
||||
-4 -4 2
|
||||
-4 4 2
|
||||
4 4 2
|
||||
4 -4 2
|
||||
2 -2 2
|
||||
2 2 2
|
||||
-2 2 4
|
||||
2 2 4
|
||||
2 -2 4
|
||||
-2 -2 4
|
||||
1 1 2
|
||||
1 -1 2
|
||||
-1 -1 2
|
||||
-1 1 2
|
||||
3 8 52 53
|
||||
3 54 55 45
|
||||
3 53 54 50
|
||||
3 0 1 53
|
||||
3 45 55 52
|
||||
3 53 51 8
|
||||
3 45 50 54
|
||||
3 50 51 53
|
||||
3 4 5 55
|
||||
3 52 8 45
|
||||
3 9 29 11
|
||||
3 29 9 32
|
||||
3 35 19 38
|
||||
3 19 35 15
|
||||
3 11 21 9
|
||||
3 11 10 21
|
||||
3 10 18 23
|
||||
3 18 10 11
|
||||
3 12 9 21
|
||||
3 23 9 12
|
||||
3 23 13 9
|
||||
3 13 23 18
|
||||
3 15 27 19
|
||||
3 15 14 27
|
||||
3 14 20 25
|
||||
3 20 14 15
|
||||
3 16 19 27
|
||||
3 25 19 16
|
||||
3 25 17 19
|
||||
3 17 25 20
|
||||
3 33 18 30
|
||||
3 18 33 13
|
||||
3 20 39 17
|
||||
3 39 20 36
|
||||
3 29 18 11
|
||||
3 18 29 30
|
||||
3 19 39 38
|
||||
3 39 19 17
|
||||
3 33 9 13
|
||||
3 9 33 32
|
||||
3 20 35 36
|
||||
3 35 20 15
|
||||
3 49 21 48
|
||||
3 21 49 12
|
||||
3 27 26 16
|
||||
3 26 27 22
|
||||
3 23 47 10
|
||||
3 47 23 46
|
||||
3 41 25 24
|
||||
3 25 41 14
|
||||
3 47 21 10
|
||||
3 21 47 48
|
||||
3 25 26 24
|
||||
3 26 25 16
|
||||
3 49 23 12
|
||||
3 23 49 46
|
||||
3 27 41 22
|
||||
3 41 27 14
|
||||
3 28 43 31
|
||||
3 43 28 37
|
||||
3 31 29 28
|
||||
3 31 30 29
|
||||
3 30 42 33
|
||||
3 42 30 31
|
||||
3 32 28 29
|
||||
3 33 28 32
|
||||
3 33 34 28
|
||||
3 34 33 42
|
||||
3 8 51 47
|
||||
3 50 46 49
|
||||
3 37 35 43
|
||||
3 37 36 35
|
||||
3 36 44 39
|
||||
3 44 36 37
|
||||
3 38 43 35
|
||||
3 39 43 38
|
||||
3 39 40 43
|
||||
3 40 39 44
|
||||
3 41 26 22
|
||||
3 26 41 24
|
||||
3 44 42 40
|
||||
3 42 44 34
|
||||
3 43 42 31
|
||||
3 42 43 40
|
||||
3 44 28 34
|
||||
3 28 44 37
|
||||
3 46 50 45
|
||||
3 46 45 47
|
||||
3 47 45 8
|
||||
3 48 47 51
|
||||
3 48 51 49
|
||||
3 49 51 50
|
||||
3 52 55 5
|
||||
3 52 7 53
|
||||
3 52 5 6
|
||||
3 53 7 0
|
||||
3 52 6 7
|
||||
3 54 53 1
|
||||
3 54 2 3
|
||||
3 54 1 2
|
||||
3 55 54 3
|
||||
3 55 3 4
|
||||
3 58 57 56
|
||||
3 59 56 7
|
||||
3 2 57 3
|
||||
3 0 56 1
|
||||
3 5 59 6
|
||||
3 56 59 58
|
||||
3 57 1 56
|
||||
3 57 2 1
|
||||
3 58 5 4
|
||||
3 7 56 0
|
||||
3 58 3 57
|
||||
3 4 3 58
|
||||
3 59 5 58
|
||||
3 7 6 59
|
||||
|
||||
|
|
@ -0,0 +1,180 @@
|
|||
OFF
|
||||
60 116 0
|
||||
|
||||
1 1 4
|
||||
1 0.5 4
|
||||
1 -1 4
|
||||
0.5 -1 4
|
||||
-1 -1 4
|
||||
-1 0.5 4
|
||||
-1 1 4
|
||||
0.5 1 4
|
||||
-2 2 2
|
||||
5 -5 4
|
||||
-4 4 4
|
||||
5 5 4
|
||||
4 -4 4
|
||||
-5 -5 4
|
||||
-4 -4 -4
|
||||
5 -5 -4
|
||||
4 4 -4
|
||||
-5 5 -4
|
||||
-5 5 4
|
||||
5 5 -4
|
||||
-5 -5 -4
|
||||
4 4 4
|
||||
4 -4 -2
|
||||
-4 -4 4
|
||||
-4 4 -2
|
||||
-4 4 -4
|
||||
4 4 -2
|
||||
4 -4 -4
|
||||
6 -6 2
|
||||
5 5 2
|
||||
-5 5 2
|
||||
6 6 2
|
||||
5 -5 2
|
||||
-5 -5 2
|
||||
-6 -6 2
|
||||
5 -5 -2
|
||||
-5 -5 -2
|
||||
6 -6 -2
|
||||
5 5 -2
|
||||
-5 5 -2
|
||||
-6 6 -2
|
||||
-4 -4 -2
|
||||
-6 6 2
|
||||
6 6 -2
|
||||
-6 -6 -2
|
||||
-2 -2 2
|
||||
-4 -4 2
|
||||
-4 4 2
|
||||
4 4 2
|
||||
4 -4 2
|
||||
2 -2 2
|
||||
2 2 2
|
||||
-2 2 4
|
||||
2 2 4
|
||||
2 -2 4
|
||||
-2 -2 4
|
||||
1 1 1
|
||||
1 -1 1
|
||||
-1 -1 1
|
||||
-1 1 1
|
||||
3 8 52 53
|
||||
3 54 55 45
|
||||
3 53 54 50
|
||||
3 0 1 53
|
||||
3 45 55 52
|
||||
3 53 51 8
|
||||
3 45 50 54
|
||||
3 50 51 53
|
||||
3 4 5 55
|
||||
3 52 8 45
|
||||
3 9 29 11
|
||||
3 29 9 32
|
||||
3 35 19 38
|
||||
3 19 35 15
|
||||
3 11 21 9
|
||||
3 11 10 21
|
||||
3 10 18 23
|
||||
3 18 10 11
|
||||
3 12 9 21
|
||||
3 23 9 12
|
||||
3 23 13 9
|
||||
3 13 23 18
|
||||
3 15 27 19
|
||||
3 15 14 27
|
||||
3 14 20 25
|
||||
3 20 14 15
|
||||
3 16 19 27
|
||||
3 25 19 16
|
||||
3 25 17 19
|
||||
3 17 25 20
|
||||
3 33 18 30
|
||||
3 18 33 13
|
||||
3 20 39 17
|
||||
3 39 20 36
|
||||
3 29 18 11
|
||||
3 18 29 30
|
||||
3 19 39 38
|
||||
3 39 19 17
|
||||
3 33 9 13
|
||||
3 9 33 32
|
||||
3 20 35 36
|
||||
3 35 20 15
|
||||
3 49 21 48
|
||||
3 21 49 12
|
||||
3 27 26 16
|
||||
3 26 27 22
|
||||
3 23 47 10
|
||||
3 47 23 46
|
||||
3 41 25 24
|
||||
3 25 41 14
|
||||
3 47 21 10
|
||||
3 21 47 48
|
||||
3 25 26 24
|
||||
3 26 25 16
|
||||
3 49 23 12
|
||||
3 23 49 46
|
||||
3 27 41 22
|
||||
3 41 27 14
|
||||
3 28 43 31
|
||||
3 43 28 37
|
||||
3 31 29 28
|
||||
3 31 30 29
|
||||
3 30 42 33
|
||||
3 42 30 31
|
||||
3 32 28 29
|
||||
3 33 28 32
|
||||
3 33 34 28
|
||||
3 34 33 42
|
||||
3 8 51 47
|
||||
3 50 46 49
|
||||
3 37 35 43
|
||||
3 37 36 35
|
||||
3 36 44 39
|
||||
3 44 36 37
|
||||
3 38 43 35
|
||||
3 39 43 38
|
||||
3 39 40 43
|
||||
3 40 39 44
|
||||
3 41 26 22
|
||||
3 26 41 24
|
||||
3 44 42 40
|
||||
3 42 44 34
|
||||
3 43 42 31
|
||||
3 42 43 40
|
||||
3 44 28 34
|
||||
3 28 44 37
|
||||
3 46 50 45
|
||||
3 46 45 47
|
||||
3 47 45 8
|
||||
3 48 47 51
|
||||
3 48 51 49
|
||||
3 49 51 50
|
||||
3 52 55 5
|
||||
3 52 7 53
|
||||
3 52 5 6
|
||||
3 53 7 0
|
||||
3 52 6 7
|
||||
3 54 53 1
|
||||
3 54 2 3
|
||||
3 54 1 2
|
||||
3 55 54 3
|
||||
3 55 3 4
|
||||
3 58 57 56
|
||||
3 59 56 7
|
||||
3 2 57 3
|
||||
3 0 56 1
|
||||
3 5 59 6
|
||||
3 56 59 58
|
||||
3 57 1 56
|
||||
3 57 2 1
|
||||
3 58 5 4
|
||||
3 7 56 0
|
||||
3 58 3 57
|
||||
3 4 3 58
|
||||
3 59 5 58
|
||||
3 7 6 59
|
||||
|
||||
|
|
@ -72,23 +72,32 @@ As there is no canonical directory for where to find \boost on Windows,
|
|||
we recommend that you define the environment variable
|
||||
`BOOST_ROOT` and set it to where you have installed \boost, e.g., `C:\boost\boost_1_70_0`.
|
||||
|
||||
\subsection thirdpartyMPFR GNU Multiple Precision Arithmetic (GMP) and GNU Multiple Precision Floating-Point Reliably (MPFR) Libraries
|
||||
<b>GMP Version 5.0.1 or later, MPFR Version 3.0.0 or later</b>
|
||||
\subsection thirdpartyMP Multi Precision Number Type Library
|
||||
|
||||
The components \cgal, `CGAL_Core`, and `CGAL_Qt6` require
|
||||
\gmp and \mpfr which are libraries for multi precision integers and rational numbers,
|
||||
and for multi precision floating point numbers.
|
||||
|
||||
\cgal combines floating point arithmetic with exact arithmetic
|
||||
in order to be efficient and reliable. \cgal has a built-in
|
||||
number type for that, but \gmp and \mpfr provide a faster
|
||||
solution, and we recommend using them.
|
||||
GNU Multiple Precision Arithmetic (GMP) and GNU Multiple Precision Floating-Point Reliably (MPFR) Libraries
|
||||
are libraries for multi precision integers and rational numbers, and for multi precision floating point numbers.
|
||||
|
||||
These libraries can be obtained from <A HREF="https://gmplib.org/">`https://gmplib.org/`</A>
|
||||
and <A HREF="https://www.mpfr.org/">`https://www.mpfr.org/`</A>.
|
||||
Since Visual \cpp is not properly supported by the \gmp and \mpfr projects,
|
||||
we provide precompiled versions of \gmp and \mpfr, which can be downloaded
|
||||
from the <a href="https://github.com/CGAL/cgal/releases">assets of a release</a>.
|
||||
Version supported are <b>GMP Version 5.0.1 or later, MPFR Version 3.0.0 or later</b>.
|
||||
|
||||
The \boost library also provides a module for multi precision integers and rational numbers:
|
||||
<A HREF="https://www.boost.org/doc/libs/release/libs/multiprecision/doc/html/index.html">\boost multiprecision</A>.
|
||||
Versions supported are <b>\boost Version 1.72 or later</b>.
|
||||
|
||||
The components \cgal, and `CGAL_Qt6` require either \gmp and \mpfr, or \boost multiprecision
|
||||
for multi precision numbers. `CGAL_Core` requires \boost multiprecision.
|
||||
|
||||
\cgal combines floating point arithmetic with exact arithmetic
|
||||
in order to be efficient and reliable. \cgal has a built-in
|
||||
number type for that, but previous alternatives are faster
|
||||
solutions, and we recommend using one of them.
|
||||
|
||||
The CMake variable `CGAL_CMAKE_EXACT_NT_BACKEND` can be used to select
|
||||
the library that will be used internally for multi precision number types.
|
||||
|
||||
\section secoptional3rdpartysoftware Optional Third Party Libraries
|
||||
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ Using \cgal requires a few core components to be previously installed:
|
|||
<li> a supported compiler (see Section \ref seccompilers),</li>
|
||||
<li> \ref seccmake,</li>
|
||||
<li> \ref thirdpartyBoost,</li>
|
||||
<li> \ref thirdpartyMPFR.</li>
|
||||
<li> a \ref thirdpartyMP.</li>
|
||||
</ul>
|
||||
|
||||
Optional third-party software might be required to build examples and demos shipped with \cgal,
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
15.9, 16.0, 17.0 (\visualstudio 2017, 2019, and 2022).
|
||||
|
||||
\cgal is a library that has mandatory dependencies that must be first installed:
|
||||
\ref thirdpartyBoost and \ref thirdpartyMPFR.
|
||||
\ref thirdpartyBoost and a \ref thirdpartyMP.
|
||||
|
||||
You have two options to install \cgal and its dependencies: you can either use
|
||||
the *Vcpkg library manager*, which will automatically install an appropriate version of
|
||||
|
|
|
|||
|
|
@ -92400,7 +92400,7 @@ some 2 curves cross exponentially many times."
|
|||
|
||||
@inproceedings{kn-afrmt-97
|
||||
, author = "Yoshiyuki Kusakari and Takao Nishizeki"
|
||||
, title = "An Algorithm for Finding a Region with the Minimum Total {$L_1$}-Distance from Prescibed Terminals"
|
||||
, title = "An Algorithm for Finding a Region with the Minimum Total {$L_1$}-Distance from Prescribed Terminals"
|
||||
, booktitle = "Proc. 8th Annu. Internat. Sympos. Algorithms Comput."
|
||||
, nickname = "ISAAC '97"
|
||||
, site = "Singapore"
|
||||
|
|
|
|||
|
|
@ -105,7 +105,7 @@ void Generic_random_point_generator<Id, ObjectFromIdMap, GeneratorOnObject, P>:
|
|||
);
|
||||
|
||||
// generate the points
|
||||
GeneratorOnObject pointCreator(object_from_id_map(ids[target]));
|
||||
GeneratorOnObject pointCreator(object_from_id_map(ids[target]), random);
|
||||
this->d_item = *pointCreator;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -478,7 +478,6 @@ public:
|
|||
qreal bufferTextureMaxU() const { return bufferTextureMaxU_; }
|
||||
/*! Same as bufferTextureMaxU(), but for the v texture coordinate. */
|
||||
qreal bufferTextureMaxV() const { return bufferTextureMaxV_; }
|
||||
#if (QT_VERSION >= QT_VERSION_CHECK(5, 4, 0))
|
||||
// These methods are part of the QGLWidget public API.
|
||||
// As of version 2.7.0, the use of QOpenGLWidget instead means that they have
|
||||
// to be provided for backward compatibility.
|
||||
|
|
@ -486,7 +485,6 @@ public:
|
|||
const QFont &font = QFont());
|
||||
void renderText(double x, double y, double z, const QString &str,
|
||||
const QFont &font = QFont());
|
||||
#endif
|
||||
|
||||
public Q_SLOTS:
|
||||
void copyBufferToTexture(GLint, GLenum = GL_NONE);
|
||||
|
|
|
|||
|
|
@ -354,7 +354,6 @@ camera is manipulated) : main drawing method. Should be overloaded. \arg
|
|||
postDraw() : display of visual hints (world axis, FPS...) */
|
||||
CGAL_INLINE_FUNCTION
|
||||
void CGAL::QGLViewer::paintGL() {
|
||||
makeCurrent();
|
||||
// Clears screen, set model view matrix...
|
||||
preDraw();
|
||||
// Used defined method. Default calls draw()
|
||||
|
|
@ -364,7 +363,6 @@ void CGAL::QGLViewer::paintGL() {
|
|||
draw();
|
||||
// Add visual hints: axis, camera, grid...
|
||||
postDraw();
|
||||
doneCurrent();
|
||||
Q_EMIT drawFinished(true);
|
||||
}
|
||||
|
||||
|
|
@ -720,7 +718,6 @@ CGAL_INLINE_FUNCTION
|
|||
void CGAL::QGLViewer::drawLight(GLenum, qreal ) const {
|
||||
}
|
||||
|
||||
#if (QT_VERSION >= QT_VERSION_CHECK(5, 4, 0))
|
||||
CGAL_INLINE_FUNCTION
|
||||
void CGAL::QGLViewer::renderText(int x, int y, const QString &str,
|
||||
const QFont &font) {
|
||||
|
|
@ -742,7 +739,6 @@ void CGAL::QGLViewer::renderText(double x, double y, double z, const QString &st
|
|||
const Vec proj = camera_->projectedCoordinatesOf(Vec(x, y, z));
|
||||
renderText(int(proj.x), int(proj.y), str, font);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*! Draws \p text at position \p x, \p y (expressed in screen coordinates
|
||||
pixels, origin in the upper left corner of the widget).
|
||||
|
|
|
|||
|
|
@ -13,6 +13,8 @@ Release date: June 2024
|
|||
- LLVM Clang version 15.0.7 or later (on Linux)
|
||||
- Apple Clang compiler versions 10.0.1, 12.0.5, and 15.0.0 (on macOS)
|
||||
- The minimal supported version of Boost is now 1.72.0.
|
||||
- GMP/MPFR are no longer mandatory to use CGAL, [Boost.Multiprecision](https://www.boost.org/doc/libs/1_72_0/libs/multiprecision/doc/html/index.html).
|
||||
can be used instead.
|
||||
- The CGAL `Core` library is no longer based on GMP, but on
|
||||
[Boost.Multiprecision](https://www.boost.org/doc/libs/1_72_0/libs/multiprecision/doc/html/index.html).
|
||||
Either GMP backend or Boost backend can be used.
|
||||
|
|
@ -144,10 +146,6 @@ Release date: June 2024
|
|||
to the [`GenericMap`](https://doc.cgal.org/6.0/Combinatorial_map/classGenericMap.html)
|
||||
concept, which enables users to insert an edge between two different faces in order to create faces with holes.
|
||||
|
||||
- Added new meshing criterion `edge_distance`, an upper bound for the distance from the edge to the 1D feature.
|
||||
- **Breaking change**: the concept `MeshEdgeCriteria_3` was modified to include the new meshing criterion `edge_distance`.
|
||||
|
||||
|
||||
### [Quadtrees, Octrees, and Orthtrees](https://doc.cgal.org/6.0/Manual/packages.html#PkgOrthtree)
|
||||
|
||||
- **Breaking change**:
|
||||
|
|
@ -225,6 +223,9 @@ Release date: June 2024
|
|||
as well as the class `Triangle_accessor`. These were no longer used for several releases.
|
||||
- **Breaking change**: Removed the class templates `CGAL::Gray_image_mesh_domain_3`, `CGAL::Implicit_mesh_domain_3`,
|
||||
and `CGAL::Labeled_image_mesh_domain_3`, which were deprecated since CGAL-4.13.
|
||||
- Added new meshing criterion `edge_distance`, an upper bound for the distance from the edge to the 1D feature.
|
||||
- **Breaking change**: the concept `MeshEdgeCriteria_3` was modified to include the new meshing criterion `edge_distance`.
|
||||
|
||||
|
||||
### [3D Surface Mesh Generation](https://doc.cgal.org/6.0/Manual/packages.html#PkgSurfaceMesher3)
|
||||
|
||||
|
|
|
|||
|
|
@ -4,13 +4,44 @@ SPDX-PackageSupplier = "CGAL Editorial Board <info@cgal.org>"
|
|||
SPDX-PackageDownloadLocation = "https://github.com/CGAL/cgal"
|
||||
|
||||
[[annotations]]
|
||||
path = ["**.cmake", "**.md", "doc/**", "doc_html/**", "scripts/**", "developer_scripts/**", "package_info/**", "demo/**", "examples/**", "src/**", "test/**", "benchmarks/**", "benchmark/**", "data/**", "cmake/**"]
|
||||
path = [
|
||||
"**.cmake",
|
||||
"**.md",
|
||||
"doc/**",
|
||||
"doc_html/**",
|
||||
"scripts/**",
|
||||
"developer_scripts/**",
|
||||
"package_info/**",
|
||||
"demo/**",
|
||||
"examples/**",
|
||||
"src/**",
|
||||
"test/**",
|
||||
"benchmarks/**",
|
||||
"benchmark/**",
|
||||
"data/**",
|
||||
"cmake/**",
|
||||
"**/*.natvis",
|
||||
]
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "1995-2024 The CGAL Project"
|
||||
SPDX-License-Identifier = "CC0-1.0"
|
||||
|
||||
[[annotations]]
|
||||
path = ["REUSE.toml", "lib/cmake/CGAL/CGALConfig-installation-dirs.cmake.in", "include/CGAL/Qt/ImageInterface.ui", "include/CGAL/Qt/resources/qglviewer-icon.xpm", "AUTHORS", "CMakeLists.txt", "README", "auxiliary/cgal_create_cmake_script.1", "auxiliary/gmp/README", "include/CGAL/license/gpl_package_list.txt", "auxiliary/cgal_app.icns", "copyright", "VERSION"]
|
||||
path = [
|
||||
"REUSE.toml",
|
||||
"lib/cmake/CGAL/CGALConfig-installation-dirs.cmake.in",
|
||||
"include/CGAL/Qt/ImageInterface.ui",
|
||||
"include/CGAL/Qt/resources/qglviewer-icon.xpm",
|
||||
"AUTHORS",
|
||||
"CMakeLists.txt",
|
||||
"README",
|
||||
"auxiliary/cgal_create_cmake_script.1",
|
||||
"auxiliary/gmp/README",
|
||||
"include/CGAL/license/gpl_package_list.txt",
|
||||
"auxiliary/cgal_app.icns",
|
||||
"copyright",
|
||||
"VERSION",
|
||||
]
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "1995-2024 The CGAL Project"
|
||||
SPDX-License-Identifier = "CC0-1.0"
|
||||
|
|
|
|||
|
|
@ -1,8 +1,19 @@
|
|||
if(LASLIB_FOUND AND NOT TARGET CGAL::LASLIB_support)
|
||||
add_library(CGAL::LASLIB_support INTERFACE IMPORTED)
|
||||
set_target_properties(CGAL::LASLIB_support PROPERTIES
|
||||
INTERFACE_COMPILE_DEFINITIONS "CGAL_LINKED_WITH_LASLIB"
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${LASLIB_INCLUDE_DIR};${LASZIP_INCLUDE_DIR}"
|
||||
INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${LASLIB_INCLUDE_DIR};${LASZIP_INCLUDE_DIR}"
|
||||
INTERFACE_LINK_LIBRARIES "${LASLIB_LIBRARIES}")
|
||||
if(LASLIB_FOUND)
|
||||
if (NOT TARGET CGAL::LASLIB_support)
|
||||
if (NOT TARGET LASlib)
|
||||
# message(STATUS "Found using MODULE mode")
|
||||
add_library(CGAL::LASLIB_support INTERFACE IMPORTED)
|
||||
set_target_properties(CGAL::LASLIB_support PROPERTIES
|
||||
INTERFACE_COMPILE_DEFINITIONS "CGAL_LINKED_WITH_LASLIB"
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${LASLIB_INCLUDE_DIR}"
|
||||
INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${LASLIB_INCLUDE_DIR}"
|
||||
INTERFACE_LINK_LIBRARIES "${LASLIB_LIBRARIES}")
|
||||
else()
|
||||
# message(STATUS "Found using CONFIG mode")
|
||||
add_library(CGAL::LASLIB_support INTERFACE IMPORTED)
|
||||
set_target_properties(CGAL::LASLIB_support PROPERTIES
|
||||
INTERFACE_COMPILE_DEFINITIONS "CGAL_LINKED_WITH_LASLIB")
|
||||
target_link_libraries(CGAL::LASLIB_support INTERFACE LASlib)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
|
|
|||
|
|
@ -9,14 +9,16 @@
|
|||
# first look in user defined locations
|
||||
find_path(LASLIB_INCLUDE_DIR
|
||||
NAMES lasreader.hpp
|
||||
PATHS /usr/local/include/LASlib/
|
||||
PATHS /usr/local/include/LASlib/
|
||||
ENV LASLIB_INC_DIR
|
||||
)
|
||||
|
||||
|
||||
find_path(LASZIP_INCLUDE_DIR
|
||||
NAMES mydefs.hpp
|
||||
PATHS /usr/local/include/LASzip/
|
||||
${LASLIB_INCLUDE_DIR}/../../LASzip/src
|
||||
${LASLIB_INCLUDE_DIR}/../LASzip
|
||||
${LASLIB_INCLUDE_DIR}
|
||||
)
|
||||
|
||||
find_library(LASLIB_LIBRARIES
|
||||
|
|
@ -27,9 +29,22 @@ find_library(LASLIB_LIBRARIES
|
|||
${LASLIB_INCLUDE_DIR}/../../lib
|
||||
ENV LASLIB_LIB_DIR
|
||||
)
|
||||
if (NOT LASLIB_LIBRARIES)
|
||||
#library was renamed in recent versions of LAStools
|
||||
find_library(LASLIB_LIBRARIES
|
||||
NAMES LASlib
|
||||
PATHS ENV LD_LIBRARY_PATH
|
||||
ENV LIBRARY_PATH
|
||||
/usr/local/lib
|
||||
${LASLIB_INCLUDE_DIR}/../../lib
|
||||
ENV LASLIB_LIB_DIR
|
||||
)
|
||||
endif()
|
||||
|
||||
if(LASLIB_LIBRARIES AND LASLIB_INCLUDE_DIR)
|
||||
if(LASLIB_LIBRARIES AND LASLIB_INCLUDE_DIR AND LASZIP_INCLUDE_DIR)
|
||||
if (NOT ${LASLIB_INCLUDE_DIR} STREQUAL ${LASZIP_INCLUDE_DIR})
|
||||
list(APPEND LASLIB_INCLUDE_DIR ${LASZIP_INCLUDE_DIR})
|
||||
endif()
|
||||
set(LASLIB_FOUND TRUE)
|
||||
set(LASLIB_USE_FILE "UseLASLIB")
|
||||
endif()
|
||||
|
||||
|
|
|
|||
|
|
@ -3,4 +3,4 @@
|
|||
|
||||
add_definitions(-DCGAL_LINKED_WITH_LASLIB)
|
||||
|
||||
message(DEPRECATION "This file UseLASLIB.cmake is deprecated, and the imported target `CGAL::TBB_support` from CGAL_LASLIB_support.cmake should be used instead.")
|
||||
message(DEPRECATION "This file UseLASLIB.cmake is deprecated, and the imported target `CGAL::LASLIB_support` from CGAL_LASLIB_support.cmake should be used instead.")
|
||||
|
|
|
|||
|
|
@ -38,11 +38,8 @@ do_intersect(const typename K::Line_3& l,
|
|||
if(p0p1s == COLLINEAR)
|
||||
return true;
|
||||
|
||||
CGAL::Orientation stp0 = pred(r.source(), r.second_point(), l.point(0));
|
||||
if(stp0 == COLLINEAR)
|
||||
return Ray_3_has_on_collinear_Point_3(r,l.point(0),k);
|
||||
|
||||
return (p0p1s != stp0);
|
||||
typename K::Point_3 lst = l.point(0) + (r.point(1) - r.point(0));
|
||||
return (pred(l.point(0), l.point(1), r.point(0), lst) != CGAL::POSITIVE);
|
||||
}
|
||||
|
||||
template <class K>
|
||||
|
|
|
|||
|
|
@ -232,6 +232,10 @@ public:
|
|||
check_no_intersection(L(p(0,0,0),p(1,0,0)), R(p(3,0,1),p(6,0,1)));
|
||||
check_no_intersection(L(p(0,0,0),p(1,0,0)), R(p(0,2,0),p(0,4,0)));
|
||||
check_no_intersection(L(p(0,0,0),p(1,0,0)), R(p(6,2,0),p(5,4,0)));
|
||||
check_no_intersection(L(p(0,0,0),p(0,1,0)), R(p(1,-1,0),p(1,0,0)));
|
||||
check_no_intersection(L(p(0,-10,0),p(0,-9,0)), R(p(1,-1,0),p(2,0,0)));
|
||||
check_no_intersection(L(p(0,-10,0),p(0,0,0)), R(p(1,-1,0),p(2,0,0)));
|
||||
check_no_intersection(L(p(0,0,0),p(0,1,0)), R(p(1,-1,0),p(2,0,0)));
|
||||
|
||||
// Point intersection
|
||||
check_intersection (L(p(0,0,0),p(1,0,0)), R(p(3,0,0),p(6,4,0)),
|
||||
|
|
|
|||
|
|
@ -74,6 +74,14 @@ public:
|
|||
check_no_intersection (R(p(0,0,0), p(1,0,0)), R(p(0,1,0), p(0,2,0)));
|
||||
check_no_intersection (R(p(0,0,0), p(1,0,0)), R(p(-1,0,0), p(-1,-1,0)));
|
||||
|
||||
check_no_intersection (R(p(1,-1,0), p(2,0,0)), R(p(2,-1,0), p(3,0,0)));
|
||||
check_no_intersection (R(p(1,-1,0), p(2,0,0)), R(p(2,-1,0), p(3,-1,0)));
|
||||
check_no_intersection (R(p(1,-1,0), p(2,0,0)), R(p(2,-1,0), p(3,-2,0)));
|
||||
check_no_intersection (R(p(0,0,0), p(0,1,0)), R(p(0,-1,0), p(1,-1,0)));
|
||||
check_no_intersection (R(p(0,0,0), p(0,1,0)), R(p(-1,-3,0),p(2,0,0)));
|
||||
check_no_intersection (R(p(0,0,0), p(0,1,0)), R(p(-2,-4,0),p(-1,-3,0)));
|
||||
check_no_intersection (R(p(0,0,0), p(0,1,0)), R(p(1,-1,0), p(2,0,0)));
|
||||
|
||||
// Point
|
||||
check_intersection (R(p(0,0,0), p(1,0,0)), R(p(0,0,0), p(-1,0,0)),
|
||||
p(0,0,0));
|
||||
|
|
@ -88,6 +96,10 @@ public:
|
|||
check_intersection (R(p(0,0,0), p(1,0,0)), R(p(1,-2,0), p(1,-1,0)),
|
||||
p(1,0,0));
|
||||
|
||||
check_intersection (R(p(0,0,0), p(1,0,0)), R(p(1,-2,0), p(1,-1,0)),
|
||||
p(1,0,0));
|
||||
|
||||
|
||||
// Segment
|
||||
check_intersection (R(p(0,0,0), p(1,0,0)), R(p(2,0,0), p(-3,0,0)),
|
||||
S(p(0,0,0), p(2,0,0)), false);
|
||||
|
|
@ -161,6 +173,8 @@ public:
|
|||
for(int i=0; i<N; ++i)
|
||||
{
|
||||
P c = random_point(), q = random_point();
|
||||
while(c==q)
|
||||
q = random_point();
|
||||
Sph sph(c, CGAL::squared_distance(c, q));
|
||||
|
||||
// single point
|
||||
|
|
|
|||
|
|
@ -27,10 +27,8 @@ int& code_to_call_before_creation_of_QCoreApplication(int& i) {
|
|||
fmt.setOption(QSurfaceFormat::DebugContext);
|
||||
QSurfaceFormat::setDefaultFormat(fmt);
|
||||
|
||||
//for windows
|
||||
#if (QT_VERSION >= QT_VERSION_CHECK(5, 3, 0))
|
||||
// for windows
|
||||
QCoreApplication::setAttribute(Qt::AA_UseDesktopOpenGL);
|
||||
#endif
|
||||
|
||||
return i;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -663,15 +663,7 @@ void MainWindow::loadPlugins()
|
|||
}
|
||||
}
|
||||
QString env_path = qgetenv("LAB_DEMO_PLUGINS_PATH");
|
||||
#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0))
|
||||
QChar separator = QDir::listSeparator();
|
||||
#else
|
||||
#if defined(_WIN32)
|
||||
QChar separator = ';';
|
||||
#else
|
||||
QChar separator = ':';
|
||||
#endif
|
||||
#endif
|
||||
if(!env_path.isEmpty()) {
|
||||
#if defined(_WIN32)
|
||||
QString path = qgetenv("PATH");
|
||||
|
|
@ -2652,17 +2644,10 @@ void MainWindow::resetHeader()
|
|||
sceneView->header()->setSectionResizeMode(Scene::RenderingModeColumn, QHeaderView::ResizeToContents);
|
||||
sceneView->header()->setSectionResizeMode(Scene::ABColumn, QHeaderView::Fixed);
|
||||
sceneView->header()->setSectionResizeMode(Scene::VisibleColumn, QHeaderView::Fixed);
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)
|
||||
sceneView->header()->resizeSection(Scene::ColorColumn, sceneView->header()->fontMetrics().horizontalAdvance("_#_"));
|
||||
sceneView->resizeColumnToContents(Scene::RenderingModeColumn);
|
||||
sceneView->header()->resizeSection(Scene::ABColumn, sceneView->header()->fontMetrics().horizontalAdvance(QString("_AB_")));
|
||||
sceneView->header()->resizeSection(Scene::VisibleColumn, sceneView->header()->fontMetrics().horizontalAdvance(QString("_View_")));
|
||||
#else
|
||||
sceneView->header()->resizeSection(Scene::ColorColumn, sceneView->header()->fontMetrics().width("_#_"));
|
||||
sceneView->resizeColumnToContents(Scene::RenderingModeColumn);
|
||||
sceneView->header()->resizeSection(Scene::ABColumn, sceneView->header()->fontMetrics().width(QString("_AB_")));
|
||||
sceneView->header()->resizeSection(Scene::VisibleColumn, sceneView->header()->fontMetrics().width(QString("_View_")));
|
||||
#endif
|
||||
}
|
||||
|
||||
void MainWindow::reset_default_loaders()
|
||||
|
|
|
|||
|
|
@ -705,11 +705,7 @@ private:
|
|||
|
||||
// Find the right width for the label to accommodate at least 9999
|
||||
QFontMetrics metric = x_cubeLabel->fontMetrics();
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)
|
||||
x_cubeLabel->setFixedWidth(metric.horizontalAdvance(QString(".9999.")));
|
||||
#else
|
||||
x_cubeLabel->setFixedWidth(metric.width(QString(".9999.")));
|
||||
#endif
|
||||
x_cubeLabel->setText("0");
|
||||
x_cubeLabel->setValidator(validator);
|
||||
|
||||
|
|
@ -735,11 +731,7 @@ private:
|
|||
|
||||
// Find the right width for the label to accommodate at least 9999
|
||||
QFontMetrics metric = y_cubeLabel->fontMetrics();
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)
|
||||
y_cubeLabel->setFixedWidth(metric.horizontalAdvance(QString(".9999.")));
|
||||
#else
|
||||
y_cubeLabel->setFixedWidth(metric.width(QString(".9999.")));
|
||||
#endif
|
||||
y_cubeLabel->setText("0");
|
||||
y_cubeLabel->setValidator(validator);
|
||||
y_slider = new QSlider(mw);
|
||||
|
|
@ -764,11 +756,7 @@ private:
|
|||
|
||||
// Find the right width for the label to accommodate at least 9999
|
||||
QFontMetrics metric = z_cubeLabel->fontMetrics();
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)
|
||||
z_cubeLabel->setFixedWidth(metric.horizontalAdvance(QString(".9999.")));
|
||||
#else
|
||||
z_cubeLabel->setFixedWidth(metric.width(QString(".9999.")));
|
||||
#endif
|
||||
z_cubeLabel->setText("0");
|
||||
z_cubeLabel->setValidator(validator);
|
||||
z_slider = new QSlider(mw);
|
||||
|
|
|
|||
|
|
@ -750,7 +750,9 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type,
|
|||
}
|
||||
}
|
||||
|
||||
if(mesh_type != Mesh_type::SURFACE_ONLY && !material_ids_valid)
|
||||
if(mesh_type != Mesh_type::SURFACE_ONLY
|
||||
&& !material_ids_valid
|
||||
&& bounding_sm_item != nullptr)
|
||||
{
|
||||
sm_items.removeAll(make_not_null(bounding_sm_item));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -171,8 +171,10 @@ log() const
|
|||
.arg(detect_connected_components);
|
||||
res << QString("use weights: %1").arg(weights_ptr != nullptr);
|
||||
}
|
||||
res << QString("use aabb tree: %1").arg(use_sizing_field_with_aabb_tree);
|
||||
res << QString("manifold: %1").arg(manifold);
|
||||
if(use_sizing_field_with_aabb_tree)
|
||||
res << QString("use sizing field with aabb tree: %1").arg(use_sizing_field_with_aabb_tree);
|
||||
if(manifold)
|
||||
res << QString("manifold: %1").arg(manifold);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -250,11 +250,7 @@ protected:
|
|||
}
|
||||
case QEvent::Wheel: {
|
||||
QWheelEvent* event = static_cast<QWheelEvent*>(ev);
|
||||
#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0)
|
||||
QPoint pos = event->pos();
|
||||
#else
|
||||
QPointF pos = event->position();
|
||||
#endif
|
||||
QPointF old_pos = v->mapToScene(pos.x(), pos.y());
|
||||
if(event->angleDelta().y() <0)
|
||||
v->scale(1.2, 1.2);
|
||||
|
|
|
|||
|
|
@ -142,11 +142,7 @@ protected:
|
|||
}
|
||||
case QEvent::Wheel: {
|
||||
QWheelEvent* event = static_cast<QWheelEvent*>(ev);
|
||||
#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0)
|
||||
QPoint pos = event->pos();
|
||||
#else
|
||||
QPointF pos = event->position();
|
||||
#endif
|
||||
QPointF old_pos = v->mapToScene(pos.x(), pos.y());
|
||||
if(event->angleDelta().y() <0)
|
||||
v->scale(1.2, 1.2);
|
||||
|
|
|
|||
|
|
@ -1152,13 +1152,7 @@ void Viewer::drawVisualHints()
|
|||
//Prints the displayMessage
|
||||
QFont font = QFont();
|
||||
QFontMetrics fm(font);
|
||||
TextItem *message_text = new TextItem(float(10 +
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)
|
||||
fm.horizontalAdvance(d->message)/2)
|
||||
#else
|
||||
fm.width(d->message)/2)
|
||||
#endif
|
||||
,
|
||||
TextItem *message_text = new TextItem(float(10 + fm.horizontalAdvance(d->message)/2),
|
||||
float(height()-20),
|
||||
0, d->message, false,
|
||||
QFont(), Qt::gray );
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ class Release:
|
|||
"""return the command to create and publish the release"""
|
||||
return (
|
||||
f"PATH=/home/lrineau/bin-cmake3:/bin:/usr/bin:/home/lrineau/bin; cd {self.cwd} &&"
|
||||
+ " /usr/bin/time scl enable rh-git29 -- "
|
||||
+ " /usr/bin/time -v bash -x "
|
||||
+ f"$HOME/bin/create_release {self.repo}{self.extra_options} --do-it"
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -13,8 +13,8 @@ from cgal_release import release, integration, master, beta_release, master, bet
|
|||
# Define a dictionary that maps day of the week to an action
|
||||
actions = {
|
||||
"Monday": integration,
|
||||
"Tuesday": integration,
|
||||
"Wednesday": integration,
|
||||
"Tuesday": release("5.5"), #integration,
|
||||
"Wednesday": release("5.6"), #integration,
|
||||
"Thursday": integration,
|
||||
"Friday": release("5.5"),
|
||||
"Saturday": release("5.6"),
|
||||
|
|
|
|||
|
|
@ -103,13 +103,13 @@ sub write_select()
|
|||
print OUTPUTV '<option disabled selected value="">(select a release)', "</option>\n";
|
||||
my %results;
|
||||
foreach $_ (glob("results-*.shtml")) {
|
||||
my $ctime = (stat($_))[10];
|
||||
$results{$_} = $ctime;
|
||||
my $mtime = (stat($_))[9];
|
||||
$results{$_} = $mtime;
|
||||
}
|
||||
foreach $_ (sort { $results{$b} <=> $results{$a} } keys %results) {
|
||||
$_ =~ /results-${pattern}(\.\d+)?(-.*|)\.shtml/ || next;
|
||||
my $ctime = (stat($_))[10];
|
||||
my $date = time2str('%a %Y/%m/%d', $ctime);
|
||||
my $mtime = (stat($_))[9];
|
||||
my $date = time2str('%a %Y/%m/%d', $mtime);
|
||||
print OUTPUTV '<option value="', $_, '">';
|
||||
($filename) = m/results-(.*?)\.shtml\s*/;
|
||||
# printf OUTPUTV "%-20s (last modified: %s)</option>\n", $filename, $date;
|
||||
|
|
|
|||
|
|
@ -117,7 +117,7 @@ sub reformat_results($)
|
|||
# if (/BOOST_BIMAP_VERSION = '([^']+)'/) {
|
||||
# $BOOST="$BOOST+bimap";
|
||||
# }
|
||||
if (/USING +CXXFLAGS = '([^']*)'/) {
|
||||
if (/USING +CXXFLAGS = '([^']*)'/ && !$CXXFLAGS) {
|
||||
$CXXFLAGS="$CXXFLAGS $1";
|
||||
}
|
||||
if (/USING +LDFLAGS = '([^']*)'/) {
|
||||
|
|
|
|||
|
|
@ -152,7 +152,7 @@ public:
|
|||
Protect_edges_sizing_field(C3T3& c3t3,
|
||||
const MeshDomain& domain,
|
||||
SizingFunction size=SizingFunction(),
|
||||
const FT minimal_size = FT(-1),
|
||||
const FT minimal_size = FT(0),
|
||||
const Distance_Function edge_distance = Distance_Function(),
|
||||
const std::size_t maximal_number_of_vertices = 0,
|
||||
Mesh_error_code* error_code = 0
|
||||
|
|
@ -273,8 +273,7 @@ private:
|
|||
|
||||
/// Returns `true` if the edge `(va,vb)` is a not good enough approximation
|
||||
/// of its feature.
|
||||
bool approx_is_too_large(const Vertex_handle& va,
|
||||
const Vertex_handle& vb,
|
||||
bool approx_is_too_large(const Edge& e,
|
||||
const bool is_edge_in_complex) const;
|
||||
|
||||
/// Returns `true` if the balls of `va` and `vb` intersect.
|
||||
|
|
@ -458,10 +457,12 @@ private:
|
|||
dim = -1 - dim;
|
||||
|
||||
const FT s = field(p, dim, index);
|
||||
if(s <= FT(0)) {
|
||||
if(s < minimal_size_)
|
||||
{
|
||||
std::stringstream msg;
|
||||
msg.precision(17);
|
||||
msg << "Error: the field is null at ";
|
||||
msg << "Error: the field is smaller than minimal size ("
|
||||
<< minimal_size_ << ") at ";
|
||||
if(dim == 0) msg << "corner (";
|
||||
else msg << "point (";
|
||||
msg << p << ")";
|
||||
|
|
@ -493,7 +494,7 @@ private:
|
|||
|
||||
bool use_minimal_size() const
|
||||
{
|
||||
return minimal_size_ != FT(-1);
|
||||
return minimal_size_ != FT(0);
|
||||
}
|
||||
Weight minimal_weight() const
|
||||
{
|
||||
|
|
@ -645,7 +646,10 @@ insert_corners()
|
|||
#endif
|
||||
|
||||
// Get weight (the ball radius is given by the 'query_size' function)
|
||||
FT w = CGAL::square(query_size(p, 0, p_index));
|
||||
const FT query_weight = CGAL::square(query_size(p, 0, p_index));
|
||||
FT w = use_minimal_size()
|
||||
? (std::min)(minimal_weight_, query_weight)
|
||||
: query_weight;
|
||||
|
||||
#if CGAL_MESH_3_PROTECTION_DEBUG & 1
|
||||
std::cerr << "Weight from sizing field: " << w << std::endl;
|
||||
|
|
@ -716,7 +720,10 @@ insert_point(const Bare_point& p, const Weight& w, int dim, const Index& index,
|
|||
typename GT::Construct_weighted_point_3 cwp =
|
||||
c3t3_.triangulation().geom_traits().construct_weighted_point_3_object();
|
||||
|
||||
const Weighted_point wp = cwp(p,w*weight_modifier);
|
||||
const FT wwm = use_minimal_size()
|
||||
? (std::max)(w * weight_modifier, minimal_weight())
|
||||
: w * weight_modifier;
|
||||
const Weighted_point wp = cwp(p, wwm);
|
||||
|
||||
typename Tr::Locate_type lt;
|
||||
int li, lj;
|
||||
|
|
@ -734,7 +741,7 @@ insert_point(const Bare_point& p, const Weight& w, int dim, const Index& index,
|
|||
std::cerr << "SPECIAL ";
|
||||
std::cerr << "protecting ball ";
|
||||
if(v == Vertex_handle())
|
||||
std::cerr << cwp(p,w*weight_modifier);
|
||||
std::cerr << cwp(p, wwm);
|
||||
else
|
||||
std::cerr << disp_vert(v);
|
||||
|
||||
|
|
@ -860,13 +867,11 @@ smart_insert_point(const Bare_point& p, Weight w, int dim, const Index& index,
|
|||
std::back_inserter(cells_in_conflicts),
|
||||
CGAL::Emptyset_iterator());
|
||||
|
||||
for(typename std::vector<Cell_handle>::const_iterator
|
||||
it = cells_in_conflicts.begin(),
|
||||
end = cells_in_conflicts.end(); it != end; ++it)
|
||||
for(Cell_handle cit : cells_in_conflicts)
|
||||
{
|
||||
for(int i=0, d=tr.dimension(); i<=d; ++i)
|
||||
{
|
||||
const Vertex_handle v = (*it)->vertex(i);
|
||||
const Vertex_handle v = cit->vertex(i);
|
||||
if(c3t3_.triangulation().is_infinite(v))
|
||||
continue;
|
||||
if(!vertices_in_conflict_zone_set.insert(v).second)
|
||||
|
|
@ -1023,21 +1028,20 @@ insert_balls_on_edges()
|
|||
domain_.get_curves(std::back_inserter(input_features));
|
||||
|
||||
// Iterate on edges
|
||||
for ( typename Input_features::iterator fit = input_features.begin(),
|
||||
end = input_features.end() ; fit != end ; ++fit )
|
||||
for (const Feature_tuple& ft : input_features)
|
||||
{
|
||||
if(forced_stop()) break;
|
||||
const Curve_index& curve_index = std::get<0>(*fit);
|
||||
const Curve_index& curve_index = std::get<0>(ft);
|
||||
if ( ! is_treated(curve_index) )
|
||||
{
|
||||
#if CGAL_MESH_3_PROTECTION_DEBUG & 1
|
||||
std::cerr << "\n** treat curve #" << curve_index << std::endl;
|
||||
#endif
|
||||
const Bare_point& p = std::get<1>(*fit).first;
|
||||
const Bare_point& q = std::get<2>(*fit).first;
|
||||
const Bare_point& p = std::get<1>(ft).first;
|
||||
const Bare_point& q = std::get<2>(ft).first;
|
||||
|
||||
const Index& p_index = std::get<1>(*fit).second;
|
||||
const Index& q_index = std::get<2>(*fit).second;
|
||||
const Index& p_index = std::get<1>(ft).second;
|
||||
const Index& q_index = std::get<2>(ft).second;
|
||||
|
||||
Vertex_handle vp,vq;
|
||||
if ( ! domain_.is_loop(curve_index) )
|
||||
|
|
@ -1178,12 +1182,12 @@ insert_balls(const Vertex_handle& vp,
|
|||
const Weighted_point& vp_wp = c3t3_.triangulation().point(vp);
|
||||
|
||||
#if ! defined(CGAL_NO_PRECONDITIONS)
|
||||
if(sp <= 0) {
|
||||
std::stringstream msg;;
|
||||
if(sp < minimal_size_) {
|
||||
std::stringstream msg;
|
||||
msg.precision(17);
|
||||
msg << "Error: the mesh sizing field is null at point (";
|
||||
msg << cp(vp_wp) << ")!";
|
||||
CGAL_precondition_msg(sp > 0, msg.str().c_str());
|
||||
msg << "Error: the mesh sizing field is smaller than minimal size ";
|
||||
msg << " at point (" << cp(vp_wp) << ")!";
|
||||
CGAL_precondition_msg(sp > minimal_size_, msg.str().c_str());
|
||||
}
|
||||
#endif // ! CGAL_NO_PRECONDITIONS
|
||||
|
||||
|
|
@ -1428,7 +1432,7 @@ refine_balls()
|
|||
if( // topology condition
|
||||
non_adjacent_but_intersect(va, vb, is_edge_in_complex)
|
||||
// approximation condition
|
||||
|| (use_distance_field() && approx_is_too_large(va, vb, is_edge_in_complex)))
|
||||
|| (use_distance_field() && approx_is_too_large(*eit, is_edge_in_complex)))
|
||||
{
|
||||
using CGAL::Mesh_3::internal::distance_divisor;
|
||||
|
||||
|
|
@ -1480,14 +1484,11 @@ refine_balls()
|
|||
new_sizes.clear();
|
||||
|
||||
// Update size of balls
|
||||
for ( typename std::vector<std::pair<Vertex_handle,FT> >::iterator
|
||||
it = new_sizes_copy.begin(),
|
||||
end = new_sizes_copy.end();
|
||||
it != end ; ++it )
|
||||
for (const std::pair<Vertex_handle,FT>& it : new_sizes_copy)
|
||||
{
|
||||
if(forced_stop()) break;
|
||||
const Vertex_handle v = it->first;
|
||||
const FT new_size = it->second;
|
||||
const Vertex_handle v = it.first;
|
||||
const FT new_size = it.second;
|
||||
// Set size of the ball to new value
|
||||
if(use_minimal_size() && new_size < minimal_size_) {
|
||||
if(!is_special(v)) {
|
||||
|
|
@ -1557,34 +1558,27 @@ do_balls_intersect(const Vertex_handle& va, const Vertex_handle& vb) const
|
|||
template <typename C3T3, typename MD, typename Sf, typename Df>
|
||||
bool
|
||||
Protect_edges_sizing_field<C3T3, MD, Sf, Df>::
|
||||
approx_is_too_large(const Vertex_handle& va, const Vertex_handle& vb, const bool is_edge_in_complex) const
|
||||
approx_is_too_large(const Edge& e, const bool is_edge_in_complex) const
|
||||
{
|
||||
if ( ! is_edge_in_complex )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
typedef typename Kernel::Point_3 Point_3;
|
||||
|
||||
Curve_index curve_index = domain_.curve_index((va->in_dimension() < vb->in_dimension()) ? vb->index() : va->index());
|
||||
const Bare_point& pa = e.first->vertex(e.second)->point().point();
|
||||
const Bare_point& pb = e.first->vertex(e.third)->point().point();
|
||||
|
||||
const Point_3& pa = va->point().point();
|
||||
const Point_3& pb = vb->point().point();
|
||||
const Point_3& segment_middle = CGAL::midpoint(pa, pb);
|
||||
// Obtain the geodesic middle point
|
||||
FT signed_geodesic_distance = domain_.signed_geodesic_distance(pa, pb, curve_index);
|
||||
Point_3 geodesic_middle;
|
||||
if (signed_geodesic_distance >= FT(0))
|
||||
{
|
||||
geodesic_middle = domain_.construct_point_on_curve(pa, curve_index, signed_geodesic_distance / 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
geodesic_middle = domain_.construct_point_on_curve(pb, curve_index, -signed_geodesic_distance / 2);
|
||||
}
|
||||
// Compare distance to the parameter's distance
|
||||
FT squared_evaluated_distance = CGAL::squared_distance(segment_middle, geodesic_middle);
|
||||
FT segment_middle_edge_distance = query_distance(segment_middle, 1, curve_index);
|
||||
return squared_evaluated_distance > CGAL::square(segment_middle_edge_distance);
|
||||
// Construct the geodesic middle point
|
||||
const Curve_index curve_index = c3t3_.curve_index(e);
|
||||
const FT signed_geodesic_distance = domain_.signed_geodesic_distance(pa, pb, curve_index);
|
||||
const Bare_point geodesic_middle = (signed_geodesic_distance >= FT(0))
|
||||
? domain_.construct_point_on_curve(pa, curve_index, signed_geodesic_distance / 2)
|
||||
: domain_.construct_point_on_curve(pb, curve_index, -signed_geodesic_distance / 2);
|
||||
|
||||
const Bare_point edge_middle = CGAL::midpoint(pa, pb);
|
||||
const FT squared_evaluated_distance = CGAL::squared_distance(edge_middle, geodesic_middle);
|
||||
|
||||
// Compare distance to the distance field from criteria
|
||||
const FT max_distance_to_curve = query_distance(edge_middle, 1, curve_index);
|
||||
return squared_evaluated_distance > CGAL::square(max_distance_to_curve);
|
||||
}
|
||||
|
||||
template <typename C3T3, typename MD, typename Sf, typename Df>
|
||||
|
|
|
|||
|
|
@ -252,8 +252,8 @@ public:
|
|||
: (- negative_distance);
|
||||
} else {
|
||||
return (pit <= qit)
|
||||
? curve_segment_length(p, q, CGAL::POSITIVE)
|
||||
: ( - curve_segment_length(p, q, CGAL::NEGATIVE) );
|
||||
? curve_segment_length(p, q, CGAL::POSITIVE, pit, qit)
|
||||
: ( - curve_segment_length(p, q, CGAL::NEGATIVE, pit, qit) );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -177,7 +177,13 @@ public:
|
|||
|
||||
/// Returns size of tuple (p,dim,index)
|
||||
FT sizing_field(const Point_3& p, const int dim, const Index& index) const
|
||||
{ return (*p_size_)(p,dim,index); }
|
||||
{
|
||||
const FT s = (*p_size_)(p, dim, index);
|
||||
if (min_length_bound_ == FT(0))
|
||||
return s;
|
||||
else
|
||||
return (std::max)(s, min_length_bound_);
|
||||
}
|
||||
|
||||
FT distance_field(const Point_3& p, const int dim, const Index& index) const
|
||||
{
|
||||
|
|
|
|||
|
|
@ -901,10 +901,11 @@ protected:
|
|||
|
||||
Unique_hash_map<Vertex_const_handle, bool>& omit_vertex;
|
||||
int nov, nof;
|
||||
bool hh;
|
||||
|
||||
public:
|
||||
Find_holes(Unique_hash_map<Vertex_const_handle, bool>& omit_vertex_)
|
||||
: omit_vertex(omit_vertex_), nov(0), nof(0) {}
|
||||
: omit_vertex(omit_vertex_), nov(0), nof(0), hh(false) {}
|
||||
|
||||
void visit(Halffacet_const_handle f) {
|
||||
++nof;
|
||||
|
|
@ -917,10 +918,11 @@ protected:
|
|||
CGAL_For_all(sfc, send) {
|
||||
omit_vertex[sfc->source()->source()] = true;
|
||||
--nov;
|
||||
hh=true;
|
||||
}
|
||||
} else if(fc.is_shalfloop()) {
|
||||
SHalfloop_const_handle sl(fc);
|
||||
omit_vertex[sl->incident_sface()->center_vertex()];
|
||||
omit_vertex[sl->incident_sface()->center_vertex()] = true;
|
||||
--nov;
|
||||
} else
|
||||
CGAL_error_msg( "wrong handle type");
|
||||
|
|
@ -940,6 +942,63 @@ protected:
|
|||
int number_of_facets() const {
|
||||
return nof;
|
||||
}
|
||||
|
||||
bool holes_detected() const {
|
||||
return hh;
|
||||
}
|
||||
};
|
||||
|
||||
class Nested_holes {
|
||||
|
||||
Unique_hash_map<Vertex_const_handle, bool>& omit_vertex;
|
||||
int norv, nof;
|
||||
|
||||
public:
|
||||
Nested_holes(Unique_hash_map<Vertex_const_handle, bool>& omit_vertex_)
|
||||
: omit_vertex(omit_vertex_), norv(0), nof(0) {}
|
||||
|
||||
void visit(Halffacet_const_handle f) {
|
||||
Halffacet_cycle_const_iterator fc = f->facet_cycles_begin();
|
||||
CGAL_assertion(fc.is_shalfedge());
|
||||
|
||||
SHalfedge_around_facet_const_circulator sfc(fc), send(sfc);
|
||||
bool all_in=true;
|
||||
bool all_out=true;
|
||||
CGAL_For_all(sfc, send) {
|
||||
if (omit_vertex[sfc->source()->source()])
|
||||
all_in=false;
|
||||
else
|
||||
all_out=false;
|
||||
}
|
||||
if (!all_in && !all_out)
|
||||
{
|
||||
SHalfedge_around_facet_const_circulator sfc(fc), send(sfc);
|
||||
++nof;
|
||||
CGAL_For_all(sfc, send) {
|
||||
if (!omit_vertex[sfc->source()->source()])
|
||||
{
|
||||
omit_vertex[sfc->source()->source()]=true;
|
||||
++norv;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (all_in)
|
||||
++nof;
|
||||
}
|
||||
|
||||
void visit(Vertex_const_handle) {}
|
||||
void visit(SFace_const_handle) {}
|
||||
void visit(Halfedge_const_handle) {}
|
||||
void visit(SHalfedge_const_handle) {}
|
||||
void visit(SHalfloop_const_handle) {}
|
||||
|
||||
int number_of_removed_vertices() const {
|
||||
return norv;
|
||||
}
|
||||
|
||||
int number_of_facets() const {
|
||||
return nof;
|
||||
}
|
||||
};
|
||||
|
||||
class Add_vertices {
|
||||
|
|
@ -998,14 +1057,19 @@ protected:
|
|||
se = SHalfedge_const_handle(fc);
|
||||
CGAL_assertion(se!=0);
|
||||
if(omit_vertex[se->source()->source()]) return;
|
||||
B.begin_facet();
|
||||
|
||||
SHalfedge_around_facet_const_circulator hc_start(se);
|
||||
SHalfedge_around_facet_const_circulator hc_end(hc_start);
|
||||
std::vector<std::size_t> vids;
|
||||
CGAL_For_all(hc_start,hc_end) {
|
||||
CGAL_NEF_TRACEN(" add vertex " << hc_start->source()->center_vertex()->point());
|
||||
B.add_vertex_to_facet(VI[hc_start->source()->center_vertex()]);
|
||||
if (omit_vertex[hc_start->source()->center_vertex()])
|
||||
{
|
||||
std::cout << "issue with " << se->source()->source()->point() << "\n";
|
||||
return;
|
||||
}
|
||||
vids.push_back(VI[hc_start->source()->center_vertex()]);
|
||||
}
|
||||
B.end_facet();
|
||||
B.add_facet (vids.begin(), vids.end());
|
||||
}
|
||||
|
||||
void visit(SFace_const_handle) {}
|
||||
|
|
@ -1030,11 +1094,29 @@ protected:
|
|||
|
||||
Polyhedron_incremental_builder_3<HDS> B(hds, true);
|
||||
|
||||
// first mark vertices of holes of each halffacet as omitted.
|
||||
Find_holes F(omit_vertex);
|
||||
scd.visit_shell_objects(sf, F);
|
||||
std::size_t nb_v = F.number_of_vertices();
|
||||
std::size_t nb_f = F.number_of_facets();
|
||||
|
||||
B.begin_surface(F.number_of_vertices(),
|
||||
F.number_of_facets(),
|
||||
// then if a halffacet contains a vertex marked as omitted, all its vertices
|
||||
// must be marked as such
|
||||
if (F.holes_detected())
|
||||
{
|
||||
while(true)
|
||||
{
|
||||
Nested_holes F2(omit_vertex);
|
||||
scd.visit_shell_objects(sf, F2);
|
||||
if (F2.number_of_removed_vertices()==0) break;
|
||||
nb_v-=F2.number_of_removed_vertices();
|
||||
nb_f=F2.number_of_facets();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
B.begin_surface(nb_v,
|
||||
nb_f,
|
||||
F.number_of_vertices()+F.number_of_facets()-2);
|
||||
|
||||
Add_vertices A(B,omit_vertex, VI);
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@
|
|||
#include <CGAL/Triangulation_vertex_base_with_info_2.h>
|
||||
#include <CGAL/Triangulation_face_base_with_info_2.h>
|
||||
#include <CGAL/Kernel/global_functions_3.h>
|
||||
#include <CGAL/Nef_S2/Generic_handle_map.h>
|
||||
|
||||
#include <unordered_map>
|
||||
|
||||
|
|
@ -81,6 +82,7 @@ struct Shell_polygons_visitor
|
|||
Vertex_index_map& vertex_indices;
|
||||
PolygonRange& polygons;
|
||||
bool triangulate_all_faces;
|
||||
CGAL::Generic_handle_map<bool> Done;
|
||||
|
||||
Shell_polygons_visitor(Vertex_index_map& vertex_indices,
|
||||
PolygonRange& polygons,
|
||||
|
|
@ -88,6 +90,7 @@ struct Shell_polygons_visitor
|
|||
: vertex_indices( vertex_indices )
|
||||
, polygons(polygons)
|
||||
, triangulate_all_faces(triangulate_all_faces)
|
||||
, Done(false)
|
||||
{}
|
||||
|
||||
std::size_t get_cycle_length( typename Nef_polyhedron::Halffacet_cycle_const_iterator hfc) const
|
||||
|
|
@ -103,6 +106,14 @@ struct Shell_polygons_visitor
|
|||
|
||||
void visit(typename Nef_polyhedron::Halffacet_const_handle opposite_facet)
|
||||
{
|
||||
typename Nef_polyhedron::Halffacet_const_handle twin_facet = opposite_facet->twin();
|
||||
|
||||
// skip when we have to do with the unbounded volume and a surface with boundaries
|
||||
if ((twin_facet->incident_volume() == opposite_facet->incident_volume()) && Done[twin_facet])
|
||||
return;
|
||||
|
||||
Done[opposite_facet] = true;
|
||||
|
||||
bool is_marked=opposite_facet->incident_volume()->mark();
|
||||
|
||||
CGAL_assertion(Nef_polyhedron::Infi_box::is_standard(opposite_facet->plane()));
|
||||
|
|
@ -351,18 +362,50 @@ void convert_nef_polyhedron_to_polygon_soup(const Nef_polyhedron& nef,
|
|||
typedef Cartesian_converter<Nef_Kernel, Output_kernel> Converter;
|
||||
typename Nef_polyhedron::Volume_const_iterator vol_it = nef.volumes_begin(),
|
||||
vol_end = nef.volumes_end();
|
||||
if ( Nef_polyhedron::Infi_box::extended_kernel() ) ++vol_it; // skip Infi_box
|
||||
CGAL_assertion ( vol_it != vol_end );
|
||||
++vol_it; // skip unbounded volume
|
||||
|
||||
if (Nef_polyhedron::Infi_box::extended_kernel()) ++vol_it; // skip Infi_box
|
||||
|
||||
if ( vol_it == vol_end ) return;
|
||||
|
||||
Converter to_output;
|
||||
bool handling_unbounded_volume = true;
|
||||
|
||||
auto shell_is_closed = [](typename Nef_polyhedron::Shell_entry_const_iterator sfh)
|
||||
{
|
||||
typename Nef_polyhedron::SFace_const_handle sf = sfh;
|
||||
|
||||
typename Nef_polyhedron::SFace_cycle_const_iterator fc;
|
||||
for(fc = sf->sface_cycles_begin(); fc != sf->sface_cycles_end(); ++fc)
|
||||
{
|
||||
if (fc.is_shalfedge() ) {
|
||||
typename Nef_polyhedron::SHalfedge_const_handle e(fc);
|
||||
typename Nef_polyhedron::SHalfedge_around_sface_const_circulator ec(e),ee(e);
|
||||
CGAL_For_all(ec,ee)
|
||||
{
|
||||
typename Nef_polyhedron::Halffacet_const_handle f = ec->twin()->facet();
|
||||
if (f->incident_volume()==f->twin()->incident_volume())
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
for (;vol_it!=vol_end;++vol_it)
|
||||
nef_to_pm::collect_polygon_mesh_info(points,
|
||||
polygons,
|
||||
nef,
|
||||
vol_it->shells_begin(),
|
||||
to_output,
|
||||
triangulate_all_faces);
|
||||
{
|
||||
for(auto sit = vol_it->shells_begin(); sit != vol_it->shells_end(); ++sit)
|
||||
{
|
||||
if ( (handling_unbounded_volume || sit!=vol_it->shells_begin()) && shell_is_closed(sit)) continue;
|
||||
nef_to_pm::collect_polygon_mesh_info(points,
|
||||
polygons,
|
||||
nef,
|
||||
sit,
|
||||
to_output,
|
||||
triangulate_all_faces);
|
||||
}
|
||||
handling_unbounded_volume = false;
|
||||
}
|
||||
}
|
||||
|
||||
template <class Nef_polyhedron, class Polygon_mesh>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,45 @@
|
|||
#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
|
||||
#include <CGAL/Nef_polyhedron_3.h>
|
||||
#include <CGAL/IO/Nef_polyhedron_iostream_3.h>
|
||||
#include <CGAL/boost/graph/convert_nef_polyhedron_to_polygon_mesh.h>
|
||||
#include <CGAL/boost/graph/generators.h>
|
||||
#include <CGAL/Surface_mesh.h>
|
||||
|
||||
typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel;
|
||||
typedef Kernel::Point_3 Point_3;
|
||||
typedef CGAL::Surface_mesh<Point_3> SurfaceMesh;
|
||||
typedef CGAL::Nef_polyhedron_3<Kernel> NefPolyhedron;
|
||||
|
||||
|
||||
int main()
|
||||
{
|
||||
SurfaceMesh surfaceMesh;
|
||||
SurfaceMesh::Vertex_index v0 = surfaceMesh.add_vertex(Point_3(-1, 0, 0));
|
||||
SurfaceMesh::Vertex_index v1 = surfaceMesh.add_vertex(Point_3(1, 0, 0));
|
||||
SurfaceMesh::Vertex_index v2 = surfaceMesh.add_vertex(Point_3(0, 1, 0));
|
||||
|
||||
SurfaceMesh::Vertex_index v3 = surfaceMesh.add_vertex(Point_3(-1, 0, 1));
|
||||
SurfaceMesh::Vertex_index v4 = surfaceMesh.add_vertex(Point_3(1, 0, 1));
|
||||
SurfaceMesh::Vertex_index v5 = surfaceMesh.add_vertex(Point_3(0, 1, 1));
|
||||
|
||||
surfaceMesh.add_face(v0, v1, v2);
|
||||
surfaceMesh.add_face(v3, v4, v5);
|
||||
|
||||
make_tetrahedron(Point_3(-1, 0, 10),
|
||||
Point_3(1, 0, 10),
|
||||
Point_3(0, 1, 10),
|
||||
Point_3(-1, 0, 11),
|
||||
surfaceMesh);
|
||||
|
||||
std::cout << "Before conversion, number_of_faces: " << surfaceMesh.number_of_faces() << std::endl;
|
||||
|
||||
NefPolyhedron nefPoly(surfaceMesh);
|
||||
std::cout << "NefPolyhedron, number_of_faces: " << nefPoly.number_of_facets() << std::endl;
|
||||
SurfaceMesh convertedSurfaceMesh;
|
||||
CGAL::convert_nef_polyhedron_to_polygon_mesh(nefPoly, convertedSurfaceMesh, true);
|
||||
std::cout << "After conversion, number_of_faces: " << convertedSurfaceMesh.number_of_faces() << std::endl;
|
||||
std::ofstream("out.off") << convertedSurfaceMesh;
|
||||
assert(vertices(convertedSurfaceMesh).size()==10);
|
||||
assert(faces(convertedSurfaceMesh).size()==6);
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
|
@ -14,7 +14,7 @@ create_single_source_cgal_program("issue7996.cpp")
|
|||
|
||||
#Use LAS
|
||||
#disable if MSVC 2017
|
||||
if(NOT MSVC_VERSION OR (MSVC_VERSION GREATER_EQUAL 1919 AND MSVC_VERSION LESS 1910))
|
||||
if(NOT MSVC_VERSION OR MSVC_VERSION GREATER_EQUAL 1919 OR MSVC_VERSION LESS 1910)
|
||||
find_package(LASLIB QUIET)
|
||||
include(CGAL_LASLIB_support)
|
||||
if (TARGET CGAL::LASLIB_support)
|
||||
|
|
@ -23,5 +23,5 @@ if(NOT MSVC_VERSION OR (MSVC_VERSION GREATER_EQUAL 1919 AND MSVC_VERSION LESS 1
|
|||
message(STATUS "NOTICE: the LAS reader test requires LASlib, and will not be compiled.")
|
||||
endif()
|
||||
else()
|
||||
message(STATUS "NOTICE: the LAS reader does not work with Visual Studio 2017.")
|
||||
message(STATUS "NOTICE: the LAS reader does not work with your version of Visual Studio 2017.")
|
||||
endif()
|
||||
|
|
|
|||
|
|
@ -58,7 +58,9 @@ find_package(LASLIB QUIET)
|
|||
include(CGAL_LASLIB_support)
|
||||
if(TARGET CGAL::LASLIB_support)
|
||||
create_single_source_cgal_program("read_las_example.cpp")
|
||||
create_single_source_cgal_program("write_las_example.cpp")
|
||||
target_link_libraries(read_las_example PRIVATE ${CGAL_libs} CGAL::LASLIB_support)
|
||||
target_link_libraries(write_las_example PRIVATE ${CGAL_libs} CGAL::LASLIB_support)
|
||||
else()
|
||||
message(STATUS "NOTICE: the LAS reader example requires LASlib and will not be compiled.")
|
||||
endif()
|
||||
|
|
|
|||
|
|
@ -0,0 +1,45 @@
|
|||
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
|
||||
|
||||
#include <CGAL/property_map.h>
|
||||
#include <CGAL/IO/read_las_points.h>
|
||||
#include <CGAL/IO/write_las_points.h>
|
||||
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
#include <fstream>
|
||||
|
||||
// types
|
||||
typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;
|
||||
typedef Kernel::FT FT;
|
||||
typedef Kernel::Point_3 Point;
|
||||
typedef std::array<unsigned short, 4> Color;
|
||||
typedef std::pair<Point, Color> PointWithColor;
|
||||
|
||||
int main(int argc, char*argv[])
|
||||
{
|
||||
const char* fname = "colored_points.las";
|
||||
|
||||
std::ofstream os(fname, std::ios::binary);
|
||||
|
||||
std::vector<PointWithColor> points; // store points
|
||||
points.push_back(std::make_pair(Point(0, 0, 0), Color{ 65535, 0, 0, 0 }));
|
||||
points.push_back(std::make_pair(Point(1, 0, 0), Color{ 0, 65535, 0, 0 }));
|
||||
points.push_back(std::make_pair(Point(0, 1, 0), Color{ 0, 0, 65535, 0 }));
|
||||
points.push_back(std::make_pair(Point(1, 1, 0), Color{ 0, 65535, 65535, 0 }));
|
||||
points.push_back(std::make_pair(Point(1, 1, 1), Color{ 65535, 65535, 0, 0 }));
|
||||
|
||||
// Writes a .las point set file with colors
|
||||
if(!CGAL::IO::write_LAS_with_properties(os, points,
|
||||
CGAL::IO::make_las_point_writer(CGAL::First_of_pair_property_map<PointWithColor>()),
|
||||
std::make_tuple(CGAL::Second_of_pair_property_map<PointWithColor>(),
|
||||
CGAL::IO::LAS_property::R(),
|
||||
CGAL::IO::LAS_property::G(),
|
||||
CGAL::IO::LAS_property::B(),
|
||||
CGAL::IO::LAS_property::I())))
|
||||
{
|
||||
std::cerr << "Error: cannot write file " << fname << std::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
|
@ -43,7 +43,7 @@
|
|||
# pragma GCC diagnostic ignored "-Wstrict-aliasing"
|
||||
#endif
|
||||
|
||||
#define USE_AS_DLL
|
||||
#define USE_AS_DLL 1
|
||||
#include <lasreader_las.hpp>
|
||||
#undef USE_AS_DLL
|
||||
|
||||
|
|
@ -384,7 +384,11 @@ bool read_LAS_with_properties(std::istream& is,
|
|||
if(!is)
|
||||
return false;
|
||||
|
||||
#if LAS_TOOLS_VERSION < 240319
|
||||
LASreaderLAS lasreader;
|
||||
#else
|
||||
LASreaderLAS lasreader(nullptr);
|
||||
#endif
|
||||
lasreader.open(is);
|
||||
|
||||
while(lasreader.read_point())
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@
|
|||
# pragma GCC diagnostic ignored "-Wstrict-aliasing"
|
||||
#endif
|
||||
|
||||
#define USE_AS_DLL
|
||||
#define USE_AS_DLL 1
|
||||
#include <lasdefinitions.hpp>
|
||||
#include <lasreader_las.hpp>
|
||||
#include <laswriter_las.hpp>
|
||||
|
|
@ -84,41 +84,41 @@ make_las_point_writer(PointMap point_map)
|
|||
namespace internal {
|
||||
namespace LAS {
|
||||
|
||||
inline void output_value(LASpoint& r, const unsigned short& v, LAS_property::Intensity&)
|
||||
inline void output_value(LASpoint& r, const unsigned short& v, const LAS_property::Intensity&)
|
||||
{ r.set_intensity(v); }
|
||||
inline void output_value(LASpoint& r, const unsigned char& v, LAS_property::Return_number&)
|
||||
inline void output_value(LASpoint& r, const unsigned char& v, const LAS_property::Return_number&)
|
||||
{ r.set_return_number(v); }
|
||||
inline void output_value(LASpoint& r, const unsigned char& v, LAS_property::Number_of_returns&)
|
||||
inline void output_value(LASpoint& r, const unsigned char& v, const LAS_property::Number_of_returns&)
|
||||
{ r.set_number_of_returns(v); }
|
||||
inline void output_value(LASpoint& r, const unsigned char& v, LAS_property::Scan_direction_flag&)
|
||||
inline void output_value(LASpoint& r, const unsigned char& v, const LAS_property::Scan_direction_flag&)
|
||||
{ r.set_scan_direction_flag(v); }
|
||||
inline void output_value(LASpoint& r, const unsigned char& v, LAS_property::Edge_of_flight_line&)
|
||||
inline void output_value(LASpoint& r, const unsigned char& v, const LAS_property::Edge_of_flight_line&)
|
||||
{ r.set_edge_of_flight_line(v); }
|
||||
inline void output_value(LASpoint& r, const unsigned char& v, LAS_property::Classification&)
|
||||
inline void output_value(LASpoint& r, const unsigned char& v, const LAS_property::Classification&)
|
||||
{ r.set_classification(v); }
|
||||
inline void output_value(LASpoint& r, const unsigned char& v, LAS_property::Synthetic_flag&)
|
||||
inline void output_value(LASpoint& r, const unsigned char& v, const LAS_property::Synthetic_flag&)
|
||||
{ r.set_synthetic_flag(v); }
|
||||
inline void output_value(LASpoint& r, const unsigned char& v, LAS_property::Keypoint_flag&)
|
||||
inline void output_value(LASpoint& r, const unsigned char& v, const LAS_property::Keypoint_flag&)
|
||||
{ r.set_keypoint_flag(v); }
|
||||
inline void output_value(LASpoint& r, const unsigned char& v, LAS_property::Withheld_flag&)
|
||||
inline void output_value(LASpoint& r, const unsigned char& v, const LAS_property::Withheld_flag&)
|
||||
{ r.set_withheld_flag(v); }
|
||||
inline void output_value(LASpoint& r, const float& v, LAS_property::Scan_angle&)
|
||||
inline void output_value(LASpoint& r, const float& v, const LAS_property::Scan_angle&)
|
||||
{ r.set_scan_angle_rank(char(v)); }
|
||||
inline void output_value(LASpoint& r, const unsigned char& v, LAS_property::User_data&)
|
||||
inline void output_value(LASpoint& r, const unsigned char& v, const LAS_property::User_data&)
|
||||
{ r.set_user_data(v); }
|
||||
inline void output_value(LASpoint& r, const unsigned short& v, LAS_property::Point_source_ID&)
|
||||
inline void output_value(LASpoint& r, const unsigned short& v, const LAS_property::Point_source_ID&)
|
||||
{ r.set_point_source_ID(v); }
|
||||
inline void output_value(LASpoint& r, const unsigned int& v, LAS_property::Deleted_flag&)
|
||||
inline void output_value(LASpoint& r, const unsigned int& v, const LAS_property::Deleted_flag&)
|
||||
{ r.set_deleted_flag(v); }
|
||||
inline void output_value(LASpoint& r, const double& v, LAS_property::GPS_time&)
|
||||
inline void output_value(LASpoint& r, const double& v, const LAS_property::GPS_time&)
|
||||
{ r.set_gps_time(v); }
|
||||
inline void output_value(LASpoint& r, const unsigned short& v, LAS_property::R&)
|
||||
inline void output_value(LASpoint& r, const unsigned short& v, const LAS_property::R&)
|
||||
{ r.set_R(v); }
|
||||
inline void output_value(LASpoint& r, const unsigned short& v, LAS_property::G&)
|
||||
inline void output_value(LASpoint& r, const unsigned short& v, const LAS_property::G&)
|
||||
{ r.set_G(v); }
|
||||
inline void output_value(LASpoint& r, const unsigned short& v, LAS_property::B&)
|
||||
inline void output_value(LASpoint& r, const unsigned short& v, const LAS_property::B&)
|
||||
{ r.set_B(v); }
|
||||
inline void output_value(LASpoint& r, const unsigned short& v, LAS_property::I&)
|
||||
inline void output_value(LASpoint& r, const unsigned short& v, const LAS_property::I&)
|
||||
{ r.set_I(v); }
|
||||
|
||||
template <typename ForwardIterator>
|
||||
|
|
@ -134,20 +134,57 @@ namespace LAS {
|
|||
output_value (point, get(current.first, *it), current.second);
|
||||
}
|
||||
|
||||
template<typename Value, typename Tuple, std::size_t I>
|
||||
void output_tuple(LASpoint& point, const Value& v, const Tuple& t, std::index_sequence<I>) {
|
||||
output_value(point, std::get<I>(v), std::get<I>(t));
|
||||
}
|
||||
|
||||
template<typename Value, typename Tuple, std::size_t I, std::size_t... Is>
|
||||
void output_tuple(LASpoint& point, const Value& v, const Tuple& t, std::index_sequence<I, Is...>) {
|
||||
output_value(point, std::get<I>(v), std::get<I>(t));
|
||||
output_tuple(point, v, t, std::index_sequence<Is...>());
|
||||
}
|
||||
|
||||
template <typename ForwardIterator,
|
||||
typename PropertyMap,
|
||||
typename T,
|
||||
typename NextPropertyHandler,
|
||||
typename ... PropertyHandler>
|
||||
typename PropertyMap,
|
||||
typename ... T>
|
||||
void output_properties(LASpoint& point,
|
||||
ForwardIterator it,
|
||||
std::pair<PropertyMap, T>&& current,
|
||||
NextPropertyHandler&& next,
|
||||
PropertyHandler&& ... properties)
|
||||
ForwardIterator it,
|
||||
std::tuple<PropertyMap, T ...>&& current)
|
||||
{
|
||||
output_value (point, get(current.first, *it), current.second);
|
||||
output_properties (point, it, std::forward<NextPropertyHandler>(next),
|
||||
std::forward<PropertyHandler>(properties)...);
|
||||
output_tuple(point, get(std::get<0>(current), *it), std::tuple<T ...>(), std::index_sequence_for<T ...>{});
|
||||
}
|
||||
|
||||
template <typename ForwardIterator,
|
||||
typename PropertyMap,
|
||||
typename T,
|
||||
typename NextPropertyHandler,
|
||||
typename ... PropertyHandler>
|
||||
void output_properties(LASpoint& point,
|
||||
ForwardIterator it,
|
||||
std::pair<PropertyMap, T>&& current,
|
||||
NextPropertyHandler&& next,
|
||||
PropertyHandler&& ... properties)
|
||||
{
|
||||
output_value(point, get(current.first, *it), current.second);
|
||||
output_properties(point, it, std::forward<NextPropertyHandler>(next),
|
||||
std::forward<PropertyHandler>(properties)...);
|
||||
}
|
||||
|
||||
template <typename ForwardIterator,
|
||||
typename PropertyMap,
|
||||
typename ... T,
|
||||
typename NextPropertyHandler,
|
||||
typename ... PropertyHandler>
|
||||
void output_properties(LASpoint& point,
|
||||
ForwardIterator it,
|
||||
std::tuple<PropertyMap, T ...>&& current,
|
||||
NextPropertyHandler&& next,
|
||||
PropertyHandler&& ... properties)
|
||||
{
|
||||
output_tuple(point, get(std::get<0>(current), *it), std::tuple<T ...>(), std::index_sequence_for<T ...>{});
|
||||
output_properties(point, it, std::forward<NextPropertyHandler>(next),
|
||||
std::forward<PropertyHandler>(properties)...);
|
||||
}
|
||||
|
||||
} // namespace LAS
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ create_single_source_cgal_program( "structuring_test.cpp" )
|
|||
|
||||
#Use LAS
|
||||
#disable if MSVC 2017
|
||||
if(NOT MSVC_VERSION OR (MSVC_VERSION GREATER_EQUAL 1919 AND MSVC_VERSION LESS 1910))
|
||||
if(NOT MSVC_VERSION OR MSVC_VERSION GREATER_EQUAL 1919 OR MSVC_VERSION LESS 1910)
|
||||
find_package(LASLIB QUIET)
|
||||
include(CGAL_LASLIB_support)
|
||||
if (TARGET CGAL::LASLIB_support)
|
||||
|
|
@ -43,7 +43,7 @@ if(NOT MSVC_VERSION OR (MSVC_VERSION GREATER_EQUAL 1919 AND MSVC_VERSION LESS 1
|
|||
message(STATUS "NOTICE: the LAS reader test requires LASlib and will not be compiled.")
|
||||
endif()
|
||||
else()
|
||||
message(STATUS "NOTICE: the LAS reader does not work with Visual Studio 2017.")
|
||||
message(STATUS "NOTICE: the LAS reader does not work with your version of Visual Studio 2017.")
|
||||
endif()
|
||||
|
||||
# Use Eigen
|
||||
|
|
|
|||
41
REUSE.toml
41
REUSE.toml
|
|
@ -4,13 +4,50 @@ SPDX-PackageSupplier = "CGAL Editorial Board <info@cgal.org>"
|
|||
SPDX-PackageDownloadLocation = "https://github.com/CGAL/cgal"
|
||||
|
||||
[[annotations]]
|
||||
path = [".**", "**.cmake", "**.md", ".github/**", "Maintenance/**", "**/TODO", "**/doc/**", "**/deb/**", "**/applications/**", "**/doc_html/**", "**/scripts/**", "**/developer_scripts/**", "**/demo/**", "**/examples/**", "**/src/**", "**/test/**", "**/benchmarks/**", "**/benchmark/**", "**/package_info/**", "**/data/**", "**/cmake/**"]
|
||||
path = [
|
||||
".**",
|
||||
"**.cmake",
|
||||
"**.md",
|
||||
".github/**",
|
||||
"Maintenance/**",
|
||||
"**/TODO",
|
||||
"**/doc/**",
|
||||
"**/deb/**",
|
||||
"**/applications/**",
|
||||
"**/doc_html/**",
|
||||
"**/scripts/**",
|
||||
"**/developer_scripts/**",
|
||||
"**/demo/**",
|
||||
"**/examples/**",
|
||||
"**/src/**",
|
||||
"**/test/**",
|
||||
"**/benchmarks/**",
|
||||
"**/benchmark/**",
|
||||
"**/package_info/**",
|
||||
"**/data/**",
|
||||
"**/cmake/**",
|
||||
"**/*.natvis",
|
||||
]
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "1995-2024 The CGAL Project"
|
||||
SPDX-License-Identifier = "CC0-1.0"
|
||||
|
||||
[[annotations]]
|
||||
path = ["REUSE.toml", "CMakeLists.txt", "cmake_uninstall.cmake.in", "GraphicsView/include/CGAL/Qt/ImageInterface.ui", "GraphicsView/include/CGAL/Qt/resources/qglviewer-icon.xpm", "Installation/AUTHORS", "Installation/CMakeLists.txt", "Installation/README", "Installation/auxiliary/cgal_create_cmake_script.1", "Installation/auxiliary/gmp/README", "Installation/include/CGAL/license/gpl_package_list.txt", "MacOSX/auxiliary/cgal_app.icns", "copyright"]
|
||||
path = [
|
||||
"REUSE.toml",
|
||||
"CMakeLists.txt",
|
||||
"cmake_uninstall.cmake.in",
|
||||
"GraphicsView/include/CGAL/Qt/ImageInterface.ui",
|
||||
"GraphicsView/include/CGAL/Qt/resources/qglviewer-icon.xpm",
|
||||
"Installation/AUTHORS",
|
||||
"Installation/CMakeLists.txt",
|
||||
"Installation/README",
|
||||
"Installation/auxiliary/cgal_create_cmake_script.1",
|
||||
"Installation/auxiliary/gmp/README",
|
||||
"Installation/include/CGAL/license/gpl_package_list.txt",
|
||||
"MacOSX/auxiliary/cgal_app.icns",
|
||||
"copyright",
|
||||
]
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "1995-2024 The CGAL Project"
|
||||
SPDX-License-Identifier = "CC0-1.0"
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@ functions of the package are provided in Section \ref Ridges_3Examples.
|
|||
For a detailed introduction to ridges and related topics, the reader
|
||||
may consult
|
||||
\cgalCite{cgal:hgygm-ttdpf-99},\cgalCite{cgal:p-gd-01}, as well as
|
||||
the following survey article \cgalCite{cgal:cp-ssulc-05}.
|
||||
the survey article \cgalCite{cgal:cp-ssulc-05}.
|
||||
In the sequel, we just introduce the basic notions so as to explain
|
||||
our algorithms. Consider a smooth embedded surface, and denote \f$ k_1\f$
|
||||
and \f$ k_2\f$ the principal curvatures, with \f$ k_1\geq k_2\f$. Umbilics are
|
||||
|
|
@ -399,7 +399,7 @@ neighborhood.
|
|||
\subsection Ridges_3Exampleprogram Example Program
|
||||
|
||||
The following program computes ridges and umbilics from an off
|
||||
file.\cgalFootnote{Model data may be downloaded via ftp://ftp.mpi-sb.mpg.de/pub/outgoing/CGAL/Ridges_3_datafiles.tgz . The mechanical part model has been provided courtesy of Dassault System to produce \cgalFigureRef{figmechanical_crest_filteredintro}, due to copyright issues the available model is not the same, it is provided by the AIM\@SHAPE Shape Repository.} It uses the package \ref PkgJetFitting3 to estimate the differential
|
||||
file. It uses the package \ref PkgJetFitting3 to estimate the differential
|
||||
quantities.
|
||||
The default output file gives rough data for visualization purpose, a
|
||||
verbose output file may also be asked for. Parameters are
|
||||
|
|
@ -533,11 +533,7 @@ Ridges on the ellipsoid, normals pointing outward. Color coding :
|
|||
\subsection Ridges_3ExampleFilteringofCrestRidgesona Example: Filtering of Crest Ridges on a Mechanical Part
|
||||
|
||||
\cgalFigureRef{figmechanical_crest_filteredintro} illustrates the filtering
|
||||
of crest ridges on a mechanical model, and has been computed as follows:
|
||||
|
||||
\code{.cpp}
|
||||
./Compute_Ridges_Umbilics -f data/mecanic.off -d 4 -m 4 -a 4 -t 4
|
||||
\endcode
|
||||
of crest ridges on a mechanical model.
|
||||
|
||||
\cgalFigureBegin{figmechanical_crest_filteredintro,mecanic-sub1_crest-jpg.png}
|
||||
Mechanical part (37k pts). Left: All crest lines. Middle: crests filtered
|
||||
|
|
|
|||
|
|
@ -26,9 +26,8 @@ creationpath = args.creationpath
|
|||
|
||||
doxystring = \
|
||||
r"""@INCLUDE = ${CGAL_DOC_PACKAGE_DEFAULTS}
|
||||
|
||||
PROJECT_NAME = "CGAL ${CGAL_DOC_VERSION} - Put title of project here"
|
||||
INPUT = ${CMAKE_SOURCE_DIR}/PACKAGENAME/doc/PACKAGENAME/ \
|
||||
${CMAKE_SOURCE_DIR}/PACKAGENAME/include
|
||||
"""
|
||||
|
||||
descrstring = \
|
||||
|
|
|
|||
|
|
@ -323,6 +323,9 @@ if [ -n "$DO_PUBLIC" ]; then
|
|||
zip -q -r ${public_release_name}-library.zip ${public_release_name}
|
||||
mv ${public_release_name}*.tar.xz "${HTML_DIR}/${release_name}-public/"
|
||||
mv ${public_release_name}*.zip "${HTML_DIR}/${release_name}-public/"
|
||||
if command -v sestatus >/dev/null 2>&1; then
|
||||
sestatus && restorecon -R "${HTML_DIR}/${release_name}-public"
|
||||
fi
|
||||
rm -f "$HTML_DIR/CGAL-last-public"
|
||||
ln -s "${release_name}-public" "$HTML_DIR/CGAL-last-public"
|
||||
fi
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ cd /home/cgal-testsuite
|
|||
|
||||
# Rotate log files on one month: the logfile name contains the number of
|
||||
# the day
|
||||
LOGFILE=$PWD/doxygen_testsuite-`date '+%d'`.log
|
||||
LOGFILE=$PWD/doxygen_testsuite-$(date '+%d').log
|
||||
|
||||
exec > "$LOGFILE"
|
||||
|
||||
|
|
@ -39,8 +39,8 @@ if [ -r "${CGAL_DOC_BUILD}" ]; then
|
|||
rm -rf "${CGAL_DOC_BUILD}"
|
||||
fi
|
||||
|
||||
mkdir ${CGAL_DOC_BUILD}
|
||||
cd ${CGAL_DOC_BUILD}
|
||||
mkdir "${CGAL_DOC_BUILD}"
|
||||
cd "${CGAL_DOC_BUILD}"
|
||||
|
||||
if [ -r "LATEST" ]; then
|
||||
rm -rf LATEST
|
||||
|
|
@ -52,12 +52,12 @@ if [ ! -f "LATEST" ]; then
|
|||
error "COULD NOT DOWNLOAD LATEST!"
|
||||
fi
|
||||
|
||||
for i in `cat LATEST`
|
||||
for i in $(cat LATEST)
|
||||
do
|
||||
CGAL_LOCATION="${CGAL_URL}/${i}";
|
||||
CGAL_ZIPFILE="${i}";
|
||||
done
|
||||
CGAL_RELEASE_ID=`echo $CGAL_ZIPFILE | sed "s/.tar.gz//"`
|
||||
CGAL_RELEASE_ID=$(echo "$CGAL_ZIPFILE" | sed "s/.tar.gz//")
|
||||
|
||||
curl ${CURL_OPTS} "${CGAL_LOCATION}"
|
||||
tar xvzf "${CGAL_ZIPFILE}" && rm "${CGAL_ZIPFILE}"
|
||||
|
|
@ -68,11 +68,16 @@ cd "${CGAL_RELEASE_ID}"
|
|||
|
||||
PATH=/home/cgal-testsuite/local/bin:$PATH
|
||||
export PATH
|
||||
cd "$PWD/doc/scripts"
|
||||
cd "${PWD}/doc/scripts"
|
||||
bash -$- ./process_doc.sh /home/cgal-testsuite/bin/doxygen_1_8_13 /home/cgal-testsuite/bin/doxygen_1_9_6 /srv/CGAL/www/Members/Manual_doxygen_test
|
||||
if head -2 ../../.scm-branch | grep -q cgal/master; then
|
||||
rsync -a --delete "/srv/CGAL/www/Members/Manual_doxygen_test/${CGAL_RELEASE_ID}/output2/" /srv/CGAL/www/doc/master/
|
||||
fi
|
||||
if sestatus &>/dev/null && [ -d "/srv/CGAL/www/doc/master/" ] && [ -d "/srv/CGAL/www/Members/Manual_doxygen_test/${CGAL_RELEASE_ID}" ]; then
|
||||
restorecon -R /srv/CGAL/www/doc/master/ /srv/CGAL/www/Members/Manual_doxygen_test/${CGAL_RELEASE_ID} || error "restorecon command failed"
|
||||
else
|
||||
error "SELinux is not enabled or the paths do not exist"
|
||||
fi
|
||||
rm -rf "${CGAL_DOC_BUILD}"
|
||||
# Then gzip the log file, to save space
|
||||
exec
|
||||
|
|
|
|||
|
|
@ -13,6 +13,9 @@ find_library(
|
|||
NAMES 3MF
|
||||
DOC "Path to the lib3MF library")
|
||||
|
||||
find_package(LASLIB QUIET)
|
||||
include(CGAL_LASLIB_support)
|
||||
|
||||
# create a target per cppfile
|
||||
file(
|
||||
GLOB cppfiles
|
||||
|
|
@ -30,6 +33,15 @@ foreach(cppfile ${cppfiles})
|
|||
message(STATUS "NOTICE: Some tests require the lib3MF library, and will not be compiled.")
|
||||
endif()
|
||||
else()
|
||||
create_single_source_cgal_program("${cppfile}")
|
||||
if("${cppfile}" STREQUAL "test_LAS.cpp")
|
||||
if(TARGET CGAL::LASLIB_support)
|
||||
create_single_source_cgal_program("test_LAS.cpp")
|
||||
target_link_libraries(test_LAS PRIVATE CGAL::LASLIB_support)
|
||||
else()
|
||||
message(STATUS "NOTICE: Some tests require the LASlib library, and will not be compiled.")
|
||||
endif()
|
||||
else()
|
||||
create_single_source_cgal_program("${cppfile}")
|
||||
endif()
|
||||
endif()
|
||||
endforeach()
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -0,0 +1,16 @@
|
|||
ply
|
||||
format ascii 1.0
|
||||
comment VCGLIB generated
|
||||
element vertex 3
|
||||
property float x
|
||||
property float y
|
||||
property float z
|
||||
property float nx
|
||||
property float ny
|
||||
property float nz
|
||||
element face 0
|
||||
property list uchar int vertex_indices
|
||||
end_header
|
||||
1 1 1 2 2 2
|
||||
3 3 3 4 4 4
|
||||
5 5 5 6 6 6
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
#include <CGAL/Simple_cartesian.h>
|
||||
|
||||
#include <CGAL/config.h>
|
||||
#include <CGAL/IO/read_ply_points.h>
|
||||
#include <CGAL/property_map.h>
|
||||
#include <boost/iterator/function_output_iterator.hpp>
|
||||
|
||||
#include <cassert>
|
||||
#include <fstream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
typedef CGAL::Simple_cartesian<double> Kernel;
|
||||
typedef Kernel::FT FT;
|
||||
typedef Kernel::Point_3 Point_3;
|
||||
typedef Kernel::Vector_3 Vector_3;
|
||||
typedef std::pair<Point_3, Vector_3> PointVectorPair;
|
||||
typedef CGAL::First_of_pair_property_map<PointVectorPair> Point_map;
|
||||
typedef CGAL::Second_of_pair_property_map<PointVectorPair> Normal_map;
|
||||
|
||||
int main()
|
||||
{
|
||||
std::vector<PointVectorPair> pv_pairs;
|
||||
const std::function<void(const PointVectorPair& p)> lambda =
|
||||
[&](const PointVectorPair& p) {
|
||||
FT len = p.second.squared_length();
|
||||
if (len > 0 || len != 1.0) {
|
||||
Vector_3 n = p.second * (1.0 / CGAL::sqrt(len));
|
||||
pv_pairs.push_back(std::make_pair(p.first, n));
|
||||
}
|
||||
else pv_pairs.push_back(p);
|
||||
};
|
||||
|
||||
pv_pairs.clear();
|
||||
std::ifstream file("data/simple_ascii.ply");
|
||||
CGAL::IO::read_PLY_with_properties<PointVectorPair>(file, boost::function_output_iterator(lambda),
|
||||
CGAL::make_ply_point_reader(Point_map()),
|
||||
CGAL::make_ply_normal_reader(Normal_map()));
|
||||
|
||||
assert(pv_pairs[0].first == Point_3(1, 1, 1));
|
||||
assert(pv_pairs[1].first == Point_3(3, 3, 3));
|
||||
assert(pv_pairs[2].first == Point_3(5, 5, 5));
|
||||
|
||||
for (std::size_t i = 0; i < pv_pairs.size(); i++) {
|
||||
FT dev = CGAL::abs(1.0 - pv_pairs[i].second.squared_length());
|
||||
assert(dev < 0.01);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -0,0 +1,63 @@
|
|||
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
|
||||
|
||||
#include <CGAL/property_map.h>
|
||||
#include <CGAL/IO/read_las_points.h>
|
||||
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
#include <fstream>
|
||||
|
||||
// types
|
||||
typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;
|
||||
typedef Kernel::FT FT;
|
||||
typedef Kernel::Point_3 Point;
|
||||
typedef std::array<unsigned short, 4> Color;
|
||||
typedef std::pair<Point, Color> PointWithColor;
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
std::ifstream is("data/colored_points.las");
|
||||
|
||||
// Reads a .las point set file with normal vectors and colors
|
||||
std::vector<PointWithColor> points; // store points
|
||||
if (!CGAL::IO::read_LAS_with_properties(is, std::back_inserter(points),
|
||||
CGAL::IO::make_las_point_reader(CGAL::First_of_pair_property_map<PointWithColor>()),
|
||||
std::make_tuple(CGAL::Second_of_pair_property_map<PointWithColor>(),
|
||||
CGAL::Construct_array(),
|
||||
CGAL::IO::LAS_property::R(),
|
||||
CGAL::IO::LAS_property::G(),
|
||||
CGAL::IO::LAS_property::B(),
|
||||
CGAL::IO::LAS_property::I())))
|
||||
{
|
||||
std::cerr << "Error: cannot read file data/colored_points.las" << std::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
CGAL_assertion(points.size() == 5);
|
||||
CGAL_assertion(points[0].second[0] == 65535);
|
||||
CGAL_assertion(points[0].second[1] == 0);
|
||||
CGAL_assertion(points[0].second[2] == 0);
|
||||
CGAL_assertion(points[0].second[3] == 0);
|
||||
|
||||
CGAL_assertion(points[1].second[0] == 0);
|
||||
CGAL_assertion(points[1].second[1] == 65535);
|
||||
CGAL_assertion(points[1].second[2] == 0);
|
||||
CGAL_assertion(points[1].second[3] == 0);
|
||||
|
||||
CGAL_assertion(points[2].second[0] == 0);
|
||||
CGAL_assertion(points[2].second[1] == 0);
|
||||
CGAL_assertion(points[2].second[2] == 65535);
|
||||
CGAL_assertion(points[2].second[3] == 0);
|
||||
|
||||
CGAL_assertion(points[3].second[0] == 0);
|
||||
CGAL_assertion(points[3].second[1] == 65535);
|
||||
CGAL_assertion(points[3].second[2] == 65535);
|
||||
CGAL_assertion(points[3].second[3] == 0);
|
||||
|
||||
CGAL_assertion(points[4].second[0] == 65535);
|
||||
CGAL_assertion(points[4].second[1] == 65535);
|
||||
CGAL_assertion(points[4].second[2] == 0);
|
||||
CGAL_assertion(points[4].second[3] == 0);
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
|
@ -234,7 +234,7 @@ private:
|
|||
// If the target is a corner vertex, we have the complete length of a side in 'len'
|
||||
// and we must "normalize" the previous entries
|
||||
if(get(vpmap, vt)) {
|
||||
// If both extremeties of a segment are corners, offsets are already correct
|
||||
// If both extremities of a segment are corners, offsets are already correct
|
||||
if(!get(vpmap, vs)) {
|
||||
CGAL_assertion(len != 0.0);
|
||||
double ld = 1.0 / len;
|
||||
|
|
|
|||
|
|
@ -156,7 +156,7 @@ setting the named parameter `remesh_boundaries` to `false`.
|
|||
|
||||
It is also possible to define the polyline features as the ones
|
||||
stored as complex edges in a `Mesh_complex_3_in_triangulation_3`
|
||||
(e.g., generated by the \ref PkgMesh3 package mesh generation algorithms).
|
||||
(e.g., generated by the \ref PkgMesh3 package).
|
||||
|
||||
\cgalExample{Tetrahedral_remeshing/mesh_and_remesh_c3t3.cpp }
|
||||
|
||||
|
|
|
|||
|
|
@ -52,12 +52,7 @@ public :
|
|||
:x(p_x), y(p_y), z(p_z),_3D(p_3D), _is_always_visible(always_visible), m_text(p_text), m_font(font), m_color(p_color)
|
||||
{
|
||||
QFontMetrics fm(m_font);
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)
|
||||
_width = float(fm.horizontalAdvance(m_text)+2);
|
||||
#else
|
||||
_width = float(fm.width(m_text)+2);
|
||||
#endif
|
||||
|
||||
_height = float(fm.height());
|
||||
}
|
||||
//!\brief Accessor for the string
|
||||
|
|
|
|||
|
|
@ -31,11 +31,7 @@
|
|||
# define THREE_EXPORT Q_DECL_IMPORT
|
||||
#endif
|
||||
|
||||
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
|
||||
#define CGAL_QT_SKIP_EMPTY_PARTS QString::SkipEmptyParts
|
||||
#else
|
||||
#define CGAL_QT_SKIP_EMPTY_PARTS ::Qt::SkipEmptyParts
|
||||
#endif
|
||||
|
||||
namespace CGAL{
|
||||
namespace Three{
|
||||
|
|
|
|||
Loading…
Reference in New Issue