2012-02-17 9 views
1

cで375 x 375のグリッドを作成する必要があります.75(375/5)グリッドの間隔をあけて25(5x5)のグリッドを作成する必要があります。次に、どの格子点がどれくらい極に近いかを計算する必要があります。これはビジュアルグリッドではありませんが、このグリッド設定をプログラムで作成する方法については頭を悩ませています。私は、375x375ポイントの配列としての私のグリッドを定義し、丁重にijとして、xとyの値を設定しcでグリッドを作成する

typedef struct{ 
    int x, y; 
}Point; 

:これまでのところ、I'vは、2つのint xとyので構成され、「ポイント」の構造体を作成しました、入れ子にされたforループで。しかし、私はポールポジションアレイを作成する方法を考え出すのに苦労しています。 xとyの値がi*15j*15に設定された5x5配列である必要がありますか?それではどのように私はtogether.Iは明らかに、このような計算を行うことができなかった2つの2Dアレイを使用する場合:

 for(i = 0; i < 375; i ++){ 
     for(j = 0; j<375; j++){ 
      distance(polePos[i][j], grid[i][j]); 
     } 
    } 

を私はそれ375x375配列させる場合には、どのように私はポールポジションを指定していますか? 正しい軌道にいるのですか?どんな助けもありがとう。

+0

"極座標" hehe –

+0

私は一時的にグリッドを忘れて、一点に集中すべきだと思います。一点を考えると、それはどれくらいポールに近いのでしょうか? –

+0

この宿題はありますか?その後、それをタグ付けしてください。 –

答えて

1

極を配置する列/行インデックスを指定しなかったので、以下では0から始まる75分を置き、極は列/行インデックス0,75に配置します、150,225,300,375(したがって、6つの極)。それはあなたが心に持っていたものではないかもしれませんが、それはあなたを始めるでしょう。あなたのグリッドとあなたのポールが関連している場合は

#include "stdio.h" 
#include "math.h" 
double distance(double x, double y, double grid) { 
    x = fmod(x, grid); 
    y = fmod(y, grid); // <- these modulos makes us treat every interval like the interval 0...grid 
    double dx = grid/2 - fabs(x -grid/2); 
    double dy = grid/2 - fabs(y -grid/2);  
    //printf("%3u %3u %f %f \n", x, y, dx, dy); 
    return sqrt(dx*dx+dy*dy); 
} 
int main(void) { 
    int i; int j; 
    double grid[375][375]; 
     for(i = 0; i < 375; i ++){ 
     for(j = 0; j<375; j++){ 
      grid[i][j] = distance(i, j, 75); 
      printf("%3u %3u %f\n", i, j, grid[i][j]); 
     } 
    } 
} 
+0

375にポールを付ける場合は、376x376のグリッドが必要であることを指摘しませんでした。 –

+0

@MrListerはい極がありません。距離は1.0になっています。 –

0

、多分同じ構造にそれらを置くために良いはずです。

#include <stdbool.h> 
typedef struct{ 
    int x, y; 
    bool pole; 
} Point; 

あなたは持っているか、それぞれのケースに作品を持っていない可能性がある、チェスボードのようにそれを見ることができます。

Dijkstra,Bellman-FordA*のようなナイーブなまたは古典的なアルゴリズムを使用した後、極の最短経路を決定することができます。

1

あなたがポイントの2つのグリッドpolePos[5][5]grid[375][375]を持っている場合は、次のアルゴリズムで距離を計算することができます

double dist[375][375]; 

int pI = 0, pJ = 0; 
for (int gI = 0; gI < 375; gI++) { 
    while (pI + 1 < 5 && 
      abs(polePos[pI][pJ].x - grid[gI][0].x) > 
      abs(polePos[pI + 1][pJ].x - grid[gI][0].x) { 
     pI += 1; 
    } 

    for (int gJ = 0; gJ < 375; gJ++) { 
     while (pJ + 1 < 5 && 
       abs(polePos[pI][pJ].y - grid[gI][gJ].y) > 
       abs(polePos[pI][pJ + 1].y - grid[gI][gJ].y) { 
      pJ += 1; 
     } 

     dist[gI][gJ] = distance(polePos[pI][pJ], grid[gI][gJ]); 
    } 

    pJ = 0; 
} 
あり

pIpJは、現在の格子点に最も近い極が含まれています。

関連する問題