#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 the polygon's orientation is clockwise or not")
{
/*
TODO: Check if args are valid first
*/
std::vector<point> pts;
point p;
for(int j=0;j<args(0).length();j++)
{
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));
}
I2luY2x1ZGUgPG9jdGF2ZS9vY3QuaD4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGJvb3N0L2dlb21ldHJ5LmhwcD4KI2luY2x1ZGUgPGJvb3N0L2dlb21ldHJ5L2dlb21ldHJpZXMvcG9seWdvbi5ocHA+CiNpbmNsdWRlIDxib29zdC9nZW9tZXRyeS9nZW9tZXRyaWVzL2FkYXB0ZWQvYm9vc3RfcG9seWdvbi5ocHA+Cgp1c2luZyBuYW1lc3BhY2UgYm9vc3Q6Omdlb21ldHJ5Owp0eXBlZGVmIGJvb3N0Ojpwb2x5Z29uOjpwb2x5Z29uX2RhdGE8aW50PiBwb2x5Z29uOwp0eXBlZGVmIGJvb3N0Ojpwb2x5Z29uOjpwb2x5Z29uX3RyYWl0czxwb2x5Z29uPjo6cG9pbnRfdHlwZSBwb2ludDsKCkRFRlVOX0RMRCAoaXNwb2x5Y3csIGFyZ3MsICwKICAgICAgICAgICAiQ2hlY2sgaWYgdGhlIHBvbHlnb24ncyBvcmllbnRhdGlvbiBpcyBjbG9ja3dpc2Ugb3Igbm90IikKewogIC8qCiAgVE9ETzogQ2hlY2sgaWYgYXJncyBhcmUgdmFsaWQgZmlyc3QKICAqLwogIHN0ZDo6dmVjdG9yPHBvaW50PiBwdHM7CiAgcG9pbnQgcDsKICBmb3IoaW50IGo9MDtqPGFyZ3MoMCkubGVuZ3RoKCk7aisrKQogIHsKICAgIHA9Ym9vc3Q6OnBvbHlnb246OmNvbnN0cnVjdDxwb2ludD4KICAgIAkoYXJncygwKS5mYXN0X2VsZW1fZXh0cmFjdChqKS5mbG9hdF92YWx1ZSgpLGFyZ3MoMSkuZmFzdF9lbGVtX2V4dHJhY3QoaikuZmxvYXRfdmFsdWUoKSk7CiAgICBwdHMucHVzaF9iYWNrKHApOwogIH0KICAKICBpZihwdHNbMF0hPXB0c1twdHMuc2l6ZSgpLTFdKQogIHsKICAgIHB0cy5wdXNoX2JhY2socHRzWzBdKTsKICB9CiAgCiAgcG9seWdvbiBwb2x5OwogIGJvb3N0Ojpwb2x5Z29uOjpzZXRfcG9pbnRzKHBvbHksIHB0cy5iZWdpbigpLCBwdHMuZW5kKCkpOwogIGJvb2wgaXNjdz1ib29zdDo6Z2VvbWV0cnk6OmFyZWEocG9seSk+MD8xOjA7CiAgcmV0dXJuIG9jdGF2ZV92YWx1ZV9saXN0IChvY3RhdmVfdmFsdWUoaXNjdykpOwogIAp9