Создание сетки в c - PullRequest
       7

Создание сетки в c

1 голос
/ 17 февраля 2012

Мне нужно создать сетку 375 x 375 в c, и мне нужно создать сетку из 25 (5x5) полюсов, которые будут расположены на расстоянии 75 (375/5) точек сетки.Затем мне нужно будет рассчитать для любой заданной точки сетки, насколько близко она находится к полюсу.Это не визуальная сетка, но я все еще не могу понять, как создать эту сетку программно.До сих пор я создал структуру Point, состоящую из двух целых чисел x и y:

typedef struct{
    int x, y;
}Point;

Затем я определяю свою сетку как массив точек 375x375 и устанавливаю значения x и y как i и j с уважением, во вложенном цикле for.Однако мне трудно понять, как создать массив положений полюсов.Это должен быть массив 5x5 со значениями x и y, установленными как i*15 и j*15?Если так, то как бы я использовал два 2D-массива вместе? Я не смог бы сделать такой расчет, как этот:?Я на правильном пути?Любая помощь будет оценена.

Ответы [ 3 ]

1 голос
/ 17 февраля 2012

Если у вас есть две сетки 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 содержат ближайший полюс ктекущая точка сетки.

1 голос
/ 17 февраля 2012

Вы не указали, по каким индексам столбцов / строк должны быть размещены полюсы, поэтому в следующем примере я помещаю их на 75 друг от друга, начиная с 0, поэтому полюсы имеют индексы столбцов / строк 0, 75150, 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 голосов
/ 17 февраля 2012

Если ваша сетка и полюс связаны, возможно, лучше было бы поместить их в одну структуру.

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

Вы можете видеть это как шахматную доску, которая может иметь или не иметь фигуру в каждом случае.

Вы можете использовать наивные или классические алгоритмы, такие как Дейкстра , Беллман-Форд , A *, чтобы определить кратчайший путь кваш полюс.

...