碰撞算法12 --多边形与点的碰撞

--定义一个多边形
local Polygon = class('Polygon')
function Polygon:Ctor(point)
    self.point = point
end
function Polygon:VectorNumber()
    return #self.point
end
function Polygon:GetVector(index)
    return self.point[index];
end

--多边形与点的碰撞
function PolygonToPoint(polygon,point)
    local vectorNum = polygon:VectorNumber();

    local collision = false
    local next = 0

    for current = 0 , vectorNum do
        if (current == vectorNum - 1) then
            next = 0
        else
            next = current + 1
        end

        local vc = polygon:GetVector(current);
        local vn = polygon:GetVector(next);
        if PointToLine(point,vc, vn) then
            return true
        end
        --若尔当曲线定理 需要的同学可以去学习一下
        if (((vc.y >= py and vn.y < py) or (vc.y < py and vn.y >= py)) and
            (px < (vn.x - vc.x) * (py - vc.y) / (vn.y - vc.y) + vc.x)) then
            collision = not collision;
        end
    end
    return collision
end

--点与直线的碰撞
function PointToLine(point , linePoint1, linePoint2)
    --思想点与线两边线段的距离跟线的距离的判断,相等就是在同一直线
    local line1 = math.sqrt((linePoint1.x - point.x) * (linePoint1.x - point.x) + (linePoint1.y - point.y)* (linePoint1.y - point.y))
    local line2 = math.sqrt((linePoint2.x - point.x) * (linePoint2.x - point.x) + (linePoint2.y - point.y)* (linePoint2.y - point.y))
    local line = math.sqrt((linePoint2.x - linePoint1.x) * (linePoint2.x - linePoint1.x) + (linePoint2.y - linePoint1.y)* (linePoint2.y - linePoint1.y))
    return (line1 + line2) == line
end
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值