From 3bd05a7ab15a835a233bde397b424fcfec4d6842 Mon Sep 17 00:00:00 2001 From: Jan-Tarek Butt Date: Sat, 20 Apr 2019 00:29:21 +0200 Subject: [PATCH] package/libgluonmath: add math lib for gauss jordan Ponit in Polygon algorithm Signed-off-by: Jan-Tarek Butt --- package/libgluonmath/Makefile | 15 ++++ .../luasrc/usr/lib/lua/gluon/math.lua | 69 +++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 package/libgluonmath/Makefile create mode 100644 package/libgluonmath/luasrc/usr/lib/lua/gluon/math.lua diff --git a/package/libgluonmath/Makefile b/package/libgluonmath/Makefile new file mode 100644 index 00000000..36c4c8fa --- /dev/null +++ b/package/libgluonmath/Makefile @@ -0,0 +1,15 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=libgluonmath +PKG_VERSION:=1 +CMAKE_INSTALL:=1 + +include $(INCLUDE_DIR)/package.mk + +define Package/libgluonmath + SECTION:=libs + CATEGORY:=Libraries + TITLE:=Gluon math library +endef + +$(eval $(call BuildPackage,libgluonmath)) diff --git a/package/libgluonmath/luasrc/usr/lib/lua/gluon/math.lua b/package/libgluonmath/luasrc/usr/lib/lua/gluon/math.lua new file mode 100644 index 00000000..bb09fa68 --- /dev/null +++ b/package/libgluonmath/luasrc/usr/lib/lua/gluon/math.lua @@ -0,0 +1,69 @@ +local M = {} + +-- Source with pseudocode: https://de.wikipedia.org/wiki/Punkt-in-Polygon-Test_nach_Jordan +-- see also https://en.wikipedia.org/wiki/Point_in_polygon +-- parameters: points A = (x_a,y_a), B = (x_b,y_b), C = (x_c,y_c) +-- return value: −1 if the ray from A to the right bisects the edge [BC] (the lower vortex of [BC] +-- is not seen as part of [BC]); +-- 0 if A is on [BC]; +-- +1 else +function M.cross_prod_test(x_a,y_a,x_b,y_b,x_c,y_c) + if y_a == y_b and y_b == y_c then + if (x_b <= x_a and x_a <= x_c) or (x_c <= x_a and x_a <= x_b) then + return 0 + end + return 1 + end + if not ((y_a == y_b) and (x_a == x_b)) then + if y_b > y_c then + -- swap b and c + local h = x_b + x_b = x_c + x_c = h + h = y_b + y_b = y_c + y_c = h + end + if (y_a <= y_b) or (y_a > y_c) then + return 1 + end + local delta = (x_b-x_a) * (y_c-y_a) - (y_b-y_a) * (x_c-x_a) + if delta > 0 then + return 1 + elseif delta < 0 then + return -1 + end + end + return 0 +end + +-- Source with pseudocode: https://de.wikipedia.org/wiki/Punkt-in-Polygon-Test_nach_Jordan +-- see also: https://en.wikipedia.org/wiki/Point_in_polygon +-- let P be a 2D Polygon and Q a 2D Point +-- return value: +1 if Q within P; +-- −1 if Q outside of P; +-- 0 if Q on an edge of P +function M.point_in_polygon(poly, point) + local t = -1 + for i=1,#poly-1 do + t = t * M.cross_prod_test(point.lon,point.lat,poly[i].lon,poly[i].lat,poly[i+1].lon,poly[i+1].lat) + if t == 0 then break end + end + return t +end + +-- Convert Rectengular defined by two point into polygon +function M.two_point_rec_to_poly(rec) + local poly = {}; + poly[1]["lon"] = rec[1].lon + poly[1]["lat"] = rec[1].lat + poly[2]["lon"] = rec[2].lon + poly[2]["lat"] = rec[1].lat + poly[3]["lon"] = rec[2].lon + poly[3]["lat"] = rec[2].lat + poly[4]["lon"] = rec[1].lon + poly[4]["lat"] = rec[2].lat + return poly +end + +return M