在c中创建网格

时间:2012-02-17 07:02:03

标签: c for-loop grid position

我需要在c中创建一个375 x 375的网格,我需要创建一个25(5x5)个网格的网格,它们间隔75(375/5)个网格点。然后,我需要计算任何给定的网格点与杆的接近程度。这不是一个可视网格,但我仍然无法编程如何以编程方式创建此网格设置。到目前为止,我创建了一个由两个整数x和y组成的“Point”结构:

typedef struct{
    int x, y;
}Point;

然后我将网格定义为375x375 Point数组,并在嵌套for循环中将x和y值分别设置为ij。但是我很难弄清楚如何创建杆位阵列。它应该是5x5数组,x和y值设置为i*15j*15吗?如果是这样,我将如何一起使用这两个2D阵列。我无法做这样的计算:

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

但如果我将它设为375x375阵列,那我该如何指定杆位? 我是在正确的轨道上吗?任何帮助,将不胜感激。

3 个答案:

答案 0 :(得分:1)

你没有指定极点应该放在哪个列/行索引处,所以在下面我将它们从75开始以0开始,因此极点位于列/行索引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]);
        }
    }
}

答案 1 :(得分:1)

如果您有两个网格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包含与当前网格点最近的极点。

答案 2 :(得分:0)

如果您的网格相关,那么将它们放在相同的结构中应该更好。

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

你可以看到它像棋盘,每个案件可能有或没有一块。

您可以在使用天真或经典算法(如DijkstraBellman-FordA*后,确定最短路径。