将索引转换为坐标的算法只返回索引

时间:2011-11-29 01:55:33

标签: objective-c ios math

我有一个图像网格,就像2D图块集。当我给出瓦片索引时,这个方法应该给我来自瓦片组的图像。

谁能看到我的数学搞砸了?目前,此功能只为nn.(random decimal)提供了xy

- (CGImageRef)tileFromTileset:(int)gid {
    CGImageRef tile;
    CGPoint point;
    CGFloat fGid = (CGFloat)gid;
    point.x = fmodf(fGid, tileSource.size.width);
    point.y = (fGid - (fmod(fGid, tileSource.size.width)) / (tileSource.size.width) + 1);
    NSLog(@"%@", NSStringFromCGPoint(point));
    tile = CGImageCreateWithImageInRect([tileSource CGImage], CGRectMake(point.x, point.y, kTileWidth, kTileHeight));
    return tile;
}

2 个答案:

答案 0 :(得分:1)

我认为你有一个简单的单位错误。目前,您将表示索引的数字除以表示坐标的数字;因此,你最终得到的单位是“每个坐标的索引”。*你想要的只是坐标单位。

因此,point.x的分配应为:

point.x = fmodf(fGid * kTileWidth, tileSource.size.width);

也就是说,瓦片索引(单位:“索引”)乘以一个瓦片的宽度(单位:“每个索引的坐标”),如果这是一行瓦片,则给出它的位置(单位:“坐标“)。在除以一行瓷砖的实际宽度后取余数,可得到正确的x坐标。

对于point.y,您需要相同计算的商:

point.y = trunc(fGid * kTileWidth / tileSouce.size.width) * kTileHeight;

索引乘以磁贴的宽度除以行的宽度,告诉您在该索引处完成了多少行;乘以瓷砖的高度来获得坐标。

对于一个更加常量的kNumTilesInRow

,这可能更清晰
point.x = (gid % kNumTilesInRow) * kTileWidth;
point.y = (gid / kNumTilesInRow) * kTileHeight;

*您不断回复n,因为abs(n) < abs(m)n % m始终等于n

答案 1 :(得分:0)

我认为你需要移动一个括号。

假设3 x 3布局如下:

1 2 3 
4 5 6 
7 8 9

你称之为传递7,这就是我所看到的:

- (CGImageRef)tileFromTileset:(int)gid  {  // 7
    CGImageRef tile;
    CGPoint point;
    CGFloat fGid = (CGFloat)gid;  // 7
    point.x = fmodf(fGid, tileSource.size.width);  // x= 7 % 3, so x=1

    // y= (7 - 1 / 3 + 1), so y= 7.6666666  
    point.y = (fGid - (fmod(fGid, tileSource.size.width)) / (tileSource.size.width) + 1); 

    // Try this instead of the above
    // y = ((7 - 1) / 3 + 1), so y=3
    //  point.y = ((fGid - fmod(fGid, tileSource.size.width)) / (tileSource.size.width) + 1); 

    NSLog(@"%@", NSStringFromCGPoint(point));
    tile = CGImageCreateWithImageInRect([tileSource CGImage], CGRectMake(point.x, point.y, kTileWidth, kTileHeight));
    return tile;