mirror of https://github.com/CGAL/cgal
added include
added ckva rep made constructors protected -> or "removed" some removed construct_point_on_arc to CK is_on, compare_x and compare_xy use functors new friends
This commit is contained in:
parent
4ddcb0dba5
commit
a11ab701b5
|
|
@ -26,6 +26,8 @@
|
||||||
|
|
||||||
#include <CGAL/Arr_enums.h>
|
#include <CGAL/Arr_enums.h>
|
||||||
|
|
||||||
|
#include <CGAL/Curved_kernel_via_analysis_2/Curved_kernel_via_analysis_2_functors.h>
|
||||||
|
|
||||||
CGAL_BEGIN_NAMESPACE
|
CGAL_BEGIN_NAMESPACE
|
||||||
|
|
||||||
namespace CGALi {
|
namespace CGALi {
|
||||||
|
|
@ -34,7 +36,7 @@ namespace CGALi {
|
||||||
template < class CurvedKernelViaAnalysis_2, class Rep_ >
|
template < class CurvedKernelViaAnalysis_2, class Rep_ >
|
||||||
class Point_2;
|
class Point_2;
|
||||||
|
|
||||||
template <class CurvedKernelViaAnalysis_2>
|
template < class CurvedKernelViaAnalysis_2 >
|
||||||
class Arc_2_base_rep;
|
class Arc_2_base_rep;
|
||||||
|
|
||||||
//! forward class declaration for befriending
|
//! forward class declaration for befriending
|
||||||
|
|
@ -78,20 +80,23 @@ public:
|
||||||
|
|
||||||
// default constructor
|
// default constructor
|
||||||
Point_2_rep() :
|
Point_2_rep() :
|
||||||
_m_arc_rep(NULL) {
|
_m_arc_rep(NULL),
|
||||||
|
_m_ckva(NULL) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// constructs a "finite" point on curve,
|
// constructs a "finite" point on curve,
|
||||||
// implies CGAL::NO_BOUNDARY in x/y
|
// implies CGAL::NO_BOUNDARY in x/y
|
||||||
Point_2_rep(const Xy_coordinate_2& xy) :
|
Point_2_rep(const Xy_coordinate_2& xy) :
|
||||||
_m_xy(xy), _m_arc_rep(NULL), _m_location(CGAL::ARR_INTERIOR) {
|
_m_xy(xy), _m_arc_rep(NULL), _m_location(CGAL::ARR_INTERIOR),
|
||||||
|
_m_ckva(NULL) {
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// constructs a point on curve with y-coordinate at infinity
|
// constructs a point on curve with y-coordinate at infinity
|
||||||
Point_2_rep(const X_coordinate_1& x, CGAL::Arr_curve_end inf_end) :
|
Point_2_rep(const X_coordinate_1& x, CGAL::Arr_curve_end inf_end) :
|
||||||
_m_arc_rep(NULL) {
|
_m_arc_rep(NULL),
|
||||||
|
_m_ckva(NULL) {
|
||||||
_m_location = (inf_end == CGAL::ARR_MIN_END ?
|
_m_location = (inf_end == CGAL::ARR_MIN_END ?
|
||||||
CGAL::ARR_BOTTOM_BOUNDARY : CGAL::ARR_TOP_BOUNDARY);
|
CGAL::ARR_BOTTOM_BOUNDARY : CGAL::ARR_TOP_BOUNDARY);
|
||||||
_m_x = x;
|
_m_x = x;
|
||||||
|
|
@ -99,7 +104,8 @@ public:
|
||||||
|
|
||||||
// constructs a point at +/-oo in x
|
// constructs a point at +/-oo in x
|
||||||
Point_2_rep(CGAL::Arr_curve_end inf_end) :
|
Point_2_rep(CGAL::Arr_curve_end inf_end) :
|
||||||
_m_arc_rep(NULL) {
|
_m_arc_rep(NULL),
|
||||||
|
_m_ckva(NULL) {
|
||||||
|
|
||||||
_m_location = (inf_end == CGAL::ARR_MIN_END ?
|
_m_location = (inf_end == CGAL::ARR_MIN_END ?
|
||||||
CGAL::ARR_LEFT_BOUNDARY : CGAL::ARR_RIGHT_BOUNDARY);
|
CGAL::ARR_LEFT_BOUNDARY : CGAL::ARR_RIGHT_BOUNDARY);
|
||||||
|
|
@ -113,18 +119,18 @@ public:
|
||||||
// x-coordinate of a curve point
|
// x-coordinate of a curve point
|
||||||
boost::optional<X_coordinate_1> _m_x;
|
boost::optional<X_coordinate_1> _m_x;
|
||||||
|
|
||||||
//boost::optional<Curve_2> _m_xcurve;
|
// rep of incident arc
|
||||||
|
mutable const Arc_2_base_rep *_m_arc_rep;
|
||||||
//boost::optional<int> _m_xarcno;
|
|
||||||
|
|
||||||
mutable Arc_2_base_rep *_m_arc_rep;
|
|
||||||
|
|
||||||
// surface boundary type
|
// surface boundary type
|
||||||
//mutable CGAL::Arr_boundary_type _m_boundary;
|
//mutable CGAL::Arr_boundary_type _m_boundary;
|
||||||
// location of a point in parameter space
|
// location of a point in parameter space
|
||||||
mutable CGAL::Arr_parameter_space _m_location;
|
mutable CGAL::Arr_parameter_space _m_location;
|
||||||
|
|
||||||
|
// pointer to underlying ckva
|
||||||
|
mutable Curved_kernel_via_analysis_2 *_m_ckva;
|
||||||
|
|
||||||
|
// friends
|
||||||
friend std::ostream& operator << <>(
|
friend std::ostream& operator << <>(
|
||||||
std::ostream&,
|
std::ostream&,
|
||||||
const Point_2<Curved_kernel_via_analysis_2, Self>&);
|
const Point_2<Curved_kernel_via_analysis_2, Self>&);
|
||||||
|
|
@ -140,8 +146,8 @@ public:
|
||||||
//! information is taken from \c Arc_2 this point belongs to.
|
//! information is taken from \c Arc_2 this point belongs to.
|
||||||
template <class CurvedKernelViaAnalysis_2,
|
template <class CurvedKernelViaAnalysis_2,
|
||||||
class Rep_ = CGALi::Point_2_rep<CurvedKernelViaAnalysis_2> >
|
class Rep_ = CGALi::Point_2_rep<CurvedKernelViaAnalysis_2> >
|
||||||
class Point_2
|
class Point_2 :
|
||||||
: public CGAL::Handle_with_policy< Rep_ > {
|
public CGAL::Handle_with_policy< Rep_ > {
|
||||||
public:
|
public:
|
||||||
//!@{
|
//!@{
|
||||||
//!\name typedefs
|
//!\name typedefs
|
||||||
|
|
@ -173,8 +179,8 @@ public:
|
||||||
//! the handle superclass
|
//! the handle superclass
|
||||||
typedef ::CGAL::Handle_with_policy< Rep > Base;
|
typedef ::CGAL::Handle_with_policy< Rep > Base;
|
||||||
|
|
||||||
typedef CGALi::Arc_2_base_rep<Curved_kernel_via_analysis_2>
|
typedef CGALi::Arc_2_base_rep< Curved_kernel_via_analysis_2 >
|
||||||
Arc_2_base_rep;
|
Arc_rep;
|
||||||
|
|
||||||
//!@}
|
//!@}
|
||||||
|
|
||||||
|
|
@ -196,13 +202,8 @@ public:
|
||||||
Base(static_cast<const Base&>(p)) {
|
Base(static_cast<const Base&>(p)) {
|
||||||
}
|
}
|
||||||
|
|
||||||
//!\brief standard constructor: constructs a finite point on curve
|
protected:
|
||||||
//!
|
|
||||||
//! implies no boundary conditions in x/y
|
|
||||||
explicit Point_2(const Xy_coordinate_2& p) :
|
|
||||||
Base(Rep(p)) {
|
|
||||||
}
|
|
||||||
|
|
||||||
//!\brief standard constructor: constructs a finite point with x-coordinate
|
//!\brief standard constructor: constructs a finite point with x-coordinate
|
||||||
//! \c x on curve \c c with arc number \c arcno
|
//! \c x on curve \c c with arc number \c arcno
|
||||||
//!
|
//!
|
||||||
|
|
@ -211,31 +212,21 @@ public:
|
||||||
Base(Rep(Xy_coordinate_2(x, c, arcno))) {
|
Base(Rep(Xy_coordinate_2(x, c, arcno))) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0 // TODO remove these constructors?
|
||||||
|
//!\brief standard constructor: constructs a finite point on curve
|
||||||
|
//!
|
||||||
|
//! implies no boundary conditions in x/y
|
||||||
|
explicit Point_2(const Xy_coordinate_2& p) :
|
||||||
|
Base(Rep(p)) {
|
||||||
|
}
|
||||||
|
|
||||||
/*!\brief
|
/*!\brief
|
||||||
* constructs from a given represenation
|
* constructs from a given represenation
|
||||||
*/
|
*/
|
||||||
Point_2(Rep rep) :
|
Point_2(Rep rep) :
|
||||||
Base(rep) {
|
Base(rep) {
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
//!\brief Functor to construct point on an arc
|
|
||||||
//! \c x on curve \c c with arc number \c arcno
|
|
||||||
//!
|
|
||||||
//! implies no boundary conditions in x/y
|
|
||||||
class Construct_point_on_arc_2 {
|
|
||||||
public:
|
|
||||||
//! constructs points at x
|
|
||||||
template < class Arc_2 >
|
|
||||||
Self operator()(
|
|
||||||
const X_coordinate_1& x, const Curve_2& c, int arcno,
|
|
||||||
const Arc_2& arc) {
|
|
||||||
CGAL_assertion(c.id() == arc.curve().id());
|
|
||||||
CGAL_assertion(arcno == arc.arcno(x));
|
|
||||||
Self pt(Xy_coordinate_2(x, c, arcno));
|
|
||||||
// here we can modify the point, if we want to
|
|
||||||
return pt;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
//!@}
|
//!@}
|
||||||
private:
|
private:
|
||||||
|
|
@ -259,11 +250,39 @@ private:
|
||||||
Base(Rep(x, inf_end)) {
|
Base(Rep(x, inf_end)) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void _add_ref(Arc_2_base_rep *arc_rep) const {
|
//!@}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
//!\name Pointers
|
||||||
|
//!@{
|
||||||
|
|
||||||
|
//! sets pointer to ckva instance
|
||||||
|
void set_ckva(Curved_kernel_via_analysis_2 *ckva) const {
|
||||||
|
this->ptr()->_m_ckva = ckva;
|
||||||
|
}
|
||||||
|
|
||||||
|
//! sets pointer to incident arc
|
||||||
|
void _add_ref(const Arc_rep *arc_rep) const {
|
||||||
this->ptr()->_m_arc_rep = arc_rep;
|
this->ptr()->_m_arc_rep = arc_rep;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//! returns pointer to incident arc
|
||||||
|
const Arc_rep* arc_rep() const {
|
||||||
|
return this->ptr()->_m_arc_rep;
|
||||||
|
}
|
||||||
|
|
||||||
//!@}
|
//!@}
|
||||||
|
|
||||||
|
public:
|
||||||
|
//!\name Destructors
|
||||||
|
//!@{
|
||||||
|
|
||||||
|
// virtual destructor
|
||||||
|
virtual ~Point_2() {
|
||||||
|
}
|
||||||
|
|
||||||
|
//!@}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
//!\name access functions and predicates
|
//!\name access functions and predicates
|
||||||
//!@{
|
//!@{
|
||||||
|
|
@ -271,6 +290,7 @@ public:
|
||||||
//! access to underlying \c Xy_coordinate_2 object
|
//! access to underlying \c Xy_coordinate_2 object
|
||||||
//!
|
//!
|
||||||
//! \pre finite x/y coordinates must be set by construction
|
//! \pre finite x/y coordinates must be set by construction
|
||||||
|
inline
|
||||||
const Xy_coordinate_2& xy() const {
|
const Xy_coordinate_2& xy() const {
|
||||||
CGAL_precondition_msg(this->ptr()->_m_xy,
|
CGAL_precondition_msg(this->ptr()->_m_xy,
|
||||||
"Denied access to the curve end lying at x/y-infinity");
|
"Denied access to the curve end lying at x/y-infinity");
|
||||||
|
|
@ -280,25 +300,27 @@ public:
|
||||||
//! access to the point's x-coordinate (y-coordinate can be undefined)
|
//! access to the point's x-coordinate (y-coordinate can be undefined)
|
||||||
//!
|
//!
|
||||||
//! \pre the point's x must be finite (set by construction)
|
//! \pre the point's x must be finite (set by construction)
|
||||||
|
inline
|
||||||
const X_coordinate_1& x() const {
|
const X_coordinate_1& x() const {
|
||||||
|
|
||||||
CGAL_precondition_msg(this->ptr()->_m_xy || this->ptr()->_m_x,
|
CGAL_precondition_msg(this->ptr()->_m_xy || this->ptr()->_m_x,
|
||||||
"Denied access to x-coordinate of the curve end \
|
"Denied access to x-coordinate of the curve end \
|
||||||
lying at x-infinity");
|
lying at x-infinity");
|
||||||
return (location() == CGAL::ARR_INTERIOR ?
|
return (location() == CGAL::ARR_INTERIOR ?
|
||||||
(*(this->ptr()->_m_xy)).x() : *(this->ptr()->_m_x));
|
(*(this->ptr()->_m_xy)).x() : *(this->ptr()->_m_x));
|
||||||
}
|
}
|
||||||
|
|
||||||
//! returns a supporting curve of underlying \c Xy_coordinate_2 object
|
//! returns a supporting curve of underlying \c Xy_coordinate_2 object
|
||||||
//!
|
//!
|
||||||
//! \pre this object must represent a finite point on curve
|
//! \pre this object must represent a finite point on curve
|
||||||
inline Curve_2 curve() const {
|
inline
|
||||||
|
Curve_2 curve() const {
|
||||||
CGAL_precondition_msg(this->ptr()->_m_xy ||
|
CGAL_precondition_msg(this->ptr()->_m_xy ||
|
||||||
this->ptr()->_m_arc_rep != NULL,
|
this->ptr()->_m_arc_rep != NULL,
|
||||||
"Denied access to the curve end lying at y-infinity");
|
"Denied access to the curve end lying at y-infinity");
|
||||||
return (location() == CGAL::ARR_INTERIOR ?
|
return (location() == CGAL::ARR_INTERIOR ?
|
||||||
(*(this->ptr()->_m_xy)).curve() :
|
(*(this->ptr()->_m_xy)).curve() :
|
||||||
this->ptr()->_m_arc_rep->_m_support);
|
this->ptr()->_m_arc_rep->_m_support);
|
||||||
}
|
}
|
||||||
|
|
||||||
//! returns an arc number of underlying \c Xy_coordinate_2 object
|
//! returns an arc number of underlying \c Xy_coordinate_2 object
|
||||||
|
|
@ -313,54 +335,71 @@ public:
|
||||||
this->ptr()->_m_arc_rep->_m_arcno);
|
this->ptr()->_m_arc_rep->_m_arcno);
|
||||||
}
|
}
|
||||||
|
|
||||||
//! returns type of a boundary
|
|
||||||
//inline CGAL::Arr_boundary_type boundary() const
|
|
||||||
//{ return this->ptr()->_m_boundary; }
|
|
||||||
|
|
||||||
//! returns location of a point in parameter space
|
//! returns location of a point in parameter space
|
||||||
inline CGAL::Arr_parameter_space location() const
|
inline CGAL::Arr_parameter_space location() const {
|
||||||
{ return this->ptr()->_m_location; }
|
return this->ptr()->_m_location;
|
||||||
|
}
|
||||||
|
|
||||||
//! checks if the point lies at x-infinity (x/y-coordinates are
|
//! checks if the point lies at x-infinity (x/y-coordinates are
|
||||||
//! inaccessible)
|
//! inaccessible)
|
||||||
inline bool is_on_left_right() const {
|
inline bool is_on_left_right() const {
|
||||||
return (location() == CGAL::ARR_LEFT_BOUNDARY ||
|
return (location() == CGAL::ARR_LEFT_BOUNDARY ||
|
||||||
location() == CGAL::ARR_RIGHT_BOUNDARY);
|
location() == CGAL::ARR_RIGHT_BOUNDARY);
|
||||||
}
|
}
|
||||||
|
|
||||||
//! checks if the point lies at y-infinity (y-coordinate is inaccessible)
|
//! checks if the point lies at y-infinity (y-coordinate is inaccessible)
|
||||||
inline bool is_on_bottom_top() const {
|
inline bool is_on_bottom_top() const {
|
||||||
return (location() == CGAL::ARR_BOTTOM_BOUNDARY ||
|
return (location() == CGAL::ARR_BOTTOM_BOUNDARY ||
|
||||||
location() == CGAL::ARR_TOP_BOUNDARY);
|
location() == CGAL::ARR_TOP_BOUNDARY);
|
||||||
}
|
}
|
||||||
|
|
||||||
//!\brief compares x-coordinates of two points
|
//!\brief compares x-coordinates of two points
|
||||||
//!
|
//!
|
||||||
//!\pre compared points have finite x-coordinates
|
//!\pre compared points have finite x-coordinates
|
||||||
CGAL::Comparison_result compare_x(const Point_2& p) const {
|
CGAL::Comparison_result compare_x(const Point_2& q) const {
|
||||||
Curve_kernel_2 kernel_2;
|
CGAL_precondition(this->ptr()->_m_xy);
|
||||||
return kernel_2.compare_x_2_object()(x(), p.x());
|
CGAL_precondition(q.ptr()->_m_xy);
|
||||||
|
CGAL_precondition(this->ptr()->_m_ckva != NULL);
|
||||||
|
typename
|
||||||
|
Curved_kernel_via_analysis_2::Compare_x_2 ck_compare_x =
|
||||||
|
this->ptr()->_m_ckva->compare_x_2_object();
|
||||||
|
|
||||||
|
return ck_compare_x(*this, q);
|
||||||
}
|
}
|
||||||
|
|
||||||
//!\brief compares two points lexicographical
|
//!\brief compares two points lexicographical
|
||||||
//!
|
//!
|
||||||
//!\pre compared points have finite x/y-coordinates
|
//!\pre compared points have finite x/y-coordinates
|
||||||
CGAL::Comparison_result compare_xy(const Point_2& p,
|
virtual CGAL::Comparison_result compare_xy(const Point_2& q,
|
||||||
bool equal_x = false) const {
|
bool equal_x = false) const {
|
||||||
Curve_kernel_2 kernel_2;
|
CGAL_precondition(this->ptr()->_m_xy);
|
||||||
return kernel_2.compare_xy_2_object()(xy(), p.xy(), equal_x);
|
CGAL_precondition(q.ptr()->_m_xy);
|
||||||
|
CGAL_precondition(this->ptr()->_m_ckva != NULL);
|
||||||
|
typename
|
||||||
|
Curved_kernel_via_analysis_2::Compare_xy_2 ck_compare_xy =
|
||||||
|
this->ptr()->_m_ckva->compare_xy_2_object();
|
||||||
|
|
||||||
|
return ck_compare_xy(*this, q, equal_x);
|
||||||
}
|
}
|
||||||
|
|
||||||
//! checks if the point lies on a curve
|
//! checks if the point lies on a curve
|
||||||
//! inaccessible)
|
inline bool is_on(
|
||||||
inline bool is_on(const Curve_2& curve) const {
|
const typename Curved_kernel_via_analysis_2::Curve_2& curve
|
||||||
Curve_kernel_2 kernel_2;
|
) const {
|
||||||
return (kernel_2.sign_at_2_object()(curve, xy()) == CGAL::ZERO);
|
CGAL_precondition(this->ptr()->_m_xy);
|
||||||
|
CGAL_precondition(this->ptr()->_m_ckva != NULL);
|
||||||
|
typename
|
||||||
|
Curved_kernel_via_analysis_2::Is_on_2 ck_is_on =
|
||||||
|
this->ptr()->_m_ckva->is_on_2_object();
|
||||||
|
|
||||||
|
return ck_is_on(*this, curve);
|
||||||
}
|
}
|
||||||
|
|
||||||
//! comparison operators (only for finite points):
|
//! comparison operators (only for finite points):
|
||||||
//! equality
|
//! equality
|
||||||
bool operator == (const Self& q) const {return q.compare_xy(*this)== 0;}
|
bool operator == (const Self& q) const {
|
||||||
|
return q.compare_xy(*this) == CGAL::EQUAL;
|
||||||
|
}
|
||||||
|
|
||||||
//! inequality
|
//! inequality
|
||||||
bool operator != (const Self& q) const {return q.compare_xy(*this)!= 0;}
|
bool operator != (const Self& q) const {return q.compare_xy(*this)!= 0;}
|
||||||
|
|
@ -385,9 +424,7 @@ protected:
|
||||||
/*! \brief
|
/*! \brief
|
||||||
* sets boundary type and location of a point in parameter space
|
* sets boundary type and location of a point in parameter space
|
||||||
*/
|
*/
|
||||||
void _set_boundary(/*CGAL::Arr_boundary_type bnd,*/
|
void _set_boundary(CGAL::Arr_parameter_space loc) const {
|
||||||
CGAL::Arr_parameter_space loc) const {
|
|
||||||
//this->ptr()->_m_boundary = bnd;
|
|
||||||
this->ptr()->_m_location = loc;
|
this->ptr()->_m_location = loc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -396,20 +433,16 @@ protected:
|
||||||
os << "loc=" << location();
|
os << "loc=" << location();
|
||||||
}
|
}
|
||||||
|
|
||||||
//! befriending \c Arc_2 class
|
|
||||||
//template < class CKvA_2, class Arc_2, class ArcRep >
|
|
||||||
friend class CGALi::Arc_2_base<
|
|
||||||
Curved_kernel_via_analysis_2,
|
|
||||||
typename Curved_kernel_via_analysis_2::Arc_2
|
|
||||||
>;
|
|
||||||
|
|
||||||
//!@}
|
//!@}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/*!\relates Point_2
|
|
||||||
* \brief
|
//!\name IO
|
||||||
* output operator
|
//!@{
|
||||||
*/
|
|
||||||
|
/*!\brief
|
||||||
|
* writes point to \c os
|
||||||
|
*/
|
||||||
void write(std::ostream& os) const {
|
void write(std::ostream& os) const {
|
||||||
|
|
||||||
switch(::CGAL::get_mode(os)) {
|
switch(::CGAL::get_mode(os)) {
|
||||||
|
|
@ -457,8 +490,21 @@ public:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//!@}
|
||||||
|
|
||||||
|
// friends ////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
//! befriending \c Arc_2_base_rep class
|
||||||
|
friend class Arc_2_base_rep< Curved_kernel_via_analysis_2 >;
|
||||||
|
|
||||||
|
//! befriending the construction
|
||||||
|
friend class
|
||||||
|
CGALi::Curved_kernel_via_analysis_2_Functors::
|
||||||
|
Construct_point_2< Curved_kernel_via_analysis_2, Self >;
|
||||||
|
|
||||||
}; // class Point_2
|
}; // class Point_2
|
||||||
|
|
||||||
|
|
||||||
/*!\relates Point_2
|
/*!\relates Point_2
|
||||||
* \brief
|
* \brief
|
||||||
* output operator
|
* output operator
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue