在不规则四边形的内部随机一个点

问题:给定一个非平行四边形,在内部随机一个点。

此问题只针对【凸多边形

这个问题很有趣,上面一个问题是给定一个点,判断是否在四边形内, 这个问题正好是返过来
思路1, 随机一个位置, 判断是否在四边形内。不是的话就重新随机
答:这个方法好low
于是就有了思路2
思路2,取四个点的minX, maxX, 然后根据X, 求出这个X值在四条边上的点的位置(有可能相交, 有可能不相交,不相交的话就不考虑进去)

如图
在不规则四边形的内部随机一个点_第1张图片
这个时候再随机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

好没有技术含量呀, 怪我太菜,后面写有技术难度的算法
算法适用凸多边形

你可能感兴趣的:(Lua,点与四边形)