在网格中查找偏移量

时间:2015-01-14 00:38:38

标签: c# math grid

我对这个含糊不清的标题感到抱歉,但我并不确定如何在不具体的情况下提出这个问题。如果你建议一个更清晰的标题,我会尽快改变它。

无论如何,如果没有先提供一些背景资料,我不会认为我可以非常简洁地提出我的问题。在2D空间中,我正在创建"亩",其中包含" tiles"。

64 tiles

[一块64块瓷砖]

为了清楚起见,我们假设在这个特定的例子中,有12英亩,第一行有四个,第二行有四个,第三个有四个。每英亩有64个瓷砖,八个八格。

Twelve acres

[12英亩,每个有64个瓷砖]

我正在生成纹理所需数量的英亩的宽度和高度,乘以每英亩的瓦片数量(在我们的示例中,纹理将是32像素宽[水平行中的英亩数量{ 4}乘以英亩{8}]中的瓦片数量,以及24像素高[垂直列中的英亩数量{3}乘以英亩{8}中的瓦片数量])。然后用perlin噪声填充纹理,我想用它来为每个瓷砖着色。

perlin

[单英亩,64块瓷砖,旁边为它生成的Perlin图像(按比例放大)。这会对每个图块应用轻微的随机颜色变化。]

我想为所有的土地生成一个图像,并在每次创建一个新的英亩时读取它,但其中存在问题,以及我的问题的主题。如何获得偏移,以便每个相邻的英亩继续模式?

what I want

[我想要的(为了得到这个,我只创建了一个更大的瓷砖)]

我目前正在使用的方法似乎无法正常工作,最终会创建如下内容。

Strange Result http://2catstudios.github.io/images/StackOverflow/150113_Grid_Offset/Perlin_Twelve_Acres_NoSpace.png [奇怪的结果]

以下是我目前用于查找(不正确,我假设)偏移的代码。链接指向Gist,其中粘贴了perlin生成函数和acre / tile生成函数。

int xOffset = ( parentAcreXIndex * desiredWidth );
int yOffset = ( parentAcreYIndex * desiredHeight );

new Color ( 0.000f, 0.502f + ( parentWorld.worldPerlin.GetPixel ( xOffset + ( desiredWidth - tileXIndex ), yOffset + ( desiredHeight - tileYIndex )).grayscale * 0.3f ), 0.000f, 1 );

Full class (Links to GitHub's Gist), the above line is at 100

我真的不知道还能说什么;我的思绪有点"有雾"从试图弄明白这一点,所以请原谅我,如果我留下了重要的东西。请告诉我,我会使用所需信息更新我的帖子。

另外,对于这个问题我很抱歉,一定很难理解。在我发布之后,我会仔细阅读几次,看看我是否可以改进措辞。

感谢您的时间! 迈克尔

修改

感谢您看一下!原来问题是我用于可视化的飞机实际上是倒置的。我确保将来检查这样的简单事情,对不起给我们带来困惑!我已经离开了这个问题,因为我在这里给了足够的分数来发布图像,当我试图删除它时,这些点被撤销了。当我获得更多积分时,我会回来删除它。谢谢!

1 个答案:

答案 0 :(得分:0)

你似乎在问这个问题:

如果我有一个像素网格,它被分组为“英亩”(32x32),我如何从给定像素(作为一英亩的行和列)映射到整个像素?

Acres从每第32个像素开始,因此对于给定的英亩(acreX,acreY)

acreOriginInTextureX = acreX * 8;
acreOriginInTextureY = acreY * 8;

因此,一英亩的给定图块(tileX,tileY)将是:

tilePosInTextureX = acreOriginInTextureX + tileX
                  = acreX * 8 + tileX
tilePosInTextureY = acreY * 8 + tileY

真的是这样:

tilePosInTextureX = acreX * tilesPerAcreX + tileX

......和Y一样。

注意:我假设到处都是零索引。如果没有,你需要从acreX,acreY,tileX,tileY中减去1,但 tilesPerAcreX或Y.