美文网首页cocos2dcocos2d-Lua
老卢写的 判断点在六边形内

老卢写的 判断点在六边形内

作者: 人气小哥 | 来源:发表于2017-06-29 21:17 被阅读28次

--检测一个点是否在一个6边形了内
function g_isContain(touchPos,itemPos,nRad)
    
    local function isLine(point1,point2,z)
        local number1 = point2.x - point1.x;
        local number2 = z.y - point1.y;
        local number3 = point2.y - point1.y;
        local number4 = z.x - point1.x;
        local number5 = number1 * number2 - number3 * number4;
        return number5;
    end

    local function isMeetLine(point1,point2,point,z)
        local bRet = false;
        if (point1.x == point2.x) and (point1.y ~= point2.y) then
            if (z.x >point1.x and point.x > point1.x) or
            (z.x < point1.x and point.x < point1.x) or (z.x == point1.x) then
                bRet = true;
            end
            return bRet;
        end
        if (point1.y == point2.y and point1.x ~= point2.x) then
            if ((z.y > point1.y and point.y > point1.y) or
            (z.y < point1.y and point.y < point1.y) or z.y == point1.y) then
                bRet = true;
            end
            return bRet;
        end
        if ((isLine(point1,point2,z) >= 0 and isLine(point1,point2,point) >= 0) or
        (isLine(point1,point2,z) < 0 and isLine(point1,point2,point) < 0)) then
            bRet = true;
        else
            bRet = false;
        end
        return bRet;
    end

    local points = {}
    local pts = {}
    local rad = nRad or 40
    local sx = itemPos.x
    local sy = itemPos.y
    local sAngle = 30
    for i=1,6 do
        sAngle = sAngle%360
        local ag = sAngle/180*math.pi
        local x = sx+rad * math.sin(ag)
        local y = sy+rad * math.cos(ag)
        local ps = {}
        ps.x = x
        ps.y = y
        table.insert(points,ps)
        table.insert(pts,{x,y})
        sAngle = sAngle + 60
    end

    local vecPoint = points
    local point = touchPos

    local bRet = true;
    local size = #vecPoint
    for i=1,size do
        if i == size then
            if not isMeetLine(vecPoint[i],vecPoint[1],point,vecPoint[2]) then
                bRet = false
                break
            end
        elseif i == size - 1 then
            if not isMeetLine(vecPoint[i],vecPoint[i+1],point,vecPoint[1]) then
                bRet = false
                break
            end
        else
            if not isMeetLine(vecPoint[i],vecPoint[i+1],point,vecPoint[i+2]) then
                bRet = false
                break
            end
        end
    end
    return bRet
end

--检测是否点击在一个6边形内
function g_isCheckItem(sender,nRad)
    local touchPos = sender:getTouchBeganPosition()
    local itemPos = sender:getParent():convertToWorldSpace(cc.p(sender:getPosition()))
    return g_isContain(touchPos,itemPos,nRad)
end

相关文章

  • 老卢写的 判断点在六边形内

  • iOS 坐标系转换(convertPoint)

    直接移步简友的文章: iOS 坐标系转换(convertPoint)以及点在范围内的判断(pointInside)

  • 判断点在多边形内的方法

    使用弧长法: 计算一个点与各条边按照逆时针方向形成的角度和 以被测点为圆心,做单位圆,计算其在单元圆上的弧长的代数...

  • 利用python 计算π的近似值

    输入darts:抛点的数量。 处理:对于每个点,计算点到圆心的距离,通过距离判断点在圆内还是圆外,然后统计圆内点的...

  • 断内老谒写

    伦毓秩讲掳fgdgs果然但是京东在直播领域的表现,却一直是平平淡淡,不温不火。不论是任嘉伦和洛天依的破壁组合,还是...

  • 道阻且长

    一 老卢50岁那年,终于有女人愿意嫁给他了。 女人很漂亮,小老卢5岁,丧偶,是老卢姑姑给介绍的。 女人来看老卢的家...

  • 老卢

    晚上, 老卢打来电话,接呢?不接呢?让我犹豫难决。她总是那么认真,认真得针尖就要对上麦芒! 有几次,因...

  • 小O地图 - 地理围栏 (点在范围内判断)

    小O地图是一款互联网地图数据挖掘、分析、图表软件。具有专业、稳定、高效的特点。提供地图功能多达30余项,并持续更新...

  • 非零环绕数规则和奇-偶规则(Non-Zero Winding N

    在图形学中判断一个点是否在多边形内,若多边形不是自相交的,那么可以简单的判断这个点在多边形内部还是外部;若多边形是...

  • iOS CAShapeLayer fillRule

    在图形学中判断一个点是否在多边形内,若多边形不是自相交的,那么可以简单的判断这个点在多边形内部还是外部;若多边形是...

网友评论

    本文标题:老卢写的 判断点在六边形内

    本文链接:https://www.haomeiwen.com/subject/mqmvcxtx.html