问候,

我工作的一个游戏项目,采用了3D变的六角形瓦地图。瓷砖实际上是立方体,不不吉利的东西,但是规定了只是喜欢的格子(因为一方可以转向一个立方体,推断从2D到3D,但是没有3D版本的hex).而不是一个详细的描述,这样的一个实例型4x4x4地图:

(我已经强调了任意瓷砖(绿色)及其相邻的瓦(黄),以帮助描述了如何整个事情是应该的工作;但是邻接的功能是 这个问题,这已经得到解决。)

我有一个结构类型来代表瓦片和地图中表示作为一个3D列砖(包裹 Map 类添加一些实用方法,但这并不是非常相关的).每一个砖片应该要表示一个 完美的 立方空间,并且他们都是 到底 大小相同。此外,之间的偏相邻"行"是 到底 一半尺寸的一砖。

这就是足够的上下文;我的问题是:
鉴于两点的坐标 AB, 我怎么产生的一个列表中的瓦(或者,相反,他们的坐标),之间的一条直线 AB 将十字架?

那会稍后可用于各种目的,例如确定的视线、收费道路的合法性,等等。

顺便说一句,这可能是有用的:我的地图使用(0,0,0)作为参考的位置。该'jagging'的地图可以被定义为抵消每块瓷砖 ((y+z) mod 2) * tileSize/2.0 到正确的位置,它就必须在"健全的"笛卡尔的系统。非锯齿行,产生0;行在那里 (y+z) mod 2 1,收益率0.5瓷砖。

我的工作C#4的目标。净框架4.0;但是我真的不需要特定的代码,就算法来解决奇怪的几何学/数学问题。我已经尝试了好几天来解决这个处没有利用;并试图绘制整个事情在纸面上"可视化"这并没有帮助:(.

预先感谢任何答案

有帮助吗?

解决方案

直到一个聪明况和展望转达,这是我的愚蠢的解决方案。我会解释它在2D因为这使它更容易解释,但它将概括为3D很轻松了。我认为,任何尝试,试图工作,这完全是在细胞指数的空间是注定要失败的(虽然我承认这只是我想什么我期待着被证明是错误的).

所以你需要定义一个功能地图,从笛卡尔坐标细胞指数。这是直接的,如果有点棘手。第一,决定是否 point(0,0) 是的左下角 cell(0,0) 或中心,或者一些其他点。因为它使解释更加容易,我会去左下角。观察到任何 point(x,floor(y)==0) 地图 cell(floor(x),0).事实上,任何 point(x,even(floor(y))) 地图 cell(floor(x),floor(y)).

在这里,我发明的布尔的功能 even 这回真的如果它的论点是一个更大的整数。我会用 odd 下:任何一点 point(x,odd(floor(y)) 地图 cell(floor(x-0.5),floor(y)).

现在你必须的基础知识的配方用于确定线路的视线。

你还需要一个功能地图 cell(m,n) 回到一点在笛卡尔的空间。这应该是简单明了一旦你决定其原产地谎言。

现在,除非我错位的一些括号,我认为你是对你的方式。你会需要:

  • 在决定在哪里 cell(0,0) 你的位置 point(0,0);和调节功能;
  • 决定点沿着池边界的下降;和
  • 概括这3尺寸。

根据大小的比赛场你可以存储笛卡尔坐标的电池边界在一个查询表(或其他数据结构),这可能会加快速度。

其他提示

也许你可以避免的所有复杂的数学如果你看看你的问题在另一个方式:

我看你只转移你的块(交流)沿着第一轴线的一半blocksize.如果你分开了你块沿着这样的轴线上述的例子将成为(变化)的一个(9x4x4)简单笛卡尔坐标系定期叠块。现在做光线追踪变得更加简单和低容易出错。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top