C语言 计算正方形和三角形格子中所选位置的最近邻

fdx2calv  于 2022-12-11  发布在  其他
关注(0)|答案(1)|浏览(124)

我是编程新手,我一直在尝试(用C语言)编写函数,计算NxN个位置的正方形点阵和三角形点阵中位置 i 的最近邻居。
到目前为止,对于正方形点阵Square lattice example. We have 4 nearest neighbours是容易的,一个点 i 的前四个最近的邻居可以写为:

  • i+1,对于右邻居,
  • i-1,用于左邻居,等等用于上和下邻居。

问题是当我考虑一个三角形格triangular lattice example. We have 6 nearest neighbours时,我找不到一个类似的公式,用标签 i,对于其他位置,而不是分别在左边和右边,我应该在我的公式中包括一些Angular 吗?
注:站点 i 是随机选择的,接下来,我必须在每种情况下找到它的最近邻居。
编辑:下面是对应于正方形格子的邻居的代码。在这里,我不考虑周期性的边界条件。这个程序给我们一个位置的最近的四个邻居(由用户介绍)

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define L 5 // The lattice is LxL

int site;

int calculate_neighbours(int i){ //we define a function that calculate the desired neighbours of a site introduced by the user

    /*We define functions for each neigbours*/

    //Right neighbour
    int nr;
    nr=i+1;

/*If the selected site is is the right border of the lattice*/
    for(int k=0;k<L+1;k++){
        if(site==k*L){
            nr=L*(k-1)+1;
        }
    }
    printf("\n right= %d",nr);

//////////////////////////////////////////

//Left neighbour
    int nl;
    nl=i-1;

/*If the selected site is is the left border of the lattice*/
    for(int k=1;k<L+1;k++){
        if(site==(k-1)*L+1){
            nl=L*k;
        }
    }
    printf("\n left= %d",nl);
    //////////////////////////////////

    //Upper neigbour

     int nu;
     nu=i-L;

 /*If the selected site is in the upper border of the lattice*/
     for(int p=L-1;p>-1;p--){
        if(site==L-p){
            nu=L*L-p;
        }
    }
    printf("\n up= %d",nu);

    ////////////////////////////////////////

    //Bottom neighbour

    int nd;
    nd=i+L;

 /*If The chosen site is in the bottom border*/
    for(int p=L-1;p>-1;p--){
        if(site==L*L-p){
            nd=L-p;
        }
    }
    printf("\n down= %d",nd);

/////////////////////////

 /*Main function*/

 int main(void){
    int cont, M[L][L];
     cont=1;

   /*Print the matrix elements in order*/
    while(cont<L){
        printf("The M-matrix is:\n");
         for (int m=0;m<L;m++){
         printf("\n\n");
            for(int n=0;n<L;n++){
                M[m][n]=cont++;
                printf("%5d",M[m][n]);
            }
        }
}

/*Print the nearest neighbours*/
    printf("\n\nTamaño de la red L= %d",L);
    printf("\nNumero de sitios LxL=%d",L*L);
    printf("\n\nintroduzca un sitio= ");
    scanf("%d",&site);

    if(site==0 || site<0){printf("\nDebes introducir un numero        mayor a cero!\n");}
    else  if(site>0 && site<L*L+1){
        calculate_neighbours(site);
        printf("\n");
    }
    else {
        printf("\nExcediste el tamaño de la red\n");
     }

  }

我还不知道如何开始应用类似于三角形点阵的东西。也就是说,引入一些Angular ?我有点困惑。

k7fdbhmy

k7fdbhmy1#

考虑正方形点阵的(X,Y)坐标:

//4x4 Square lattice
Y=0 : 0 1 2 3  //0-3 is X value
Y=1 : 0 1 2 3
Y=2 : 0 1 2 3
Y=3 : 0 1 2 3

然后,让我们将此4x4数据视为三角形点阵。如果将Y值为奇数的行向右移动0.5,则结果形状将看起来像三角形点阵。为了考虑邻域问题,请在此处引入另一个坐标(U,V),如下所示:

//4x4 Triangle lattice
V=0 : 0 2 4 6  //U value for Even rows is {0,2,4,6}
V=1 :  1 3 5 7  //U value for Odd rows is {1,3,5,7}
V=2 : 0 2 4 6
V=3 :  1 3 5 7

在这个(U,V)坐标系中,枚举6个近邻是非常容易的:

(U+2,V)    //right
(U-2,V)    //left
(U-1,V-1) //up left
(U+1,V-1) //up right
(U-1,V+1) //down left
(U+1,V+1) //down right

剩下的就是(X,Y)和(U,V)之间的坐标变换。这也很容易:

//(X,Y) --> (U,V)
inline void XY2UV( int X, int Y, int &U, int &V )
{
    U = X*2 + ( Y%2 );
    V = Y;
}

//(U,V) --> (X,Y)
inline void UV2XY( int U, int V, int &X, int &Y )
{
    X = U / 2;
    Y = V;
}

相关问题