cgal/Packages/Partition_2/include/CGAL/is_degenerate_polygon_2.h

89 lines
2.4 KiB
C++

// ============================================================================
//
// Copyright (c) 2000 The CGAL Consortium
//
// This software and related documentation is part of an INTERNAL release
// of the Computational Geometry Algorithms Library (CGAL). It is not
// intended for general use.
//
// ----------------------------------------------------------------------------
//
// release : $CGAL_Revision $
// release_date : $CGAL_Date $
//
// file : include/CGAL/is_degenerate_polygon_2.h
// package : $CGAL_Package: Partition_2 $
// maintainer : Susan Hert <hert@mpi-sb.mpg.de>
// chapter : Planar Polygon Partitioning
//
// revision : $Revision$
// revision_date : $Date$
//
// author(s) : Susan Hert <hert@mpi-sb.mpg.de>
//
// coordinator : MPI (Susan Hert <hert@mpi-sb.mpg.de>)
//
// implementation: test for degenerate polygon with collinear vertices
// ============================================================================
#ifndef CGAL_IS_DEGENERATE_POLYGON_2_H
#define CGAL_IS_DEGENERATE_POLYGON_2_H
namespace CGAL {
// tests if a sequence of points represents a degenerate polygon (i.e.
// one of zero area)
template<class BidirectionalIterator, class Traits>
bool
is_degenerate_polygon_2(BidirectionalIterator first,
BidirectionalIterator last,
const Traits& traits)
{
if (first == last) return true;
BidirectionalIterator prev = last;
prev--;
BidirectionalIterator curr = first;
BidirectionalIterator next = first;
next++;
// fewer than three vertices
if (prev == first) return true;
if (next == last) return true;
typedef typename Traits::Orientation_2 Orientation_2;
Orientation_2 orientation = traits.orientation_2_object();
while (curr != last)
{
if (orientation(*prev, *curr, *next) != COLLINEAR)
return false;
prev++;
if (prev == last)
prev = first;
next++;
if (next == last)
next = first;
curr++;
}
return true;
}
template<class InputIterator>
bool
is_degenerate_polygon_2(InputIterator first, InputIterator last)
{
if (first == last) return true;
typedef typename std::iterator_traits<InputIterator>::value_type Point_2;
typedef typename Kernel_traits<Point_2>::Kernel K;
return is_degenerate_polygon_2(first, last, K());
}
}
#endif // CGAL_IS_DEGENERATE_POLYGON_2_H