自学内容网 自学内容网

碰撞算法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

原文地址:https://blog.csdn.net/five50/article/details/144406600

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!