我需要在c中创建一个375 x 375的网格,我需要创建一个25(5x5)个网格的网格,它们间隔75(375/5)个网格点。然后,我需要计算任何给定的网格点与杆的接近程度。这不是一个可视网格,但我仍然无法编程如何以编程方式创建此网格设置。到目前为止,我创建了一个由两个整数x和y组成的“Point”结构:
typedef struct{
int x, y;
}Point;
然后我将网格定义为375x375 Point数组,并在嵌套for循环中将x和y值分别设置为i
和j
。但是我很难弄清楚如何创建杆位阵列。它应该是5x5数组,x和y值设置为i*15
和j*15
吗?如果是这样,我将如何一起使用这两个2D阵列。我无法做这样的计算:
for(i = 0; i < 375; i ++){
for(j = 0; j<375; j++){
distance(polePos[i][j], grid[i][j]);
}
}
但如果我将它设为375x375阵列,那我该如何指定杆位? 我是在正确的轨道上吗?任何帮助,将不胜感激。
答案 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;
}
pI
和pJ
包含与当前网格点最近的极点。
答案 2 :(得分:0)
如果您的网格和极相关,那么将它们放在相同的结构中应该更好。
#include <stdbool.h>
typedef struct{
int x, y;
bool pole;
} Point;
你可以看到它像棋盘,每个案件可能有或没有一块。
您可以在使用天真或经典算法(如Dijkstra,Bellman-Ford,A*后,确定最短路径。