两线段的交集或重叠
2017-8-3 9:33:58
收藏:0
阅读:214
评论:1
给定两个由两个点定义的线段,如何最有效地确定它们的交集或重叠?
交集被定义为两个线段相交,实际接触。 重叠被定义为两端点具有相同的 x 值或相同的 y 值,但同时至少一个端点位于另一条线段的点之间。
我之所以问这个问题,是因为我想找到一种计算两者并返回交点的例程,即使它具有相同位置的两个点(交点而不是重叠)。
使用 Lua,我计算重叠的函数是:
local function getParallelLineOverlap( ax, ay, bx, by, cx, cy, dx, dy )
local function sortAB( a, b )
return math.min( a, b ), math.max( a, b )
end
ax, bx = sortAB( ax, bx )
cx, dx = sortAB( cx, dx )
local OverlapInterval = nil
if (bx - cx >= 0 and dx - ax >=0 ) then
OverlapInterval = { math.max(ax, cx), math.min(bx, dx) }
end
return OverlapInterval
end
另外使用 Lua,我计算交点的函数是:
local function doLinesIntersect( a, b, c, d )
-- 参数转换
local L1 = {X1=a.x,Y1=a.y,X2=b.x,Y2=b.y}
local L2 = {X1=c.x,Y1=c.y,X2=d.x,Y2=d.y}
-- 计算 ua 和 ub 的分母相同,因此存储此计算
local _d = (L2.Y2 - L2.Y1) * (L1.X2 - L1.X1) - (L2.X2 - L2.X1) * (L1.Y2 - L1.Y1)
-- 确保没有被零除 - 这也表示线条平行
-- 如果 n_a 和 n_b 都等于零,线段将彼此在上方
-- 其他(巧合)的。未执行此检查,因为它不是这个实现所必需的
if (_d == 0) then
return false
end
-- 对于可读性,n_a 和 n_b 被计算为独立的值
local n_a = (L2.X2 - L2.X1) * (L1.Y1 - L2.Y1) - (L2.Y2 - L2.Y1) * (L1.X1 - L2.X1)
local n_b = (L1.X2 - L1.X1) * (L1.Y1 - L2.Y1) - (L1.Y2 - L1.Y1) * (L1.X1 - L2.X1)
-- 计算线段可能相交的中间分数点
local ua = n_a / _d
local ub = n_b / _d
-- 如果线段相交,分数点将在 0 和 1 之间(含)
-- 如果分数计算大于 1 或小于 0,则需要更长的线段才能相交。
if (ua >= 0 and ua <= 1 and ub >= 0 and ub <= 1) then
local x = L1.X1 + (ua * (L1.X2 - L1.X1))
local y = L1.Y1 + (ua * (L1.Y2 - L1.Y1))
return {x=x, y=y}
end
return false
end
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

以下是我的解决方案:
function get_intersection (ax, ay, bx, by, cx, cy, dx, dy) -- 开始 结束 开始 结束 local d = (ax-bx)*(cy-dy)-(ay-by)*(cx-dx) if d == 0 then return end -- 他们是平行的 local a, b = ax*by-ay*bx, cx*dy-cy*dx local x = (a*(cx-dx) - b*(ax-bx))/d local y = (a*(cy-dy) - b*(ay-by))/d if x <= math.max(ax, bx) and x >= math.min(ax, bx) and x <= math.max(cx, dx) and x >= math.min(cx, dx) then -- 在两条线段的起点和终点之间 return {x=x, y=y} end end