【问题标题】:2D isometric engine - Math problems - Cube selection - diamond shape map2D 等距引擎 - 数学问题 - 立方体选择 - 菱形图
【发布时间】:2016-02-26 03:34:06
【问题描述】:

当我创建一个带有std::vector 的层时,我会计算我的坐标,其中填充了cube 对象(这是我的一个类):

for(int J = 0; J < mapSize; J++)
{
    for(int I = 0; I < mapSize; I++)
    {
        x = (J - I) * (cubeSize/2);
        y = (J + I) * (cubeSize/4);

        c = new cube(cubeSize, x, y, z, I, J);
        cs.push_back(*c);
    }
}

我想这样做:cs[getCubeByID(mouseX, mouseY)].setTexture(...);

使用示例:I-J [0, 0] 中的多维数据集在多维数据集数组中具有 number 0。如果我click on 0,0 我得到了这个号码。

编辑: 我们给了我在 cmets 中得到带有一对 x,y 的 J 或 I 的公式,非常感谢。 我只需要将这对 I-J 转换为我的数组的条目号,就像我给出的示例一样。

我试过了:int entry = (J - 1) * size + (I - 1); 并且所选的立方体离我想要的那个不是很远,但仍然不是正确的公式。模算术可以解决我的问题,但我不明白它是如何工作的。

【问题讨论】:

  • 我不确定我是否理解,但如果您想将xy 对转换回IJ(2 * x + 4 * y) / (2 * cubeSize) = J。那么计算I也很简单。
  • 我有我的光标坐标 (x,y),如果我在地图上单击,我想将它们转换为等距坐标(例如 0、1)。然后,我想将 (I,J) 转换为 std::vector 中我的多维数据集的数字(此处命名为 cs)对不起,英语不好,我很难解释所有这些。我试过你的计算,它不起作用,我没有得到等距坐标。
  • 你看过en.wikipedia.org/wiki/…吗?
  • 我不使用图块,但立方体的 6 个边使用 4 个顶点。
  • 我所做的只是颠倒你一开始的等式。如果这不是您想要的,我不知道该计算什么。

标签: c++ math coordinates isometric


【解决方案1】:

所以你有

x = (J - I) * (cubeSize/2);
y = (J + I) * (cubeSize/4);

并且您想从中计算IJ(因此索引为I + J*mapSize),对吗?这是一个由两个方程组成的线性系统。

J - I = x * 2 / cubeSize
J + I = y * 4 / cubeSize

I = (y * 2 - x) / cubeSize
J = (y * 2 + x) / cubeSize

【讨论】:

  • 这不是那么容易,他有一个像3d立方体的等轴测图(他发布了一些图片,这个问题的很多版本)。基本上你必须点击六角形瓷砖。
  • @Bob__:在问题中看到那张图片会有所帮助……感谢您的评论,我从revision 7 找到了this picture。调整我的答案应该不会太难。我想虽然我会保留我现在的答案,直到问题以这样的方式被编辑,以至于可以在不挖掘修订历史的情况下找到它的要求。 OP,如果我错过了那个活动,请随时发表评论。我目前看到的是第 19 版。
  • @MvG 这完全是我想要的,非常感谢你!但是索引 (I + J * size;) 不起作用,地图大小是什么意思?以像素为单位?以块为单位?它仅适用于磁贴 0、0。
  • @Madz:我写的mapSize 与你在内部循环中使用的上限相同,你在其中写了I &lt; mapSize。将来自外部循环的变量 J 递增 1 相当于在内部循环中采取 mapSize 步骤,即循环的完整执行一次。
  • 因为我忽略的一个原因,你解决了我的另一个问题:stackoverflow.com/questions/33852194/… 也许数学真的很神奇,哈哈哈O_O
猜你喜欢
  • 2016-11-02
  • 1970-01-01
  • 2020-02-21
  • 2010-11-08
  • 1970-01-01
  • 2015-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多