# Commits

committed ce07346

Checks whether a given polygon is convex or not.

# src/modules/math/MathModule.cpp

` `
` // LOVE`
` #include "MathModule.h"`
`+#include "common/Vector.h"`
` `
` // STL`
` #include <cmath>`
` 	return triangles;`
` }`
` `
`+bool Math::isConvex(const std::vector<vertex> &polygon)`
`+{`
`+	if (polygon.size() < 3)`
`+		return false;`
`+`
`+	// a polygon is convex if all corners turn in the same direction`
`+	// turning direction can be determined using the cross-product of`
`+	// the forward difference vectors`
`+	size_t i = polygon.size() - 2, j = polygon.size() - 1, k = 0;`
`+	Vector p(polygon[j].x - polygon[i].x, polygon[j].y - polygon[i].y);`
`+	Vector q(polygon[k].x - polygon[j].x, polygon[k].y - polygon[j].y);`
`+	float winding = p ^ q;`
`+`
`+	while (k+1 < polygon.size())`
`+	{`
`+		i = j; j = k; k++;`
`+		p.x = polygon[j].x - polygon[i].x;`
`+		p.y = polygon[j].y - polygon[i].y;`
`+		q.x = polygon[k].x - polygon[j].x;`
`+		q.y = polygon[k].y - polygon[j].y;`
`+`
`+		if ((p^q) * winding < 0)`
`+			return false;`
`+	}`
`+	return true;`
`+}`
`+`
` } // math`
` } // love`

# src/modules/math/MathModule.h

` 	std::vector<Triangle> triangulate(const std::vector<vertex> &polygon);`
` `
` 	/**`
`+	 * Checks whether a polygon is convex.`
`+	 *`
`+	 * @param polygon Polygon to test.`
`+	 * @return True if the polygon is convex, false otherwise.`
`+	 **/`
`+	bool isConvex(const std::vector<vertex> &polygon);`
`+`
`+	/**`
` 	 * Calculate Simplex noise for the specified coordinate(s).`
` 	 *`
` 	 * @return Noise value in the range of [-1,1].`

# src/modules/math/wrap_Math.cpp

` 	return 1;`
` }`
` `
`+int w_isConvex(lua_State *L)`
`+{`
`+	std::vector<vertex> vertices;`
`+	if (lua_istable(L, 1))`
`+	{`
`+		size_t top = lua_objlen(L, 1);`
`+		vertices.reserve(top / 2);`
`+		for (size_t i = 1; i <= top; i += 2)`
`+		{`
`+			lua_rawgeti(L, 1, i);`
`+			lua_rawgeti(L, 1, i+1);`
`+`
`+			vertex v;`
`+			v.x = luaL_checknumber(L, -2);`
`+			v.y = luaL_checknumber(L, -1);`
`+			vertices.push_back(v);`
`+`
`+			lua_pop(L, 2);`
`+		}`
`+	}`
`+	else`
`+	{`
`+		size_t top = lua_gettop(L);`
`+		vertices.reserve(top / 2);`
`+		for (size_t i = 1; i <= top; i += 2)`
`+		{`
`+			vertex v;`
`+			v.x = luaL_checknumber(L, i);`
`+			v.y = luaL_checknumber(L, i+1);`
`+			vertices.push_back(v);`
`+		}`
`+	}`
`+`
`+	lua_pushboolean(L, Math::instance.isConvex(vertices));`
`+	return 1;`
`+}`
`+`
` int w_noise(lua_State *L)`
` {`
` 	float w, x, y, z;`
` 	{ "randomnormal", w_randomnormal },`
` 	{ "newRandomGenerator", w_newRandomGenerator },`
` 	{ "triangulate", w_triangulate },`
`+	{ "isConvex", w_isConvex },`
` 	{ "noise", w_noise },`
` 	{ 0, 0 }`
` };`

# src/modules/math/wrap_Math.h

` int w_randomnormal(lua_State *L);`
` int w_newRandomGenerator(lua_State *L);`
` int w_triangulate(lua_State *L);`
`+int w_isConvex(lua_State *L);`
` int w_noise(lua_State *L);`
` extern "C" LOVE_EXPORT int luaopen_love_math(lua_State *L);`
` `