2D 六边形网格

我最近使用 love2D 引擎创建了一个简单的 lua 类,通过绘制 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
点赞
用户88888888
用户88888888

以下是如何使用尽可能简化的函数在 Love2d 引擎(v. 0.10.2)中创建六边形并将其绘制到网格中的工作示例。

重要提示:适用于在圆上具有所有六个点且使用半径的六边形。对于所有六边形形状,此方法并不适用。

```

-- 让我们使用仅使用简单的函数在 (0,0) 位置中心创建六边形数据

-- table of 6 points hex = {}; -- 具有所有 6 个点位于圆上的六边形的半径 hex.radius = 10;

-- 简单的循环生成六边形 local i = 1 repeat

-- 完整圆有 2 弧度,而六边形有 6 个角点
-- 因此每个角点增加 1/3 Pi
local direction = math.pi/3 * (i+0.5)
-- 将六边形旋转 90 度:direction = math.pi/3 * i

-- 生成空表以插入点协调
hex[i] = {};
-- 设置 x,y 坐标
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 )

--使用三角函数获取两个六边形瓦片之间的距离
local jxOffset = hex.radius*-math.tan( math.pi/1.5 ) --或 math.sqrt(3) * hex.radius
--通过此值偏移新线
local ixOffset = jxOffset/4
--使用方向和距离获取线之间的 “y” 偏移量
--我们得到了 jxOffset 中的距离,因此我们只需要应用方向
local iyOffset = jxOffset*math.sin( math.pi/3 )

--“i”= 行,“j”=行中的图块
local i = 1
repeat
    local j = 1
    repeat

        love.graphics.push()
        --偏移可绘制位置(或在位置上绘制六边形瓦片):
        love.graphics.translate( ixOffset+j*jxOffset, i*iyOffset )
        --在所有六边形点之间绘制多线段-创建六边形
        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

    --为每个新行反转
    --保持行不增加 x 坐标
    ixOffset = -ixOffset
    i = i+1

until i > 5

end

如果我出错了,请原谅我,我在我的电脑上运行了代码并正常工作。如果您发现了任何错误,请评论并我会尝试修复它。

hopefully explains what i did with the offsets

2017-07-17 05:01:22