Арифметика для преобразования индекса в координаты просто возвращает индекс - PullRequest
0 голосов
/ 29 ноября 2011

У меня есть сетка изображений, как набор плиток 2D.Этот метод должен дать мне изображение из набора плиток, когда я просто даю индекс плитки.

Кто-нибудь может увидеть, где моя математика облажалась?В настоящее время эта функция просто дает мне n и n.(random decimal) для x и y.

- (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 ]

1 голос
/ 29 ноября 2011

Я думаю, у вас есть простая ошибка единиц. В данный момент вы делите число, представляющее индекс, на число, представляющее координату; поэтому единица измерения, которую вы в конечном итоге получите, - это «индекс на координату». * Однако вам нужны только единицы измерения координат.

Поэтому присвоение point.x должно быть:

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

То есть индекс плитки (единицы измерения: «индекс»), умноженный на ширину одной плитки (единицы измерения: «координаты на индекс»), дает вам местоположение, если это был один ряд плиток (единицы измерения: « координаты"). Взятие остатка после деления на фактическую ширину ряда плиток дает правильную координату х.

Для 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.

0 голосов
/ 29 ноября 2011

Я думаю, вам нужно убрать скобки.

Предполагается, что схема 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...