mirror of https://github.com/CGAL/cgal
89 lines
2.4 KiB
C++
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
|