2D六边形网格

时间:2017-03-11 23:43:54

标签: lua grid-layout

我最近创建了一个简单的lua类(这是使用love2D引擎),通过绘制6个顶点并用线条跟踪它们来制作六边形,我希望能够扩展到的东西之一是六边形网格但是我不知道如何

我发现的所有网站都没有帮助,我无法理解原因。

这里是我根据它的半径和x和y位置绘制顶点的函数。

我的六边形呈尖尖的风格。

function hexagon.new(x,y,radius)
    local hexagon=setmetatable({},hexagon)
    hexagon.Vertices={}
    hexagon.x=x or 0
    hexagon.radius = radius or 10 
    hexagon.y=y or 0
    for i=0,6 do
        local angle = 2 * math.pi / 6 * (i + .5) -- 1 is what is multipled to 90(2*math.pi) so 1*90=90(flat-topped), 0.5*90=45(pointy-topped)
        local x = hexagon.x + hexagon.radius * math.cos(angle)
        local y = hexagon.y + hexagon.radius * math.sin(angle)
        hexagon.Vertices[i]= {x=x,y=y}
    end
    return hexagon
end

1 个答案:

答案 0 :(得分:1)

希望我理解得很好。 下面是如何使用Love2d引擎(v.10.1.2)创建十六进制然后使用尽可能简化的函数将其绘制到网格的工作示例。

重要:用十六进制制作,圆圈上有六个点,使用半径。 这种方法不适合所有的六角形。

------------------------------
--lets create hex data with center at position 0,0
--using only simple functions

--table of 6 points
hex = {};
--radius for hex which has all 6 points lying on circle
hex.radius = 10;

--simple loop to generate hex
local i = 1
repeat

    --full circle has 2 radians and hex has 6 points
    --so 1/3 pi increase per point
    local direction = math.pi/3 * (i+0.5)
    --rotate hex by 90 degrees: direction = math.pi/3 * i

    --generate empty table to insert point coordinations to
    hex[i] = {};
    --set x,y coordinates
    hex[i].x = hex.radius*math.cos( direction )
    hex[i].y = hex.radius*math.sin( direction )
    i = i+1

until i > 6
------------------------------

------------------------------
function love.draw( dt )

    --get distance between 2 hex tiles using trigonometry
    local jxOffset = hex.radius*-math.tan( math.pi/1.5 ) --or math.sqrt(3) * hex.radius
    --offset new lines by this value
    local ixOffset = jxOffset/4
    --use direction and distance to get "y" offset between lines
    --we got distance in jxOffset, so we just apply direction 
    local iyOffset = jxOffset*math.sin( math.pi/3 )

    --"i" = line, "j" = tile in line
    local i = 1
    repeat
        local j = 1
        repeat

            love.graphics.push()
            --offset drawable position (or draw hex tile at position):
            love.graphics.translate( ixOffset+j*jxOffset, i*iyOffset )
            --draw poly-line between all hex points - creating hex
            love.graphics.line( hex[1].x,hex[1].y, hex[2].x,hex[2].y, hex[3].x,hex[3].y, hex[4].x,hex[4].y, hex[5].x,hex[5].y, hex[6].x,hex[6].y, hex[1].x,hex[1].y );
            love.graphics.pop()
            j = j+1

        until j > 5

        --invert for each new line
        --keep lines from increasing x coordinates
        ixOffset = -ixOffset
        i = i+1

    until i > 5

end
------------------------------

对不起,如果我在某个地方犯了错误,运行代码并在我身边正常工作。如果您发现了任何内容,请发表评论,我会尝试修复它。

hopefully explains what i did with the offsets