这个问题很有趣,上面一个问题是给定一个点,判断是否在四边形内, 这个问题正好是返过来
思路1, 随机一个位置, 判断是否在四边形内。不是的话就重新随机
答:这个方法好low
于是就有了思路2
思路2,取四个点的minX, maxX, 然后根据X, 求出这个X值在四条边上的点的位置(有可能相交, 有可能不相交,不相交的话就不考虑进去)
如图
这个时候再随机A和B之间就得到了Y值,和之前取出的X值就构成了一个点。 完成。 上代码
代码是lua写的
local pos1 = cc.p(200, 200)
local pos2 = cc.p(500, 200)
local pos3 = cc.p(450, 500)
local pos4 = cc.p(150, 500)
local minx = math.min(pos1.x, pos2.x, pos3.x, pos4.x)
local maxx = math.max(pos1.x, pos2.x, pos3.x, pos4.x)
local miny = math.min(pos1.y, pos2.y, pos3.y, pos4.y)
local maxy = math.max(pos1.y, pos2.y, pos3.y, pos4.y)
local function GetCross(p1, p2, p)
return (p2.x - p1.x) * (p.y - p1.y) - (p.x - p1.x) * (p2.y - p1.y);
end
-- // 计算 |p1 p2| X |p1 p|
-- function GetCross(p1: Point, p2: Point, p: Point) {
-- return (p2.x - p1.x) * (p.y - p1.y) - (p.x - p1.x) * (p2.y - p1.y);
-- }
-- //判断点p是否在p1p2p3p4的四方形内
function IsPointInMatrix(p1, p2, p3, p4, p)
local isPointIn = GetCross(p1, p2, p) * GetCross(p3, p4, p) >= 0 and GetCross(p2, p3, p) * GetCross(p4, p1, p) >= 0;
return isPointIn;
end
function randPoint( ... )
--确定下X值
local x = math.random(minx, maxx)
-- local x = 181
-- 计算下四条线上, 当前X值的有效范围
-- 线的公式是 f(x) = x + n
local getY1 = function(p1, p2, num)
local max = math.max(p1.x, p2.x)
local min = math.min(p1.x, p2.x)
if num < min or num > max then
-- print("超出范围 getY1", num, max, num)
return -1
end
if max == min then
if num == max then
return p1.y
else
return -1
end
end
local n1 = (p2.y - p1.y)/(p2.x - p1.x)
print("n1", n1, p2.y, p1.y, p2.x, p1.x)
local numy = (num - p1.x) * n1 + p1.y
return numy
end
local y1 = getY1(pos1, pos2, x)
local y2 = getY1(pos2, pos3, x)
local y3 = getY1(pos3, pos4, x)
local y4 = getY1(pos4, pos1, x)
print("获取的第一个值是Y", x, y1, y2, y3, y4)
local point = {}
if y1 ~= -1 then
table.insert(point, y1)
end
if y2 ~= -1 then
table.insert(point, y2)
end
if y3 ~= -1 then
table.insert(point, y3)
end
if y4 ~= -1 then
table.insert(point, y4)
end
local y = math.random(point[1], point[2])
print("最终值", x, y, point[1], point[2])
--检测是否在矩形内
local inPoint = IsPointInMatrix(pos1,pos2,pos3,pos4, cc.p(x, y))
if not inPoint then
else
end
end
好没有技术含量呀, 怪我太菜,后面写有技术难度的算法
算法适用凸多边形