#include <octave/oct.h>
#include <vector>
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/polygon.hpp>
#include <boost/geometry/geometries/adapted/boost_polygon.hpp>
using namespace boost::geometry;
typedef boost::polygon::polygon_data<int> polygon;
typedef boost::polygon::polygon_traits<polygon>::point_type point;
DEFUN_DLD (ispolycw, args, ,
"Check if polygon points are clockwise")
{
/*
TODO: Check if args are valid first
*/
if(args(0).length()<=2)
{
return octave_value_list (octave_value(true));
}
std::vector<point> pts;
for(int j=0;j<args(0).length();j++)
{
point p=boost::polygon::construct<point>(args(0).fast_elem_extract(j).float_value()
,args(1).fast_elem_extract(j).float_value());
pts.push_back(p);
}
if(pts[0]!=pts[pts.size()-1])
{
pts.push_back(pts[0]);
}
polygon poly;
boost::polygon::set_points(poly, pts.begin(), pts.end());
bool iscw=boost::geometry::area(poly)>0?1:0;
return octave_value_list (octave_value(iscw));
/*
*
*Test1: Clockwise Polygon
*>> ispolycw([0 1 2],[0 3 0])
*ans = 1
*
*
*Test2: A CounterClockwise Polygon
*>> ispolycw([0 2 1],[0 0 3])
*ans = 0
*
*
*Test3: A Polygon of less than three vertices
*>> ispolycw([0 1],[0 3])
*ans = 1
*
*/
}
I2luY2x1ZGUgPG9jdGF2ZS9vY3QuaD4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGJvb3N0L2dlb21ldHJ5LmhwcD4KI2luY2x1ZGUgPGJvb3N0L2dlb21ldHJ5L2dlb21ldHJpZXMvcG9seWdvbi5ocHA+CiNpbmNsdWRlIDxib29zdC9nZW9tZXRyeS9nZW9tZXRyaWVzL2FkYXB0ZWQvYm9vc3RfcG9seWdvbi5ocHA+Cgp1c2luZyBuYW1lc3BhY2UgYm9vc3Q6Omdlb21ldHJ5Owp0eXBlZGVmIGJvb3N0Ojpwb2x5Z29uOjpwb2x5Z29uX2RhdGE8aW50PiBwb2x5Z29uOwp0eXBlZGVmIGJvb3N0Ojpwb2x5Z29uOjpwb2x5Z29uX3RyYWl0czxwb2x5Z29uPjo6cG9pbnRfdHlwZSBwb2ludDsKCkRFRlVOX0RMRCAoaXNwb2x5Y3csIGFyZ3MsICwKICAgICAgICAgICAiQ2hlY2sgaWYgcG9seWdvbiBwb2ludHMgYXJlIGNsb2Nrd2lzZSIpCnsKICAvKgogIAlUT0RPOiBDaGVjayBpZiBhcmdzIGFyZSB2YWxpZCBmaXJzdAogICovCiAgCiAgaWYoYXJncygwKS5sZW5ndGgoKTw9MikKICB7CiAgICByZXR1cm4gb2N0YXZlX3ZhbHVlX2xpc3QgKG9jdGF2ZV92YWx1ZSh0cnVlKSk7CiAgfQogIAogIHN0ZDo6dmVjdG9yPHBvaW50PiBwdHM7CiAgZm9yKGludCBqPTA7ajxhcmdzKDApLmxlbmd0aCgpO2orKykKICB7CiAgICBwb2ludCBwPWJvb3N0Ojpwb2x5Z29uOjpjb25zdHJ1Y3Q8cG9pbnQ+KGFyZ3MoMCkuZmFzdF9lbGVtX2V4dHJhY3QoaikuZmxvYXRfdmFsdWUoKQogICAgICAsYXJncygxKS5mYXN0X2VsZW1fZXh0cmFjdChqKS5mbG9hdF92YWx1ZSgpKTsKICAgIHB0cy5wdXNoX2JhY2socCk7CiAgfQogIAogIGlmKHB0c1swXSE9cHRzW3B0cy5zaXplKCktMV0pCiAgewogICAgcHRzLnB1c2hfYmFjayhwdHNbMF0pOwogIH0KICAKICBwb2x5Z29uIHBvbHk7CiAgYm9vc3Q6OnBvbHlnb246OnNldF9wb2ludHMocG9seSwgcHRzLmJlZ2luKCksIHB0cy5lbmQoKSk7CiAgYm9vbCBpc2N3PWJvb3N0OjpnZW9tZXRyeTo6YXJlYShwb2x5KT4wPzE6MDsKICAKICByZXR1cm4gb2N0YXZlX3ZhbHVlX2xpc3QgKG9jdGF2ZV92YWx1ZShpc2N3KSk7CiAgCgogIC8qCiAgKgogICpUZXN0MTogQ2xvY2t3aXNlIFBvbHlnb24KICAqPj4gaXNwb2x5Y3coWzAgMSAyXSxbMCAzIDBdKQogICphbnMgPSAgMQogICoKICAqCiAgKlRlc3QyOiBBIENvdW50ZXJDbG9ja3dpc2UgUG9seWdvbgogICo+PiBpc3BvbHljdyhbMCAyIDFdLFswIDAgM10pCiAgKmFucyA9IDAKICAqCiAgKgogICpUZXN0MzogQSBQb2x5Z29uIG9mIGxlc3MgdGhhbiB0aHJlZSB2ZXJ0aWNlcwogICo+PiBpc3BvbHljdyhbMCAxXSxbMCAzXSkKICAqYW5zID0gIDEKICAqCiAgKi8KICAKfQ==