mirror of https://github.com/CGAL/cgal
correction of 1 dimensional features
adaption of pluecker lines to the extended kernel`
This commit is contained in:
parent
a9246f757a
commit
ad5506d214
|
|
@ -33,6 +33,7 @@
|
|||
#include <CGAL/basic.h>
|
||||
#include <CGAL/Gmpz.h>
|
||||
#include <CGAL/Simple_homogeneous.h>
|
||||
#include <CGAL/Extended_homogeneous_3.h>
|
||||
#include <CGAL/Polyhedron_3.h>
|
||||
#include <CGAL/IO/Polyhedron_iostream.h>
|
||||
|
||||
|
|
@ -52,8 +53,11 @@ using std::strcmp;
|
|||
using std::exit;
|
||||
|
||||
// Types
|
||||
typedef CGAL::Gmpz NT;
|
||||
typedef CGAL::Simple_homogeneous<NT> Kernel;
|
||||
typedef CGAL::Gmpz NT;
|
||||
//typedef CGAL::Simple_homogeneous<NT> Kernel;
|
||||
|
||||
typedef CGAL::Extended_homogeneous_3<NT> Kernel;
|
||||
// struct Kernel : public CGAL::Extended_homogeneous_3<NT> {};
|
||||
typedef CGAL::Polyhedron_3<Kernel> Polyhedron;
|
||||
|
||||
typedef CGAL::SNC_items<Kernel, bool> SNC_items;
|
||||
|
|
@ -212,8 +216,8 @@ int eval( int argc, char* argv[]) {
|
|||
<< argv[i+1] << "' correctly." << endl;
|
||||
error = 5;
|
||||
} else {
|
||||
Nef_polyhedron nf(poly);
|
||||
nef.push_back( nf);
|
||||
Nef_polyhedron nf(poly);
|
||||
nef.push_back( nf);
|
||||
}
|
||||
}
|
||||
++i;
|
||||
|
|
@ -289,6 +293,7 @@ int eval( int argc, char* argv[]) {
|
|||
} else {
|
||||
error = 4;
|
||||
}
|
||||
|
||||
} else if ( strcmp( argv[i], "scale") == 0) {
|
||||
if ( nef.size() == 0) {
|
||||
cerr << "Error: '" << argv[i] << "' on empty stack." << endl;
|
||||
|
|
@ -386,7 +391,6 @@ int eval( int argc, char* argv[]) {
|
|||
error = 2;
|
||||
continue;
|
||||
}
|
||||
cerr << "inters" << std::endl;
|
||||
Nef_polyhedron nf1 = nef.back();
|
||||
nef.pop_back();
|
||||
Nef_polyhedron nf2 = nef.back();
|
||||
|
|
|
|||
|
|
@ -53,15 +53,16 @@ class Pluecker_line_3 {
|
|||
typedef R_ R;
|
||||
/*{\Mtypemember the standard kernel type.}*/
|
||||
typedef typename R::RT RT;
|
||||
typedef typename RT::NT NT;
|
||||
/*{\Mtypemember the ring type.}*/
|
||||
typedef typename R::Point_3 Point_3;
|
||||
/*{\Mtypemember the point type of the standard kernel.}*/
|
||||
typedef typename R::Line_3 Line_3;
|
||||
/*{\Mtypemember the line type of the standard kernel.}*/
|
||||
typedef const RT* const_iterator;
|
||||
typedef const NT* const_iterator;
|
||||
/*{\Mtypemember iterator over Pluecker coefficients.}*/
|
||||
typedef Pluecker_line_3<R> Self;
|
||||
RT c_[6];
|
||||
NT c_[6];
|
||||
|
||||
public:
|
||||
/*{\Mcreation 3}*/
|
||||
|
|
@ -73,25 +74,28 @@ Pluecker_line_3(const Line_3& l)
|
|||
/*{\Mcreate creates an instance |\Mvar| of type |\Mname| and
|
||||
initializes it to |l|.}*/
|
||||
{
|
||||
TRACEN("Vorsicht");
|
||||
Point_3 p(l.point(0)), q(l.point(1));
|
||||
c_[0] = p.hx()*q.hy() - p.hy()*q.hx();
|
||||
c_[1] = p.hx()*q.hz() - p.hz()*q.hx();
|
||||
c_[2] = p.hy()*q.hz() - p.hz()*q.hy();
|
||||
c_[3] = p.hx()*q.hw() - p.hw()*q.hx();
|
||||
c_[4] = p.hy()*q.hw() - p.hw()*q.hy();
|
||||
c_[5] = p.hz()*q.hw() - p.hw()*q.hz();
|
||||
c_[0] = (p.hx()*q.hy() - p.hy()*q.hx()).eval_at(1);
|
||||
c_[1] = (p.hx()*q.hz() - p.hz()*q.hx()).eval_at(1);
|
||||
c_[2] = (p.hy()*q.hz() - p.hz()*q.hy()).eval_at(1);
|
||||
c_[3] = (p.hx()*q.hw() - p.hw()*q.hx()).eval_at(1);
|
||||
c_[4] = (p.hy()*q.hw() - p.hw()*q.hy()).eval_at(1);
|
||||
c_[5] = (p.hz()*q.hw() - p.hw()*q.hz()).eval_at(1);
|
||||
}
|
||||
|
||||
Pluecker_line_3(const Point_3& p, const Point_3& q)
|
||||
/*{\Mcreate creates an instance |\Mvar| of type |\Mname| and
|
||||
initializes it to the oriented line through |p| and |q|.}*/
|
||||
{
|
||||
c_[0] = p.hx()*q.hy() - p.hy()*q.hx();
|
||||
c_[1] = p.hx()*q.hz() - p.hz()*q.hx();
|
||||
c_[2] = p.hy()*q.hz() - p.hz()*q.hy();
|
||||
c_[3] = p.hx()*q.hw() - p.hw()*q.hx();
|
||||
c_[4] = p.hy()*q.hw() - p.hw()*q.hy();
|
||||
c_[5] = p.hz()*q.hw() - p.hw()*q.hz();
|
||||
TRACEN("Pluecker");
|
||||
|
||||
c_[0] = (p.hx()*q.hy() - p.hy()*q.hx()).eval_at(1);
|
||||
c_[1] = (p.hx()*q.hz() - p.hz()*q.hx()).eval_at(1);
|
||||
c_[2] = (p.hy()*q.hz() - p.hz()*q.hy()).eval_at(1);
|
||||
c_[3] = (p.hx()*q.hw() - p.hw()*q.hx()).eval_at(1);
|
||||
c_[4] = (p.hy()*q.hw() - p.hw()*q.hy()).eval_at(1);
|
||||
c_[5] = (p.hz()*q.hw() - p.hw()*q.hz()).eval_at(1);
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -120,7 +124,7 @@ Self& operator=(const Self& l)
|
|||
{ if (&l!=this) std::copy(l.begin(),l.end(),c_);
|
||||
return *this; }
|
||||
|
||||
const RT& operator[](unsigned i) const
|
||||
const NT& operator[](unsigned i) const
|
||||
/*{\Marrop returns constant access to the $i$th Pluecker coefficient.}*/
|
||||
{ CGAL_assertion(i<6); return c_[i]; }
|
||||
|
||||
|
|
@ -137,19 +141,21 @@ void normalize()
|
|||
representation. This is done by dividing all Pluecker
|
||||
coefficients by their common gcd.}*/
|
||||
{
|
||||
TRACEN("normalize");
|
||||
int i=0;
|
||||
while(i<6 && c_[i]==0)
|
||||
i++;
|
||||
|
||||
|
||||
if(i>5)
|
||||
return;
|
||||
|
||||
RT D = c_[i];
|
||||
NT D = c_[i];
|
||||
CGAL_assertion(D!=0);
|
||||
|
||||
for(++i; i<6; ++i)
|
||||
D = (c_[i]==0 ? D : CGAL_NTS gcd(D, c_[i]));
|
||||
if (D==0) return;
|
||||
TRACEN("gcd" << D);
|
||||
for(int i=0; i<6; ++i) c_[i]/=D;
|
||||
}
|
||||
|
||||
|
|
@ -160,7 +166,7 @@ void negate()
|
|||
Pluecker_line_3<R> opposite() const
|
||||
/*{\Mop returns the line opposite to |\Mvar|. }*/
|
||||
{ Pluecker_line_3<R> res;
|
||||
std::negate<RT> N;
|
||||
std::negate<NT> N;
|
||||
std::transform(begin(), end(), res.c_, N);
|
||||
return res;
|
||||
}
|
||||
|
|
@ -170,8 +176,8 @@ static int cmp(const Pluecker_line_3<R>& l1,
|
|||
/*{\Mstatic returns the lexicographic order on lines defined
|
||||
on their Pluecker coefficient tuples.}*/
|
||||
{ for (unsigned i=0; i<5; ++i) {
|
||||
typename R::RT diff = l1[i]-l2[i];
|
||||
if ( diff != typename R::RT(0) ) return CGAL_NTS sign(diff);
|
||||
typename R::RT::NT diff = l1[i]-l2[i];
|
||||
if ( diff != typename R::RT::NT(0) ) return CGAL_NTS sign(diff);
|
||||
}
|
||||
return CGAL_NTS sign(l1[5]-l2[5]);
|
||||
}
|
||||
|
|
@ -179,7 +185,7 @@ on their Pluecker coefficient tuples.}*/
|
|||
}; // Pluecker_line_3
|
||||
|
||||
/*{\Mimplementation The Pluecker coefficients of a line are stored
|
||||
in a six-tuple of |RT| coefficients.}*/
|
||||
in a six-tuple of |NT| coefficients.}*/
|
||||
|
||||
|
||||
template <typename R>
|
||||
|
|
|
|||
|
|
@ -859,6 +859,10 @@ subdivide(Vertex_handle v0, Vertex_handle v1)
|
|||
merge_halfsphere_maps(svertices_begin(),v,O);
|
||||
check_integrity_and_topological_planarity();
|
||||
|
||||
TRACEN("subdivided");
|
||||
CGAL_nef3_forall_svertices(v,*this) {
|
||||
TRACEN(PH(v));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -873,8 +877,9 @@ partition_to_halfsphere(Iterator start, Iterator beyond, Seg_list& L,
|
|||
Sphere_circle xycircle(0,0,pos);
|
||||
while ( start != beyond ) {
|
||||
int i = start->intersection(xycircle,s1,s2);
|
||||
if (i>1) { L.push_back(s2); M[--L.end()] = M[start]; }
|
||||
if (i>0) { L.push_back(s1); M[--L.end()] = M[start]; }
|
||||
TRACEN("segment " << start->source() << " " << start->target());
|
||||
if (i>1) { L.push_back(s2); M[--L.end()] = M[start]; TRACEN(">1 " << s2.source() << " " << s2.target()); }
|
||||
if (i>0) { L.push_back(s1); M[--L.end()] = M[start]; TRACEN(">0 " << s1.source() << " " << s1.target()); }
|
||||
++start;
|
||||
}
|
||||
// now all segments are split into hemispheres
|
||||
|
|
@ -889,17 +894,20 @@ partition_to_halfsphere(Iterator start, Iterator beyond, Seg_list& L,
|
|||
CGAL_nef3_forall_iterators(it,L) { TRACEN(" "<<*it);
|
||||
if ( equal_as_sets(it->sphere_circle(),xycircle) ) {
|
||||
TRACEN(" splitting xy seg "<<*it);
|
||||
bool added=false;
|
||||
int n1 = it->intersection(yzcircle,s1,s2);
|
||||
if (n1 > 1 && !s2.is_degenerate())
|
||||
{ M[ L.insert(it,s2) ] = M[it]; }
|
||||
{ M[ L.insert(it,s2) ] = M[it]; added=true; TRACEN(">1 " << s2.source() << " " << s2.target()); }
|
||||
if (n1 > 0 && !s1.is_degenerate())
|
||||
{ M[ L.insert(it,s1) ] = M[it]; }
|
||||
{ M[ L.insert(it,s1) ] = M[it]; added = true; TRACEN(">1 " << s1.source() << " " << s1.target()); }
|
||||
int n2 = it->intersection(yzcircle.opposite(),s1,s2);
|
||||
if (n2 > 1 && !s2.is_degenerate())
|
||||
{ M[ L.insert(it,s2) ] = M[it]; }
|
||||
{ M[ L.insert(it,s2) ] = M[it]; added=true; TRACEN(">1 " << s2.source() << " " << s2.target()); }
|
||||
if (n2 > 0 && !s1.is_degenerate())
|
||||
{ M[ L.insert(it,s1) ] = M[it]; }
|
||||
itl = it; --it; L.erase(itl); M[itl] = T();
|
||||
{ M[ L.insert(it,s1) ] = M[it]; added=true; TRACEN(">1 " << s1.source() << " " << s1.target()); }
|
||||
if(added) {
|
||||
itl = it; --it; L.erase(itl); M[itl] = T();
|
||||
}
|
||||
// at least one item was appended
|
||||
}
|
||||
}
|
||||
|
|
@ -1000,7 +1008,6 @@ complete_face_support(SVertex_iterator v_start, SVertex_iterator v_end,
|
|||
if(supp_object(e,i) != NULL)
|
||||
break;
|
||||
}
|
||||
|
||||
if(supp_object(e,i) != NULL) {
|
||||
SHalfedge_handle ei;
|
||||
if ( assign(ei,supp_object(e,i)) ) {
|
||||
|
|
@ -1035,7 +1042,7 @@ complete_face_support(SVertex_iterator v_start, SVertex_iterator v_end,
|
|||
|
||||
for (int i=0; i<2; ++i) {
|
||||
SObject_handle o = supp_object(v,i);
|
||||
if ( o == NULL ) { mark(v,i) = m_buffer[i]; continue; }
|
||||
if ( o == NULL ) { TRACEN("no vertex support"); mark(v,i) = m_buffer[i]; continue; }
|
||||
SVertex_handle vs;
|
||||
SHalfedge_handle es;
|
||||
SHalfloop_handle ls;
|
||||
|
|
@ -1235,7 +1242,9 @@ select(const Selection& SP) const
|
|||
template <typename Refs_>
|
||||
void SNC_SM_overlayer<Refs_>::simplify() const
|
||||
{
|
||||
|
||||
TRACEN("simplifying");
|
||||
|
||||
/* typedef typename CGAL::Partition<SFace_handle>::item partition_item;
|
||||
CGAL::Unique_hash_map<SFace_handle,partition_item> Pitem;
|
||||
CGAL::Partition<SFace_handle> FP; */
|
||||
|
|
@ -1257,33 +1266,17 @@ void SNC_SM_overlayer<Refs_>::simplify() const
|
|||
TRACEN("deleting "<<PH(e));
|
||||
if ( !UF.same_set(Pitem[face(e)],
|
||||
Pitem[face(twin(e))]) ) {
|
||||
|
||||
UF.unify_sets( Pitem[face(e)],
|
||||
Pitem[face(twin(e))] );
|
||||
TRACEN("unioning disjoint faces");
|
||||
}
|
||||
if ( is_closed_at_source(e) )
|
||||
if ( is_closed_at_source(e) )
|
||||
set_face(source(e),face(e));
|
||||
if ( is_closed_at_source(twin(e)) )
|
||||
if ( is_closed_at_source(twin(e)))
|
||||
set_face(target(e),face(e));
|
||||
delete_edge_pair(e);
|
||||
}
|
||||
|
||||
SVertex_handle v;
|
||||
CGAL_nef3_forall_svertices(v,*this)
|
||||
TRACEN(PH(v) << " " << mark(v));
|
||||
TRACEN(" ");
|
||||
|
||||
|
||||
SHalfedge_handle e;
|
||||
CGAL_nef3_forall_shalfedges(e,*this)
|
||||
TRACEN(PH(e)<< " " << mark(e));
|
||||
TRACEN(" ");
|
||||
|
||||
SFace_handle ff;
|
||||
CGAL_nef3_forall_sfaces(ff,*this)
|
||||
TRACEN(&*ff << " " << mark(ff));
|
||||
TRACEN(" ");
|
||||
|
||||
}
|
||||
|
||||
CGAL::Unique_hash_map<SHalfedge_handle,bool> linked(false);
|
||||
|
|
@ -1302,21 +1295,6 @@ void SNC_SM_overlayer<Refs_>::simplify() const
|
|||
link_as_loop(twin(l),f);
|
||||
}
|
||||
|
||||
SVertex_handle vi;
|
||||
CGAL_nef3_forall_svertices(vi,*this)
|
||||
TRACEN(PH(vi) << " " << mark(vi));
|
||||
TRACEN(" ");
|
||||
|
||||
SHalfedge_handle ei;
|
||||
CGAL_nef3_forall_shalfedges(ei,*this)
|
||||
TRACEN(PH(ei)<< " " << mark(ei));
|
||||
TRACEN(" ");
|
||||
|
||||
SFace_handle ff;
|
||||
CGAL_nef3_forall_sfaces(ff,*this)
|
||||
TRACEN(&*ff << " " << mark(ff));
|
||||
TRACEN(" ");
|
||||
|
||||
SVertex_iterator v,vn;
|
||||
for(v = svertices_begin(); v != svertices_end(); v=vn) {
|
||||
vn=v; ++vn;
|
||||
|
|
@ -1338,23 +1316,6 @@ void SNC_SM_overlayer<Refs_>::simplify() const
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
CGAL_nef3_forall_svertices(vi,*this)
|
||||
TRACEN(PH(vi) << " " << mark(vi));
|
||||
TRACEN(" ");
|
||||
|
||||
|
||||
CGAL_nef3_forall_shalfedges(ei,*this)
|
||||
TRACEN(PH(ei)<< " " << mark(ei));
|
||||
TRACEN(" ");
|
||||
|
||||
|
||||
|
||||
CGAL_nef3_forall_sfaces(ff,*this)
|
||||
TRACEN(&*ff << " " << mark(ff));
|
||||
TRACEN(" ");
|
||||
|
||||
SFace_iterator fn;
|
||||
for (f = fn = sfaces_begin(); f != sfaces_end(); f=fn) {
|
||||
++fn;
|
||||
|
|
@ -1363,22 +1324,6 @@ void SNC_SM_overlayer<Refs_>::simplify() const
|
|||
delete_face_only(f);
|
||||
}
|
||||
|
||||
|
||||
CGAL_nef3_forall_svertices(vi,*this)
|
||||
TRACEN(PH(vi) << " " << mark(vi));
|
||||
TRACEN(" ");
|
||||
|
||||
|
||||
CGAL_nef3_forall_shalfedges(ei,*this)
|
||||
TRACEN(PH(ei)<< " " << mark(ei));
|
||||
TRACEN(" ");
|
||||
|
||||
|
||||
|
||||
CGAL_nef3_forall_sfaces(ff,*this)
|
||||
TRACEN(&*ff << " " << mark(ff));
|
||||
TRACEN(" ");
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -456,7 +456,12 @@ void SNC_SM_point_locator<D>::init_marks_of_halfspheres()
|
|||
else mark_of_halfsphere(-1) = mark(face(e));
|
||||
return;
|
||||
}
|
||||
CGAL_nef3_assertion_msg(0,"damn wrong type.");
|
||||
/*
|
||||
TRACEN("1 dimensional object");
|
||||
mark_of_halfsphere(-1) = mark_of_halfsphere(+1) = 0;
|
||||
*/
|
||||
CGAL_nef3_assertion_msg(0,"damn wrong type");
|
||||
return;
|
||||
}
|
||||
|
||||
CGAL_END_NAMESPACE
|
||||
|
|
|
|||
|
|
@ -97,9 +97,14 @@ int sign_of(const CGAL::Plane_3<R>& h)
|
|||
|
||||
template <typename R>
|
||||
CGAL::Plane_3<R> normalized(CGAL::Plane_3<R>& h)
|
||||
{ typedef typename R::RT RT;
|
||||
RT a(h.a()),b(h.b()),c(h.c()),d(h.d());
|
||||
RT x = (a==0) ? ((b==0) ? ((c==0) ? ((d==0) ? 1: d): c): b): a;
|
||||
{
|
||||
typedef typename R::RT::NT NT;
|
||||
CGAL_assertion(h.a().degree()==0);
|
||||
CGAL_assertion(h.b().degree()==0);
|
||||
CGAL_assertion(h.c().degree()==0);
|
||||
CGAL_assertion(h.d().degree()==0);
|
||||
NT a(h.a().eval_at(1)),b(h.b().eval_at(1)),c(h.c().eval_at(1)),d(h.d().eval_at(1));
|
||||
NT x = (a==0) ? ((b==0) ? ((c==0) ? ((d==0) ? 1: d): c): b): a;
|
||||
TRACE("gcd... i"<<x<<' ');
|
||||
x = ( a != 0 ? a : x);
|
||||
TRACE(x<<' ');
|
||||
|
|
@ -141,12 +146,12 @@ class SNC_constructor : public SNC_decorator<SNC_structure_>
|
|||
{
|
||||
public:
|
||||
typedef SNC_structure_ SNC_structure;
|
||||
typedef typename SNC_structure_::Sphere_kernel Sphere_kernel;
|
||||
typedef typename SNC_structure_::Kernel Kernel;
|
||||
typedef typename SNC_structure_::Sphere_kernel Sphere_kernel;
|
||||
typedef typename SNC_structure_::Kernel Kernel;
|
||||
typedef CGAL::SNC_constructor<SNC_structure> Self;
|
||||
typedef CGAL::SNC_decorator<SNC_structure> Base;
|
||||
typedef CGAL::SNC_decorator<SNC_structure> SNC_decorator;
|
||||
typedef CGAL::SNC_ray_shooter<SNC_structure> SNC_ray_shooter;
|
||||
typedef CGAL::SNC_ray_shooter<SNC_structure> SNC_ray_shooter;
|
||||
typedef CGAL::SNC_FM_decorator<SNC_structure> FM_decorator;
|
||||
typedef CGAL::SNC_SM_decorator<SNC_structure> SM_decorator;
|
||||
typedef CGAL::SNC_SM_overlayer<SNC_structure> SM_overlayer;
|
||||
|
|
@ -258,11 +263,12 @@ public:
|
|||
}
|
||||
void visit(Halfedge_handle h) {
|
||||
TRACEN("visit he "<<D.point(D.source(h)));
|
||||
SFace_handle sf = D.sface(h);
|
||||
SM_decorator SD(D.vertex(h));
|
||||
SFace_handle sf = D.source(h)->sfaces_begin();
|
||||
if( Closed[sf] ) {
|
||||
SM_decorator SD(D.vertex(h));
|
||||
if( SD.first_out_edge(h) == SD.last_out_edge(h) )
|
||||
if( SD.is_isolated(h) || SD.first_out_edge(h) == SD.last_out_edge(h) ) {
|
||||
Closed[sf] = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
void visit(Halffacet_handle h) { /* do nothing */ }
|
||||
|
|
@ -281,6 +287,10 @@ public:
|
|||
|
||||
Vertex_handle create_box_corner(int x, int y, int z,
|
||||
bool space=true, bool boundary=true) const;
|
||||
|
||||
Vertex_handle create_extended_box_corner(int x, int y, int z,
|
||||
bool space=true, bool boundary=true) const;
|
||||
|
||||
/*{\Mop produces the sphere map representing thp,e box corner in
|
||||
direction $(x,y,z)$.}*/
|
||||
|
||||
|
|
@ -317,6 +327,7 @@ public:
|
|||
/*{\Mop determines the volume |C| that a shell |S| pointed by |sf|
|
||||
belongs to. \precondition |S| separates the volume |C| from an enclosed
|
||||
volume.}*/ {
|
||||
TRACEN("determine volume");
|
||||
Vertex_handle v_min = MinimalVertex[Shell[sf]];
|
||||
Halffacet_handle f_below = get_facet_below(v_min);
|
||||
if ( f_below == Halffacet_handle())
|
||||
|
|
@ -342,11 +353,12 @@ public:
|
|||
// ######### Non-generic code ##########
|
||||
Segment_3 ray( p, Point_3( p.hx(), p.hy(), -INT_MAX*p.hw(), p.hw()));
|
||||
// ####################################
|
||||
SNC_ray_shooter rs(*sncp());
|
||||
SNC_ray_shooter rs(*sncp());
|
||||
Object_handle o = rs.shoot(ray);
|
||||
Vertex_handle v;
|
||||
Halfedge_handle e;
|
||||
Halffacet_handle f;
|
||||
TRACEN("get_facet_below");
|
||||
if( assign(v, o)) {
|
||||
TRACEN("facet below from from vertex...");
|
||||
f_below = get_visible_facet(v, ray);
|
||||
|
|
@ -430,6 +442,58 @@ create_box_corner(int x, int y, int z, bool space, bool boundary) const {
|
|||
return v;
|
||||
}
|
||||
|
||||
template <typename SNC_>
|
||||
typename SNC_::Vertex_handle
|
||||
SNC_constructor<SNC_>::
|
||||
create_extended_box_corner(int x, int y, int z, bool space, bool boundary) const {
|
||||
CGAL_nef3_assertion(CGAL_NTS abs(x) == CGAL_NTS abs(y) &&
|
||||
CGAL_NTS abs(y) == CGAL_NTS abs(z));
|
||||
TRACEN(" constructing box corner on "<<Point_3(x,y,z)<<"...");
|
||||
Vertex_handle v = sncp()->new_vertex( epoint(x,0,y,0,z,0,1), boundary);
|
||||
SM_decorator SD(v);
|
||||
Sphere_point sp[] = { Sphere_point(-x, 0, 0),
|
||||
Sphere_point(0, -y, 0),
|
||||
Sphere_point(0, 0, -z) };
|
||||
/* create box vertices */
|
||||
SVertex_handle sv[3];
|
||||
for(int vi=0; vi<3; ++vi) {
|
||||
sv[vi] = SD.new_vertex(sp[vi]);
|
||||
mark(sv[vi]) = boundary;
|
||||
}
|
||||
/* create facet's edge uses */
|
||||
Sphere_segment ss[3];
|
||||
SHalfedge_handle she[3];
|
||||
for(int si=0; si<3; ++si) {
|
||||
she[si] = SD.new_edge_pair(sv[si], sv[(si+1)%3]);
|
||||
ss[si] = Sphere_segment(sp[si],sp[(si+1)%3]);
|
||||
SD.circle(she[si]) = ss[si].sphere_circle();
|
||||
SD.circle(SD.twin(she[si])) = ss[si].opposite().sphere_circle();
|
||||
SD.mark(she[si]) = boundary;
|
||||
}
|
||||
/* create facets */
|
||||
SFace_handle fi = SD.new_face();
|
||||
SFace_handle fe = SD.new_face();
|
||||
SD.link_as_face_cycle(she[0], fi);
|
||||
SD.link_as_face_cycle(SD.twin(she[0]), fe);
|
||||
/* set face mark */
|
||||
SHalfedge_iterator e = SD.shalfedges_begin();
|
||||
SFace_handle f;
|
||||
Sphere_point p1 = SD.point(SD.source(e));
|
||||
Sphere_point p2 = SD.point(SD.target(e));
|
||||
Sphere_point p3 = SD.point(SD.target(SD.next(e)));
|
||||
if ( spherical_orientation(p1,p2,p3) > 0 )
|
||||
f = SD.face(e);
|
||||
else
|
||||
f = SD.face(SD.twin(e));
|
||||
SD.mark(f) = space;
|
||||
// SD.mark_of_halfsphere(-1) = (x<0 && y>0 && z>0);
|
||||
// SD.mark_of_halfsphere(+1) = (x>0 && y>0 && z<0);
|
||||
/* TODO: to check if the commented code above could be wrong */
|
||||
SM_point_locator L(v);
|
||||
L.init_marks_of_halfspheres();
|
||||
return v;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// create_from_facet()
|
||||
// Creates the local graph of a facet f at point p.
|
||||
|
|
@ -533,7 +597,9 @@ create_from_edge(Halfedge_handle e,
|
|||
template <typename SNC_>
|
||||
void SNC_constructor<SNC_>::
|
||||
pair_up_halfedges() const
|
||||
{ TRACEN(">>>>>pair_up_halfedges");
|
||||
{
|
||||
// SETDTHREAD(43*61);
|
||||
TRACEN(">>>>>pair_up_halfedges");
|
||||
typedef Halfedge_key< Point_3, Halfedge_handle, SNC_decorator>
|
||||
Halfedge_key;
|
||||
typedef Halfedge_key_lt< Point_3, Halfedge_handle, SNC_decorator>
|
||||
|
|
@ -550,18 +616,20 @@ pair_up_halfedges() const
|
|||
Halfedge_iterator e;
|
||||
CGAL_nef3_forall_halfedges(e,*sncp()) {
|
||||
Point_3 p = point(vertex(e));
|
||||
Pluecker_line_3 l(p, p + tmp_point(e));
|
||||
Pluecker_line_3 l(p, p + Vector_3(tmp_point(e)));
|
||||
int inverted;
|
||||
l = categorize(l,inverted);
|
||||
M[l].push_back(Halfedge_key(p,inverted,e,D));
|
||||
TRACEN(" ("<<p<<") ("<<tmp_point(e)<<") "<<&*e<<" |"<<l << " " << inverted);
|
||||
TRACEN(" ("<<p<<") ("<<p+ Vector_3(tmp_point(e))<<") "<< " (" << tmp_point(e) << ") " << &*e<<" |"<<l << " " << inverted);
|
||||
}
|
||||
|
||||
typename Pluecker_line_map::iterator it;
|
||||
CGAL_nef3_forall_iterators(it,M) {
|
||||
it->second.sort(Halfedge_key_lt());
|
||||
TRACEN("search opposite "<<it->first<< "\n " <<(debug_container(it->second),"")<< std::endl);
|
||||
TRACEN("search opposite "<<it->first<< "\n ");
|
||||
typename Halfedge_list::iterator itl;
|
||||
CGAL_nef3_forall_iterators(itl,it->second)
|
||||
TRACEN(PH(itl->e));
|
||||
CGAL_nef3_forall_iterators(itl,it->second) {
|
||||
Halfedge_handle e1 = itl->e;
|
||||
++itl; CGAL_nef3_assertion(itl != it->second.end());
|
||||
|
|
@ -717,6 +785,7 @@ create_volumes() const
|
|||
SFace_handle f = EntrySFace[i];
|
||||
CGAL_nef3_assertion( Shell[EntrySFace[i]] == i );
|
||||
if( Closed[f] ) {
|
||||
TRACEN("Shell #" << i << " is closed");
|
||||
SM_decorator SD(v);
|
||||
Volume_handle c = sncp()->new_volume();
|
||||
mark(c) = SD.mark(f);
|
||||
|
|
|
|||
|
|
@ -371,7 +371,7 @@ public:
|
|||
template <class H> void set_facet(H h, Halffacet_handle f) const
|
||||
{ h->incident_facet_ = f; }
|
||||
void set_volume(Halffacet_handle h, Volume_handle c) const
|
||||
{ h->volume_ = c; }
|
||||
{ TRACEN("VOLUME dec"); h->volume_ = c; }
|
||||
void set_volume(SFace_handle h, Volume_handle c) const
|
||||
{ h->incident_volume_ = c; }
|
||||
|
||||
|
|
@ -428,9 +428,18 @@ public:
|
|||
TRACEN( "Locating " << sp <<" in " << point(v));
|
||||
SM_point_locator L(v);
|
||||
SObject_handle o = L.locate(sp);
|
||||
|
||||
SFace_const_handle sf;
|
||||
CGAL_nef3_assertion( assign( sf, o));
|
||||
assign( sf, o);
|
||||
// CGAL_nef3_assertion(assign(sf,o));
|
||||
// assign(sf,o);
|
||||
if(!assign( sf, o))
|
||||
return Halffacet_handle();
|
||||
/* SM_decorator SD;
|
||||
if(sncp()->halfedges_begin() == sncp()->halfedges_end() ||
|
||||
SD.is_isolated(sncp()->halfedges_begin()))
|
||||
return Halffacet_handle();
|
||||
*/
|
||||
|
||||
SFace_cycle_const_iterator fc = sf->sface_cycles_begin(),
|
||||
fce = sf->sface_cycles_end();
|
||||
if( is_empty_range( fc, fce)) {
|
||||
|
|
@ -442,18 +451,22 @@ public:
|
|||
SHalfloop_handle sl;
|
||||
if ( assign( se, fc)) {
|
||||
TRACEN( "adjacent facet found (SEdges cycle).");
|
||||
TRACEN("se" << PH(se));
|
||||
f_visible = facet(twin(se));
|
||||
TRACEN("f_visible" << &f_visible);
|
||||
}
|
||||
else if ( assign( sl, fc)) {
|
||||
TRACEN( "adjacent facet found (SHalfloop cycle).");
|
||||
f_visible = facet(twin(sl));
|
||||
}
|
||||
else
|
||||
CGAL_nef3_assertion_msg(0, "Damn, wrong handle.");
|
||||
// CGAL_nef3_assertion_msg(0,"Damn wrong handle");
|
||||
return Halffacet_handle();
|
||||
}
|
||||
TRACEN("return");
|
||||
return f_visible;
|
||||
}
|
||||
|
||||
|
||||
Halffacet_handle get_visible_facet( const Halfedge_handle e,
|
||||
const Segment_3& ray) const
|
||||
/*{\Mop when one shoot a ray |ray| in order to find the facet below to
|
||||
|
|
@ -631,7 +644,7 @@ public:
|
|||
O1.print();
|
||||
#endif // CGAL_NEF3_DUMP_SNC_OPERATORS
|
||||
|
||||
// SETDTHREAD(131*19*43);
|
||||
SETDTHREAD(131*19*43);
|
||||
|
||||
TRACEN("=> for all v0 in snc0, qualify v0 with respect snc1");
|
||||
|
||||
|
|
@ -799,7 +812,10 @@ public:
|
|||
}
|
||||
|
||||
// synthesis of spatial structure
|
||||
|
||||
SNC_constructor C(result);
|
||||
SNC_io_parser<SNC_structure> Op(std::cout, result);
|
||||
Op.print();
|
||||
C.pair_up_halfedges();
|
||||
C.link_shalfedges_to_facet_cycles();
|
||||
C.categorize_facet_cycles_and_create_facets();
|
||||
|
|
@ -890,20 +906,24 @@ visit_shell_objects(SFace_handle f, Visitor& V) const
|
|||
while ( true ) {
|
||||
if ( SFaceCandidates.empty() && FacetCandidates.empty() ) break;
|
||||
if ( !FacetCandidates.empty() ) {
|
||||
TRACEN("Facet");
|
||||
Halffacet_handle f = *FacetCandidates.begin();
|
||||
FacetCandidates.pop_front();
|
||||
V.visit(f); // report facet
|
||||
Halffacet_cycle_iterator fc;
|
||||
CGAL_nef3_forall_facet_cycles_of(fc,f) {
|
||||
SHalfedge_handle e; SHalfloop_handle l;
|
||||
if ( assign(e,fc) ) {
|
||||
if ( assign(e,fc) ) {
|
||||
TRACEN("Sedge assigned");
|
||||
SHalfedge_around_facet_circulator ec(e),ee(e);
|
||||
CGAL_For_all(ec,ee) { e = twin(ec);
|
||||
if ( Done[sface(e)] ) continue;
|
||||
SFaceCandidates.push_back(sface(e));
|
||||
Done[sface(e)] = true;
|
||||
}
|
||||
} else if ( assign(l,fc) ) { l = twin(l);
|
||||
} else if ( assign(l,fc) ) {
|
||||
TRACEN("sloop assigned");
|
||||
l = twin(l);
|
||||
if ( Done[sface(l)] ) continue;
|
||||
SFaceCandidates.push_back(sface(l));
|
||||
Done[sface(l)] = true;
|
||||
|
|
@ -911,16 +931,24 @@ visit_shell_objects(SFace_handle f, Visitor& V) const
|
|||
}
|
||||
}
|
||||
if ( !SFaceCandidates.empty() ) {
|
||||
TRACEN("Sface");
|
||||
SFace_handle sf = *SFaceCandidates.begin();
|
||||
SFaceCandidates.pop_front();
|
||||
V.visit(sf);
|
||||
if ( !Done[vertex(sf)] )
|
||||
V.visit(vertex(sf)); // report vertex
|
||||
SVertex_handle sv;
|
||||
SM_decorator SD(vertex(sf));
|
||||
CGAL_nef3_forall_svertices(sv,SD){
|
||||
if(SD.is_isolated(sv) && !Done[sv])
|
||||
V.visit(sv);
|
||||
}
|
||||
SFace_cycle_iterator fc;
|
||||
CGAL_nef3_forall_sface_cycles_of(fc,sf) {
|
||||
SVertex_handle v; SHalfedge_handle e; SHalfloop_handle l;
|
||||
if ( assign(e,fc) ) {
|
||||
SHalfedge_around_sface_circulator ec(e),ee(e);
|
||||
TRACEN("sedge assigned2");
|
||||
SHalfedge_around_sface_circulator ec(e),ee(e);
|
||||
CGAL_For_all(ec,ee) {
|
||||
v = starget(ec);
|
||||
if ( !Done[v] ) {
|
||||
|
|
@ -932,14 +960,21 @@ visit_shell_objects(SFace_handle f, Visitor& V) const
|
|||
FacetCandidates.push_back(f); Done[f] = true;
|
||||
}
|
||||
} else if ( assign(v,fc) ) {
|
||||
TRACEN("svertex assigned");
|
||||
if ( Done[v] ) continue;
|
||||
V.visit(v); // report edge
|
||||
Done[v] = Done[twin(v)] = true;
|
||||
// note that v is isolated, thus twin(v) is isolated too
|
||||
SFace_handle fo = sface(twin(v));
|
||||
if ( Done[fo] ) continue;
|
||||
SM_decorator SD;
|
||||
SFace_handle fo;
|
||||
if(SD.is_isolated(v))
|
||||
fo = source(v)->sfaces_begin();
|
||||
else
|
||||
fo = sface(twin(v));
|
||||
if ( Done[fo] ) continue;
|
||||
SFaceCandidates.push_back(fo); Done[fo] = true;
|
||||
} else if ( assign(l,fc) ) {
|
||||
TRACEN("sloop assigned");
|
||||
Halffacet_handle f = facet(twin(l));
|
||||
if ( Done[f] ) continue;
|
||||
FacetCandidates.push_back(f); Done[f] = true;
|
||||
|
|
|
|||
|
|
@ -445,6 +445,7 @@ public:
|
|||
{ supporting_plane_ = f.supporting_plane_;
|
||||
mark_ = f.mark_;
|
||||
twin_ = f.twin_;
|
||||
TRACEN("VOLUME const");
|
||||
volume_ = f.volume_;
|
||||
boundary_entry_objects_ = f.boundary_entry_objects_;
|
||||
}
|
||||
|
|
@ -454,6 +455,7 @@ public:
|
|||
supporting_plane_ = f.supporting_plane_;
|
||||
mark_ = f.mark_;
|
||||
twin_ = f.twin_;
|
||||
TRACEN("VOLUME op=");
|
||||
volume_ = f.volume_;
|
||||
boundary_entry_objects_ = f.boundary_entry_objects_;
|
||||
return *this;
|
||||
|
|
|
|||
|
|
@ -80,7 +80,7 @@ class SNC_ray_shooter : public SNC_decorator<SNC_structure_>
|
|||
typedef SNC_structure_ SNC_structure;
|
||||
|
||||
protected:
|
||||
typedef SNC_ray_shooter<SNC_structure> Self;
|
||||
typedef SNC_ray_shooter<SNC_structure> Self;
|
||||
typedef SNC_decorator<SNC_structure> Base;
|
||||
|
||||
public:
|
||||
|
|
@ -233,21 +233,24 @@ public:
|
|||
return Object_handle(f);
|
||||
}
|
||||
}
|
||||
Volume_handle c;
|
||||
/* lets be |s| be the segment that connects |p| to any fixed vertex |va| */
|
||||
Vertex_handle va = --(sncp()->vertices_end());
|
||||
Segment_3 s( p, point(va));
|
||||
/* prune |s| by |o| if |o| intersects |s| in its relative interior */
|
||||
Object_handle o = shoot(s);
|
||||
/* determine the volume that contains |s| from the last pruning object */
|
||||
|
||||
Halffacet_handle hf;
|
||||
if( assign( v, o))
|
||||
c = volume(get_visible_facet( v, s));
|
||||
hf = get_visible_facet( v, s);
|
||||
else if( assign( e, o))
|
||||
c = volume(get_visible_facet( e, s));
|
||||
hf = get_visible_facet( e, s);
|
||||
else if( assign( f, o))
|
||||
c = volume(get_visible_facet( f, s));
|
||||
hf = get_visible_facet( f, s);
|
||||
else CGAL_nef3_assertion_msg(0, "where is our point, eh?");
|
||||
return Object_handle(c);
|
||||
if(hf==Halffacet_handle())
|
||||
return ++(sncp()->volumes_begin());
|
||||
return Object_handle(volume(hf));
|
||||
}
|
||||
|
||||
void shorten(Segment_3& s, const Point_3& p) const {
|
||||
|
|
@ -255,10 +258,11 @@ public:
|
|||
TRACEN("shooted ray "<<s);
|
||||
}
|
||||
bool does_contain_internally(const Segment_3& s, const Point_3& p) const {
|
||||
TRACEN("dci begin");
|
||||
if(!s.has_on(p))
|
||||
return false;
|
||||
Comparison_result r1 = compare_xyz(s.source(),p);
|
||||
Comparison_result r2 = compare_xyz(s.target(),p);
|
||||
Comparison_result r1 = compare_xyz(s.source(),p);
|
||||
Comparison_result r2 = compare_xyz(s.target(),p);
|
||||
return (r1 == opposite(r2));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -102,6 +102,7 @@ public:
|
|||
typedef typename Kernel::FT FT;
|
||||
typedef typename Kernel::RT RT;
|
||||
typedef typename Items::Sphere_kernel Sphere_kernel;
|
||||
|
||||
|
||||
typedef typename Kernel::Point_3 Point_3;
|
||||
/*{\Mtypemember embedding vertices.}*/
|
||||
|
|
@ -1059,7 +1060,7 @@ public:
|
|||
void simplify() {
|
||||
TRACEN(">>> simplifying");
|
||||
SNC_decorator D(*this);
|
||||
SNC_io_parser<SNC_structure> IO_parser(std::cout, *this);
|
||||
SNC_io_parser<SNC_structure> IO_parser(std::cerr, *this);
|
||||
IO = &IO_parser;
|
||||
|
||||
Unique_hash_map< Volume_handle, UFH_volume> hash_volume;
|
||||
|
|
@ -1087,7 +1088,7 @@ public:
|
|||
hash_sface[sf] = uf_sface.make_set(sf);
|
||||
reset_sm_object_list(sf->boundary_entry_objects_);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Volumes simplification
|
||||
*/
|
||||
|
|
@ -1103,7 +1104,7 @@ public:
|
|||
CGAL_nef3_assertion( f != D.twin(f));
|
||||
Volume_handle c1 = D.volume(f), c2 = D.volume(D.twin(f));
|
||||
TRACEN(" mark("<<IO->index(c1)<<")="<<D.mark(c1)<<
|
||||
" mark("<<IO->index(f) <<")="<<D.mark(f) <<
|
||||
" mark("<<IO->index(f) <<")="<<D.mark(f) <<
|
||||
" mark("<<IO->index(c2)<<")="<<D.mark(c2)<<
|
||||
" is_twin(f)="<<f->is_twin());
|
||||
if( D.mark(c1) == D.mark(f) && D.mark(f) == D.mark(c2)
|
||||
|
|
@ -1120,6 +1121,7 @@ public:
|
|||
CGAL_nef3_forall_halffacets( hf, *this) {
|
||||
hash_facet[hf] = uf_facet.make_set(hf);
|
||||
reset_object_list(hf->boundary_entry_objects_);
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -1134,11 +1136,13 @@ public:
|
|||
do
|
||||
e_next++;
|
||||
while( e_next != D.halfedges_end() && e_next->is_twin());
|
||||
|
||||
|
||||
SM_decorator SD(D.source(e));
|
||||
if( SD.is_isolated(e) && D.mark(e) == D.mark(D.volume(D.sface(e)))) {
|
||||
TRACEN("removing pair "<<IO->index(e)<<' '<<IO->index(D.twin(e)));
|
||||
delete_halfedge_pair(e);
|
||||
if( SD.is_isolated(e)) {
|
||||
if(D.mark(e) == D.mark(D.volume(D.source(e)->sfaces_begin()))) {
|
||||
TRACEN("removing pair "<<IO->index(e)<<' '<<IO->index(D.twin(e)));
|
||||
delete_halfedge_pair(e);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if( D.has_outdeg_two(e)) {
|
||||
|
|
@ -1159,8 +1163,10 @@ public:
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
e = e_next;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Vertices simplification
|
||||
|
|
@ -1202,14 +1208,13 @@ public:
|
|||
v = v_next;
|
||||
}
|
||||
|
||||
purge_no_find_objects(hash_volume, hash_facet, hash_sface,
|
||||
uf_volume, uf_facet, uf_sface);
|
||||
purge_no_find_objects(hash_volume, hash_facet, hash_sface, uf_volume, uf_facet, uf_sface);
|
||||
create_boundary_links_forall_sfaces( hash_sface, uf_sface);
|
||||
create_boundary_links_forall_facets( hash_facet, uf_facet);
|
||||
create_boundary_links_forall_volumes( hash_volume, uf_volume);
|
||||
|
||||
TRACEN(">>> simplifying done");
|
||||
}
|
||||
}
|
||||
|
||||
void remove_edge_and_merge_facet_cycles( Halfedge_handle e) {
|
||||
SNC_decorator D(*this);
|
||||
|
|
@ -1322,7 +1327,7 @@ public:
|
|||
CGAL_nef3_forall_svertices(sv, *this) {
|
||||
SM_decorator SD(D.vertex(sv));
|
||||
if( SD.is_isolated(sv)) {
|
||||
SFace_handle sf = *(uf.find(hash[D.sface(sv)]));
|
||||
SFace_handle sf = *(uf.find(hash[D.source(sv)->sfaces_begin()]));
|
||||
CGAL_nef3_assertion( sf != SFace_handle());
|
||||
SD.set_face( sv, sf);
|
||||
SD.store_boundary_object( sv, sf);
|
||||
|
|
@ -1563,7 +1568,7 @@ pointer_update(const SNC_structure<Items>& D)
|
|||
for(sfc = sf->sface_cycles_begin();
|
||||
sfc != sf->sface_cycles_end(); ++sfc) {
|
||||
SVertex_handle sv;
|
||||
if ( assign(sv,sf) )
|
||||
if ( assign(sv,sfc) )
|
||||
{ *sfc = SObject_handle(EM[sv]); store_sm_boundary_item(sv,sfc); }
|
||||
else if ( assign(se,sfc) )
|
||||
{ *sfc = SObject_handle(SEM[se]); store_sm_boundary_item(se,sfc); }
|
||||
|
|
|
|||
|
|
@ -79,7 +79,8 @@ Bounded_side bounded_side_3(IteratorForward first,
|
|||
plane = Plane_3(p0, p1, p2);
|
||||
/* since we just need to project the points to a non-perpendicular plane
|
||||
we don't need to care about the plane orientation */
|
||||
}
|
||||
}
|
||||
|
||||
CGAL_assertion(!plane.is_degenerate());
|
||||
TRACEN(plane);
|
||||
Point_2 (*t)(Point_3);
|
||||
|
|
|
|||
|
|
@ -232,6 +232,18 @@ protected:
|
|||
SFace_const_iterator;
|
||||
|
||||
|
||||
void initialize_extended_cube_vertices(Content space) {
|
||||
SNC_constructor C(snc());
|
||||
C.create_extended_box_corner( 1, 1, 1, space );
|
||||
C.create_extended_box_corner(-1, 1, 1, space );
|
||||
C.create_extended_box_corner( 1,-1, 1, space );
|
||||
C.create_extended_box_corner(-1,-1, 1, space );
|
||||
C.create_extended_box_corner( 1, 1,-1, space );
|
||||
C.create_extended_box_corner(-1, 1,-1, space );
|
||||
C.create_extended_box_corner( 1,-1,-1, space );
|
||||
C.create_extended_box_corner(-1,-1,-1, space );
|
||||
}
|
||||
|
||||
void initialize_simple_cube_vertices(Content space) {
|
||||
SNC_constructor C(snc());
|
||||
C.create_box_corner( INT_MAX, INT_MAX, INT_MAX, space );
|
||||
|
|
@ -287,12 +299,11 @@ public:
|
|||
|
||||
typedef Polyhedron_3< Kernel> Polyhedron;
|
||||
Nef_polyhedron_3( Polyhedron& P) {
|
||||
SETDTHREAD(11*131*19*43);
|
||||
initialize_simple_cube_vertices(EMPTY);
|
||||
polyhedron_3_to_nef_3< Polyhedron, SNC_structure, SNC_constructor>
|
||||
( P, snc() );
|
||||
// build_external_structure();
|
||||
// simplify();
|
||||
build_external_structure();
|
||||
simplify();
|
||||
}
|
||||
|
||||
template <class HDS>
|
||||
|
|
@ -566,7 +577,7 @@ public:
|
|||
|
||||
Nef_polyhedron_3<T> intersection(Nef_polyhedron_3<T>& N1)
|
||||
/*{\Mop returns |\Mvar| $\cap$ |N1|. }*/ {
|
||||
SETDTHREAD(11*131*19*43);
|
||||
|
||||
TRACEN(" intersection between nef3 "<<&*this<<" and "<<&N1);
|
||||
AND _and;
|
||||
SNC_structure rsnc;
|
||||
|
|
@ -581,6 +592,7 @@ public:
|
|||
/*{\Mop returns |\Mvar| $\cup$ |N1|. }*/ {
|
||||
TRACEN(" join between nef3 "<<&*this<<" and "<<&N1);
|
||||
OR _or;
|
||||
// SETDTHREAD(131*19*43);
|
||||
SNC_structure rsnc;
|
||||
SNC_decorator D(snc());
|
||||
D.binary_operation( N1.snc(), _or, rsnc);
|
||||
|
|
|
|||
Loading…
Reference in New Issue