我是编程新手,我一直在尝试(用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 ?我有点困惑。
1条答案
按热度按时间k7fdbhmy1#
考虑正方形点阵的(X,Y)坐标:
然后,让我们将此4x4数据视为三角形点阵。如果将Y值为奇数的行向右移动0.5,则结果形状将看起来像三角形点阵。为了考虑邻域问题,请在此处引入另一个坐标(U,V),如下所示:
在这个(U,V)坐标系中,枚举6个近邻是非常容易的:
剩下的就是(X,Y)和(U,V)之间的坐标变换。这也很容易: