\( \newcommand{\E}{\mathrm{E}} \) \( \newcommand{\A}{\mathrm{A}} \) \( \newcommand{\R}{\mathrm{R}} \) \( \newcommand{\N}{\mathrm{N}} \) \( \newcommand{\Q}{\mathrm{Q}} \) \( \newcommand{\Z}{\mathrm{Z}} \) \( \def\ccSum #1#2#3{ \sum_{#1}^{#2}{#3} } \def\ccProd #1#2#3{ \sum_{#1}^{#2}{#3} }\)
CGAL 4.4 - 2D and 3D Linear Geometry Kernel
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Groups Pages
CGAL::Filtered_predicate< EP, FP, C2E, C2F > Class Template Reference

#include <CGAL/Filtered_predicate.h>

Definition

Filtered_predicate is an adaptor for predicate function objects that allows one to produce efficient and exact predicates.

It is used to build CGAL::Filtered_kernel<CK> and can be used for other predicates too.

EP is the exact but supposedly slow predicate that is able to evaluate the predicate correctly. It will be called only when the filtering predicate, FP, cannot compute the correct result. This failure of FP must be done by throwing an exception.

To convert the geometric objects that are the arguments of the predicate, we use the function objects C2E and C2F, which must be of the form Cartesian_converter or Homogeneous_converter.

Example

The following example defines an efficient and exact version of the orientation predicate over three points using the Cartesian representation with double coordinates and without reference counting (Simple_cartesian::Point_2). Of course, the orientation predicate can already be found in the kernel, but you can follow this example to filter your own predicates. It uses the fast but inexact predicate based on interval arithmetic for filtering and the slow but exact predicate based on multi-precision floats when the filtering predicate fails.


File Filtered_kernel/Filtered_predicate.cpp

#include <CGAL/Simple_cartesian.h>
#include <CGAL/Filtered_predicate.h>
#include <CGAL/MP_Float.h>
#include <CGAL/Cartesian_converter.h>
// Define my predicate, parameterized by a kernel.
template < typename K >
struct My_orientation_2
{
typedef typename K::RT RT;
typedef typename K::Point_2 Point_2;
typedef typename K::Orientation result_type;
operator()(const Point_2 &p, const Point_2 &q, const Point_2 &r) const
{
RT prx = p.x() - r.x();
RT pry = p.y() - r.y();
RT qrx = q.x() - r.x();
RT qry = q.y() - r.y();
return CGAL::sign( prx*qry - qrx*pry );
}
};
My_orientation_2<FK>, C2E, C2F> Orientation_2;
int main()
{
K::Point_2 p(1,2), q(2,3), r(3,4);
Orientation_2 orientation;
orientation(p, q, r);
return 0;
}
Examples:
Filtered_kernel/Filtered_predicate.cpp.

Types

typedef FP::result_type result_type
 The return type of the function operators. More...
 

Creation

 Filtered_predicate ()
 Default constructor.
 

Operations

Similar function operators are defined for up to 7 arguments.

template<class A1 >
result_type operator() (A1 a1)
 The unary function operator for unary predicates.
 
template<class A1 , class A2 >
result_type operator() (A1 a1, A2 a2)
 The binary function operator for binary predicates.
 

Member Typedef Documentation

template<typename EP , typename FP , typename C2E , typename C2F >
typedef FP::result_type CGAL::Filtered_predicate< EP, FP, C2E, C2F >::result_type

The return type of the function operators.

It must also be the same type as EP::result_type.