0

特定のポイントを囲むポイントの位置を取得する必要があります。ei:

[x] [x] [ 2 ] [x] [x]

[x] [ 2 ] [ 1 ] [ 2 ] [x]

[ 2 ] [ 1 ] [ c ] [ 1 ] [ 2 ]

[x] [ 2 ] [ 1 ] [ 2 ] [x]

[x] [x] [ 2 ] [x] [x] (1 =半径1、2 =半径2、c =中心点)

現在、(CCSprite = [array objectAtIndex:i] CGPoint pos = sprite.position (pos.x+1,pos.y)、、、の座標を取得しており、それらをに追加してから、半径に等しい回数だけループを実行します。しかし、すでに配列にある位置を追加せず、半径が1より大きい場合に正しく機能させるのに問題があります。(pos.x-1,pos.y)(pos.x,pos.y+1)(pos.x,pos.y-1)arrayfor

4

3 に答える 3

0

半径3のオフセットを示すこの図を見てください。

半径3の図

セルを「象限1」から「象限4」までの4つのグループにグループ化しました。各グループで、すべてのxオフセットが同じ符号を持ち、すべてのyオフセットが同じ符号を持っていることに注意してください。12個のセルすべてで、abs(x) + abs(y) = radius。したがって、これらすべてを考慮して、半径3のすべてのセルにアクセスするループを作成できます。

int radius = 3;
for (int i = 1; i < radius; ++i) {
    int j = radius - i;
    [self visitCellAtXOffset:+j yOffset:+i]; // quadrant 1
    [self visitCellAtXOffset:-i yOffset:+j]; // quadrant 2
    [self visitCellAtXOffset:-j yOffset:-i]; // quadrant 3
    [self visitCellAtXOffset:+i yOffset:-j]; // quadrant 4
}

もちろん、半径を1から必要なものまでループさせることができます。中央のセル(オフセット0,0)にもアクセスする場合は、ループの外側で別の呼び出しを行ってください。

于 2013-03-23T03:12:32.430 に答える
0

ここで実際に探しているのは、グリッド上のすべてのポイントのマンハッタン距離です。

http://en.wikipedia.org/wiki/Taxicab_geometry

任意の2点について単純abs( x1 - x2 ) + abs( y1 - y2 )に計算できるため、半径ごとに計算を繰り返す必要はありません。x1、y1を固定したまま、すべてのx2、y2ポイントをループします。

実際に円形のものを探している場合、ユークリッド距離は次の式で与えられます。sqrt( (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) )

于 2013-03-23T03:20:46.577 に答える
0

私はそれを自分で理解しましたが、助けてくれた人々に感謝します。これは、最終的な配列で、インデックス0に中心座標が追加されていることを前提としています。最終結果は、特定の中心点を囲む位置を持つCCSprites(座標を取得できる)を含む配列(この場合はattackableTiles)になります。半径。私の元の質問に描かれているように。

int timesThrough = 0;
int pRange = (the desired radius)
//(attackableTiles and goingToAddTiles are both NSMutableArrays)
if (timesThrough < pRange) {
        for (int i = 0; i < attackableTiles.count; i++) {
            if (attackableTiles.count < ((pRange*pRange) +((pRange+1)*(pRange+1)))) {
                CCSprite * tile = [attackableTiles objectAtIndex:i];
                CGPoint pos = [self tileCoordForPosition:tile.position];
                CGPoint posXUp1 = ccp(pos.x+1, pos.y);
                CGPoint posXDown1 = ccp(pos.x-1, pos.y);
                CGPoint posYUp1 = ccp(pos.x, pos.y+1);
                CGPoint posYDown1 = ccp(pos.x, pos.y-1);
                CCSprite * addingTileXUp1 = [CCSprite spriteWithFile:@"Icon-72.png"];
                addingTileXUp1.position = [self positionForTileCoord:posXUp1];
                CCSprite * addingTileXDown1 = [CCSprite spriteWithFile:@"Icon-72.png"];
                addingTileXDown1.position = [self positionForTileCoord:posXDown1];
                CCSprite * addingTileYUp1 = [CCSprite spriteWithFile:@"Icon-72.png"];
                addingTileYUp1.position = [self positionForTileCoord:posYUp1];
                CCSprite * addingTileYDown1 = [CCSprite spriteWithFile:@"Icon-72.png"];
                addingTileYDown1.position = [self positionForTileCoord:posYDown1];

                addedXUp1 = FALSE;
                addedYUp1 = FALSE;
                addedXDown1 = FALSE;
                addedYDown1 = FALSE;

                for (int i = 0; i < attackableTiles.count; i++) {
                        CCSprite * tile = [attackableTiles objectAtIndex:i];
                        if (CGPointEqualToPoint(tile.position, addingTileXUp1.position)) {
                            addedXUp1 = TRUE;
                        }    
                }
                if (!addedXUp1) {
                    [goingToAddTiles addObject:addingTileXUp1];
                }

                for (int i = 0; i < attackableTiles.count; i++) {
                    CCSprite * tile = [attackableTiles objectAtIndex:i];
                    if (CGPointEqualToPoint(tile.position, addingTileYUp1.position)) {
                        addedYUp1 = TRUE;
                    }
                }
                if (!addedYUp1) {
                    [goingToAddTiles addObject:addingTileYUp1];
                }

                for (int i = 0; i < attackableTiles.count; i++) {
                    CCSprite * tile = [attackableTiles objectAtIndex:i];
                    if (CGPointEqualToPoint(tile.position, addingTileXDown1.position)) {
                        addedXDown1 = TRUE;
                    }
                }
                if (!addedXDown1) {
                    [goingToAddTiles addObject:addingTileXDown1];
                }

                for (int i = 0; i < attackableTiles.count; i++) {
                    CCSprite * tile = [attackableTiles objectAtIndex:i];
                    if (CGPointEqualToPoint(tile.position, addingTileYDown1.position)) {
                        addedYDown1 = TRUE;
                    }
                }
                if (!addedYDown1) {
                    [goingToAddTiles addObject:addingTileYDown1];
                }

                [attackableTiles addObjectsFromArray:goingToAddTiles];
                [goingToAddTiles removeAllObjects];
                timesThrough++;

            }

        }
于 2013-03-23T22:22:30.557 に答える