记录使用到的区域限制:使用公式计算,可以减少的模板图片和一些耗性能的技术(如:刚体)
凸多边形的区域判定:向量法(还知道一个,射线法,原理很简单,,就是从点延伸一条射线,奇数是在内部的,偶数是在外部的,,,当然有切线的可能需要判断一下,,暂时没空写)
函数先写在这里,下次找机会解释
– 点是否在多边形内
– posList:多边形顶点坐标(逆时针排序), posTarget:要判断点的坐标
function M:bPointInPolygon(posList, posTarget)
local polygenSides = #posList -- 多边形边数
local bIn = true -- 是否在多边形内
for i = 1, polygenSides do
local Xa, Ya = posList[i].x, posList[i].y -- 首坐标 a
local Xb, Yb = posList[i].x, posList[i].y -- 尾坐标 b
local Xp, Yp = posTarget.x, posTarget.y -- 目标坐标 p
if posList[i + 1] then
Xb, Yb = posList[i + 1].x, posList[i + 1].y
else
Xb, Yb = posList[1].x, posList[1].y -- 最后一个点 需要与第一个点连成线段
end
-- 向量ab = (Xb, Yb) - (Xa, Ya)
local pointAB = {x = Xb - Xa, y = Yb - Ya}
local pointAP = {x = Xp - Xa, y = Yp - Ya}
-- 向量ab、向量ap叉积
local flag = pointAB.x * pointAP.y - pointAP.x * pointAB.y
-- 这种情况 点不在多边形内
if flag <= 0 then
bIn = false
break
end
end
return bIn
end
椭圆的区域限制:
-- 点是否在椭圆内
function M:ellipseRestriction()
local aValue = 160
local bValue = 70
-- 圆心
local center = cc.p(482 + X_OFFSET, 244)
-- 判定公式
local judge = (self:point().x - center.x) * (self:point().x - center.x)/(aValue * aValue)
+ (self:point().y - center.y) * (self:point().y - center.y)/(bValue * bValue)
if judge <= 1 then
return true
else
return false
end
end