CGAL::Exact_predicates_inexact_constructions_kernel CGAL::Exact_predicates_exact_constructions_kernel CGAL::Exact_predicates_exact_constructions_kernel_with_sqrt |
#include <CGAL/MP_Float.h>
#include <CGAL/Homogeneous.h>
typedef CGAL::Homogeneous<CGAL::MP_Float> Kernel
typedef Kernel::Point_2 Point_2
int main()
{
Point_2 p(0,0), q(10,3), r(12,19);
if (CGAL::orientation(q,p,r) == CGAL::LEFT_TURN)
return 0;
return 1
}
|
#include <CGAL/MP_Float.h>
#include <CGAL/Homogeneous.h>
typedef CGAL::Homogeneous<CGAL::MP_Float> Kernel
typedef Kernel::Point_2 Point_2
typedef Kernel::Orientation_2 Orientation_2;
int main()
{
Orientation_2 orientation = traits.orientation_2_object();
Point_2 p(0,0), q(10,3), r(12,19);
if (orientation(q,p,r) == CGAL::LEFT_TURN)
return 0;
return 1
}
|
template <class Iterator, class Output, class Traits>
Output
upper_hull1(Iterator first, Iterator beyond, Output result, Traits traits)
{
typename Traits::Less_xy_2 less_xy = traits.less_xy_2_object();
typename Traits::Left_turn_2 left_turn = traits.left_turn_2_object();
if (first == beyond) // empty sequence
return result;
std::sort(first, beyond, less_xy); // lexicographic sorting
std::vector<typename Traits::Point_2> hull;
hull.push_back(*first); // sentinel
hull.push_back(*first);
// upper convex hull (left to right)
for (++first; first != beyond; ++first) {
while (left_turn(hull.end()[-2], hull.back(), *first))
hull.pop_back();
hull.push_back(*first);
}
return std::copy(hull.begin() + 1, hull.end(), result); // return result
}
|
template <class Iterator, class Output, class Traits>
Output
upper_hull2(Iterator first, Iterator beyond, Output result, Traits traits)
{
typename Traits::Less_xy_2 less_xy = traits.less_xy_2_object();
typename Traits::Left_turn_2 left_turn = traits.left_turn_2_object();
if (first == beyond) // empty sequence
return result;
std::sort(first, beyond, less_xy); // lexicographic sorting
std::vector<typename Traits::Point_2> hull;
hull.push_back(*first); // sentinel
typename Traits::Point_2 p = *first; // last point on the hull
++first; // next candidate for hull point
// scan all points from left to right for upper convex hull
for (; first != beyond; ++first) {
while (left_turn(hull.back(), p, *first)) {
p = hull.back();
hull.pop_back();
}
hull.push_back(p);
p = *first;
}
hull.push_back(p);
return std::copy(hull.begin() + 1, hull.end(), result); // return result
}
|
template <class Iterator, class Output, class Traits>
Output
upper_hull3(Iterator first, Iterator beyond, Output result, Traits traits)
{
typename Traits::Less_xy_2 less_xy = traits.less_xy_2_object();
typename Traits::Left_turn_2 left_turn = traits.left_turn_2_object();
if (first == beyond) // empty sequence
return result;
std::sort(first, beyond, less_xy); // lexicographic sorting
std::vector<Iterator> hull;
hull.push_back(first); // sentinel
Iterator p = first; // last point on the hull
++first; // next candidate for hull point
// scan all points from left to right for upper convex hull
for (; first != beyond; ++first) {
while (left_turn(*(hull.back()), *p, *first)) {
p = hull.back();
hull.pop_back();
}
hull.push_back(p);
p = first;
}
typename std::vector<Iterator>::iterator i = hull.begin();
++i; // skip sentinel
while (i != hull.end())
*result++ = **i++;
return result;
}
|
template <class Iterator, class Pred> // bidirectional iterator
Iterator remove_if_triple(Iterator first, Iterator beyond, Pred pred)
{
if (first == beyond)
return first;
// setup iterators i,j,k for scanning triples
Iterator i = first, j = first;
if (++j == beyond) // i,j mark two elements on top of stack
return j;
Iterator k = j; // k marks the third value in the sequence
while (++k != beyond) {
while ((pred(*i, *j, *k))) {
j = i; // remove one element from stack
if (i == first) // explicit test for stack underflow
break;
--i; // remove one element from the stack, part 2
}
i = j; // push new element from k on stack
++j;
*j = *k;
}
return ++j;
}
template <class Iterator, class Output, class Traits>
Output upper_hull(Iterator first, Iterator beyond, Output result, Traits traits)
{
typename Traits::Less_xy_2 less_xy = traits.less_xy_2_object();
typename Traits::Left_turn_2 left_turn = traits.left_turn_2_object();
if (first == beyond) // empty sequence
return result;
std::sort(first, beyond, less_xy); // lexicographic sorting
Iterator hull_end = remove_if_triple(first, beyond, left_turn);
return std::copy(first, hull_end, result);
}
|