lua 已知几个点 求坐标是否落在 几个点连线的区域内
问题 :
lua 已知几个点 求坐标是否落在 几个点连线的区域内
#### 回答:
对于已知的几个点,我们可以将它们按照顺序连接起来,形成一个多边形。判断一个点是否在这个多边形内可以使用射线法。
具体做法如下:
-
将多边形的顶点按照逆时针方向排列,这里假设多边形有n个顶点
-
假设点P的坐标为(px, py),画一条从P出发的水平射线,如果这条射线与多边形的某个边平行,那么我们就忽略。
-
如果这条射线与多边形的某个边相交,那么就记录下交点的横坐标x,统计有多少个顶点的横坐标小于x。
-
如果这个数量是奇数,那么点P就在多边形内部,否则就在多边形外部。
代码实现如下(假设已知点的坐标存储在一个表中,形如{{x1, y1}, {x2, y2}, …}):
function is_point_in_polygon(x, y, poly)
local n = #poly
local count = 0
for i = 1, n do
local p1 = poly[i]
local p2 = poly[i % n + 1]
-- 不考虑水平的边
if p1[2] ~= p2[2] then
local x0 = (y - p1[2]) * (p2[1] - p1[1]) / (p2[2] - p1[2]) + p1[1]
-- 统计交点的数量
if x0 < x then
count = count + 1
end
end
end
return count % 2 == 1
end
使用方法:
local poly = {{1, 1}, {3, 4}, {5, 2}, {2, -2}} -- 一个四边形
local x, y = 2.5, 1.5 -- 待判断的点坐标
if is_point_in_polygon(x, y, poly) then
print(\"在多边形内部\")
else
print(\"在多边形外部\")
end