双网格模型网格重叠处如何用网格坐标找到该位置多个网格的网格id

请问如果同一位置有两套网格,比如热非平衡模型双网格法(dual cell),如何用坐标去搜索两套网格在同一坐标的网格id

我通过遍历两个网格来查找与目标坐标匹配的网格id,未找到匹配的网格输出-1。

img


#include <stdio.h>

#define N 10

int main() {
    int grid1[N][N] = {
        {1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
        {11, 12, 13, 14, 15, 16, 17, 18, 19, 20},
        {21, 22, 23, 24, 25, 26, 27, 28, 29, 30},
        {31, 32, 33, 34, 35, 36, 37, 38, 39, 40},
        {41, 42, 43, 44, 45, 46, 47, 48, 49, 50},
        {51, 52, 53, 54, 55, 56, 57, 58, 59, 60},
        {61, 62, 63, 64, 65, 66, 67, 68, 69, 70},
        {71, 72, 73, 74, 75, 76, 77, 78, 79, 80},
        {81, 82, 83, 84, 85, 86, 87, 88, 89, 90},
        {91, 92, 93, 94, 95, 96, 97, 98, 99, 100}
    };

    int grid2[N][N] = {
        {101, 102, 103, 104, 105, 106, 107, 108, 109, 110},
        {111, 112, 113, 114, 115, 116, 117, 118, 119, 120},
        {121, 122, 123, 124, 125, 126, 127, 128, 129, 130},
        {131, 132, 133, 134, 135, 136, 137, 138, 139, 140},
        {141, 142, 143, 144, 145, 146, 147, 148, 149, 150},
        {151, 152, 153, 154, 155, 156, 157, 158, 159, 160},
        {161, 162, 163, 164, 165, 166, 167, 168, 169, 170},
        {171, 172, 173, 174, 175, 176, 177, 178, 179, 180},
        {181, 182, 183, 184, 185, 186, 187, 188, 189, 190},
        {191, 192, 193, 194, 195, 196, 197, 198, 199, 200}
    };

    int targetX = 3; 
    int targetY = 4;

    int grid1_id = -1; 
    int grid2_id = -1; 

    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            if (i == targetX && j == targetY) {
                grid1_id = grid1[i][j];
                break; 
            }
        }
        if (grid1_id != -1) {
            break;
        }
    }

    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            if (i == targetX && j == targetY) {
                grid2_id = grid2[i][j];
                break; 
            }
        }
        if (grid2_id != -1) {
            break;
        }
    }

    printf("Grid1 ID: %d\n", grid1_id);
    printf("Grid2 ID: %d\n", grid2_id);

    return 0;
}

该回答引用ChatGPT GPT-4

运行结果

img

代码如下

#include <stdio.h>

#define MAX_CELLS 10000  // 假设你的网格最多有10000个单元

// 一个网格单元的结构
typedef struct {
    int id;
    double x;
    double y;
    double z;
} GridCell;

// 两个网格系统
GridCell gridSystem1[MAX_CELLS];
GridCell gridSystem2[MAX_CELLS];

// 一个简单的线性搜索函数,它遍历每一个网格单元来找到对应的ID
int findCellId(GridCell gridSystem[], double x, double y, double z) {
    for (int i = 0; i < MAX_CELLS; ++i) {
        if (gridSystem[i].x == x && gridSystem[i].y == y && gridSystem[i].z == z) {
            return gridSystem[i].id;
        }
    }
    return -1;  // 如果找不到,返回-1
}

int main() {
    // 填充网格数据
    for (int i = 0; i < MAX_CELLS; ++i) {
        gridSystem1[i].id = i;
        gridSystem1[i].x = (double)i;
        gridSystem1[i].y = (double)i;
        gridSystem1[i].z = (double)i;
    
        gridSystem2[i].id = i;
        gridSystem2[i].x = (double)i;
        gridSystem2[i].y = (double)i;
        gridSystem2[i].z = (double)i;
    }


    // 你的查询坐标
    double queryX = 0.0, queryY = 0.0, queryZ = 0.0;

    // 查询两个网格系统的ID
    int id1 = findCellId(gridSystem1, queryX, queryY, queryZ);
    int id2 = findCellId(gridSystem2, queryX, queryY, queryZ);

    printf("网格1的ID: %d\n", id1);
    printf("网格2的ID: %d\n", id2);

    return 0;
}

按照网格中心点(或边界节点)的坐标进行搜索或者按照网格的索引关联

可以使用斐波那契算法代码实现

#include <iostream>
#include <assert.h>
using namespace std;
 
#define  MAXSIZE  11
 
// 斐波那契非递归
void Fibonacci(int *f)
{
    f[0] = 0;
    f[1] = 1;
     
    for (int i = 2; i < MAXSIZE; ++i)
    {
        f[i] = f[i-1] + f[i-2];
    }
}
// 斐波那契数列
/*---------------------------------------------------------------------------------
  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  8  |  9  |  10  |  11  |  12  |
  ----------------------------------------------------------------------------------
  |     0  |  1  |  1  |  2  |  3  |  5  |  8  |  13 |  21 |  34 |  55  |  89  |  144 |
 -----------------------------------------------------------------------------------*/
// 斐波那契数列查找
int Fibonacci_Search(int *a, int n, int key)
{
    int low = 1;  // 定义最低下标为记录首位
    int high = n; // 定义最高下标为记录末位(一般输入的参数n必须是数组的个数减一)
 
    int F[MAXSIZE];
    Fibonacci(F); // 确定斐波那契数列
 
    int k = 0, mid = 0;
    // 查找n在斐波那契数列中的位置,为什么是F[k]-1,而不是F[k]?
    while (n > F[k]-1)
    {
        k++;
    }
    // 将不满的数值补全
    for (int i = n; i < F[k]-1; ++i)
    {
        a[i] = a[high];
    }
    // 查找过程
    while (low <= high)
    {
        mid = low + F[k-1] - 1; // 为什么是当前分割的下标?
        if (key < a[mid])  // 查找记录小于当前分割记录
        {
            high = mid - 1;
            k = k - 1;     // 注意:思考这里为什么减一位?
        }
        else if (key > a[mid]) // 查找记录大于当前分割记录
        {
            low = mid + 1;
            k = k - 2;  // 注意:思考这里为什么减两位?
        }
        else
        {
            return (mid <= high) ? mid : n;  // 若相等则说明mid即为查找到的位置; 若mid > n 说明是补全数值,返回n
        }
    }
    return -1;
}
void main()
{
    int a[MAXSIZE] = {0,1,16,24,35,47,59,62,73,88,99};  
    int k = 0;  
    cout << "请输入要查找的数字:" << endl;  
    cin >> k;
    int pos = Fibonacci_Search(a, MAXSIZE-1, k);  
    if (pos != -1)  
        cout << "在数组的第"<< pos+1 <<"个位置找到元素:" << k; 
    else  
        cout << "未在数组中找到元素:" << k; 
}

给你提供一个大致的思路吧:
首先需要确定要搜索的坐标位置。其次,需要知道网格的大小和拓扑结构。例如,可以知道每套网格的边界、连接关系和邻近网格的索引。
之后遍历网格,使用线性插值或其他算法来计算坐标位置与网格边界的距离,以确定哪个网格是最接近的。
一旦找到最接近的网格,可以确定该网格的网格id。这个id可以是网格的索引或其他标识符,用于在后续计算中引用该网格。

可以使用哈希表来存储id

通过确定网格层级、在对应的网格层级上进行搜索,并进行网格ID的匹配,可以找到双网格模型中同一坐标位置上的多个网格的网格ID

TechWhizKid参考GPT回答:

  • 用哈希表来存储网格 ID 和其对应的坐标。哈希表的一个关键特性是它支持高效的查找操作,其时间复杂度为 O(1)。
    假设坐标是二维的,并且每个坐标只有一个网格 ID。
#include <stdio.h>
#include <stdlib.h>

#define MAX_GRID_SIZE 1000 //定义最大网格大小

typedef struct Grid {
    int id; // 网格 ID
    int x, y; // 坐标
} Grid;

Grid grid1[MAX_GRID_SIZE], grid2[MAX_GRID_SIZE]; // 定义两套网格
int hashTable1[MAX_GRID_SIZE], hashTable2[MAX_GRID_SIZE]; // 定义两个哈希表

// 定义哈希函数,这里简单地将 x 和 y 组合起来作为键
int hash(int x, int y) {
    return (x * 100 + y) % MAX_GRID_SIZE; // 假设 x, y 都小于 100
}

// 初始化网格和哈希表
void initialize(Grid *grid, int *hashTable) {
    for (int i = 0; i < MAX_GRID_SIZE; i++) {
        hashTable[i] = -1; // 初始化哈希表
    }
    for (int i = 0; i < MAX_GRID_SIZE; i++) {
        grid[i].id = i; // 假设网格 ID 就是其在数组中的索引
        grid[i].x = i / 10; // 假设 x 是 i 除以 10 的商
        grid[i].y = i % 10; // 假设 y 是 i 除以 10 的余数
        int h = hash(grid[i].x, grid[i].y); // 计算哈希值
        if (hashTable[h] == -1) { // 如果哈希值还没有被使用
            hashTable[h] = i; // 将坐标哈希后的结果作为键,网格 ID 作为值存储在哈希表中
        }
    }
}

// 通过坐标查找网格 ID
int findGridId(Grid *grid, int *hashTable, int x, int y) {
    return grid[hashTable[hash(x, y)]].id; // 使用哈希函数查找网格 ID
}

int main() {
    initialize(grid1, hashTable1);
    initialize(grid2, hashTable2);

    int x = 5, y = 3;
    printf("在grid1中,坐标为(%d, %d)的网格ID为:%d\n", x, y, findGridId(grid1, hashTable1, x, y));
    printf("在grid2中,坐标为(%d, %d)的网格ID为:%d\n", x, y, findGridId(grid2, hashTable2, x, y));
    return 0;
}

这个程序会创建两个网格和对应的哈希表,然后通过坐标查找并打印出两个网格中对应的网格 ID。

引用chatgpt内容作答:
在热非平衡模型双网格法(dual cell)中,通常会使用两套网格,一个为粗网格(coarse grid),另一个为细网格(fine grid)。粗网格通常具有较大的网格单元,而细网格具有较小的网格单元。

如果你想在同一位置找到两套网格中的网格ID,你可以按照以下步骤进行操作:

1、首先,确定你要查找的位置的坐标。假设你的位置坐标为 (x, y, z)。

2、对于粗网格和细网格,你需要知道它们的起始坐标、结束坐标以及网格单元的大小。假设粗网格的起始坐标为 (x_c_start, y_c_start, z_c_start),结束坐标为 (x_c_end, y_c_end, z_c_end),粗网格单元的大小为 (dx_c, dy_c, dz_c)。对于细网格,对应的参数为 (x_f_start, y_f_start, z_f_start),(x_f_end, y_f_end, z_f_end),(dx_f, dy_f, dz_f)。

3、计算在粗网格中的位置。将要查找的位置坐标减去粗网格的起始坐标,并除以粗网格单元的大小,即可得到在粗网格中的相对坐标。例如,对于 x 方向的相对坐标 (x_c_relative),计算方式为:

x_c_relative = (x - x_c_start) / dx_c

同样,可以计算出 y 和 z 方向的相对坐标。

4、对于细网格,也按照相同的方法计算在细网格中的相对坐标。

5、使用相对坐标计算在粗网格和细网格中的网格ID。将相对坐标向下取整,得到在粗网格和细网格中的网格索引。例如,对于 x 方向在粗网格中的网格索引 (i_c),计算方式为:

i_c = floor(x_c_relative)

6、同样,可以计算出 y 和 z 方向的网格索引。

同样地,使用相对坐标计算在细网格中的网格ID。

通过以上步骤,你可以使用坐标来搜索在同一位置上粗网格和细网格中的网格ID。请注意,具体的计算方式可能因实际应用和算法而有所差异,上述步骤仅提供了一种常见的方法。在实际实现时,还需要考虑边界条件和其他细节。

大致思路:
1、确定重叠处的位置,通过计算两个网格的交点或通过在网格边界上搜索重叠区域。
2、确定重叠处所在的网格,通过检查每个网格中包含该点的八个子网格来确定。如果该点位于某个子网格内,则该点在该子网格所在的网格中。
3、确定重叠处的网格id,通过检查该网格的网格坐标来确定该点的网格id。如果该点位于一个三角形或四边形上,则可以使用该点在该三角形或四边形上的位置来计算其网格坐标。然后,可以使用该网格坐标来确定该点的网格id。
4、重复步骤2和3,直到找到所有与重叠处相关的网格id。

在双网格法中,通常存在两个网格,一个被称为粗网格,另一个被称为细网格。这两个网格在某些区域是重叠的,而在其他区域是分开的。

如果你想要在重叠区域中找到某个位置对应的网格ID,你需要知道两个网格的细节信息,比如网格的起始坐标、网格的步长(网格间距)以及网格的大小。

假设我们有一个粗网格和一个细网格,它们的起始坐标分别为(xc, yc)和(xf, yf),步长分别为(dx_c, dy_c)和(dx_f, dy_f),网格大小分别为NCx和NFx(水平方向),以及NCY和NFY(垂直方向)。

要找到某个位置(x, y)在粗网格和细网格中的网格ID,你可以按照以下步骤进行操作:

  1. 对于粗网格:

    • 计算在水平方向上(x - xc) / dx_c 的整数部分,即粗网格的列索引:col_c = int((x - xc) / dx_c)。
    • 计算在垂直方向上(y - yc) / dy_c 的整数部分,即粗网格的行索引:row_c = int((y - yc) / dy_c)。
    • 粗网格的网格ID可通过以下公式计算:id_c = row_c * NCx + col_c。
  2. 对于细网格:

    • 计算在水平方向上(x - xf) / dx_f 的整数部分,即细网格的列索引:col_f = int((x - xf) / dx_f)。
    • 计算在垂直方向上(y - yf) / dy_f 的整数部分,即细网格的行索引:row_f = int((y - yf) / dy_f)。
    • 细网格的网格ID可通过以下公式计算:id_f = row_f * NFx + col_f。

这样,你就可以分别得到粗网格和细网格中某个位置对应的网格ID。需要注意的是,这里假设两个网格的起始坐标是对齐的,且粗网格的步长(dx_c, dy_c)要大于细网格的步长(dx_f, dy_f)。

请注意,以上步骤仅适用于热非平衡模型中双网格法的基本情况。对于其他类型的双网格方法,可能会有一些变化和调整。具体的实现可能还需要考虑网格的边界条件等其他因素。根据具体场景,你可能需要进行适当的修改。

希望这些信息能够帮助到你。如果你有任何进一步的问题,请随时提问。

来自GPT的回答:

在热非平衡模型的双网格法中,如果你需要通过坐标在两个网格中找到重叠处的网格ID,可以按照以下步骤进行:

确定网格单元的大小:首先,你需要知道每个网格单元的大小,即每个网格在空间中的尺寸。

计算坐标所在的网格单元:根据给定的坐标,将其除以网格单元的大小,并向下取整得到整数坐标值。这将给出在两个网格中的网格单元索引。

转换为网格ID:将网格单元的索引转换为唯一的网格ID。你可以使用一维数组或哈希表等数据结构来存储网格ID,并通过计算索引来查找对应的网格ID。

具体实现可能因使用的编程语言和数据结构而有所不同,以下是一个简单的示例代码(使用C语言):

c
Copy code
// 定义网格单元的大小
float cellSize = 1.0;

// 计算坐标所在的网格单元
int gridIndex = floor(coord / cellSize);

// 转换为网格ID
int gridID = calculateGridID(gridIndex);

// 在两个网格中查找网格ID对应的数据
data1 = grid1[gridID];
data2 = grid2[gridID];
在上述示例中,coord表示给定的坐标,gridIndex表示网格单元的索引,calculateGridID是一个自定义的函数,根据网格索引计算对应的网格ID。grid1和grid2表示两个网格,你可以根据实际情况使用合适的数据结构来存储网格数据。

请注意,这只是一个简单的示例,具体的实现可能需要根据你的应用和数据结构进行调整。

在热非平衡模型双网格法中,如果存在两套网格在同一位置,可以使用坐标来搜索这两个网格中具有相同坐标的网格ID。以下是一种可能的方法:

  1. 首先,确定两个网格的坐标系和网格单元的布局方式。确保了解每个网格的坐标轴方向和边界范围。
  2. 对于给定的坐标点,首先在第一个网格中搜索与该坐标最接近的网格单元。可以使用一些算法,例如最近邻算法或线性插值,来确定最接近的网格单元。
  3. 获取第一个网格单元的ID,并将其与给定坐标进行比较。如果两者相匹配,则找到了在同一位置的网格单元。
  4. 重复步骤2和步骤3,但这次在第二个网格中进行。使用相同的算法和方法来搜索与给定坐标最接近的网格单元,并将其ID与给定坐标进行比较。
  5. 如果在第一个网格和第二个网格中都找到了相匹配的网格单元ID,则表示这两个网格在同一位置。

以下答案参考newbing,回答由博主波罗歌编写:
在双网格模型中,通常会有两套网格,分别称为粗网格和细网格。粗网格由较大的单元组成,而细网格则由较小的单元组成,且两个网格之间存在重叠区域。

要找到位于重叠区域的某个位置的网格id,可以按照以下步骤进行:

  1. 确定位置在粗网格上的单元格坐标。
    假设粗网格的初始坐标为(0, 0),每个单元格的大小为C,要找的位置在坐标(x, y)上。那么该位置在粗网格上的单元格坐标可以通过以下公式计算:
    cx = floor(x / C)
    cy = floor(y / C)

  2. 确定位置在细网格上的单元格坐标。
    假设细网格中每个单元格的大小为F,且小单元格数量为R。同样,要找的位置在坐标(x, y)上。那么该位置在细网格上的单元格坐标可以通过以下公式计算:
    rx = floor((x % C) / F)
    ry = floor((y % C) / F)

  3. 计算粗网格和细网格的单元格数量。
    假设粗网格的单元格数量为GC,细网格的单元格数量为RC。可以通过将粗网格的大小除以细网格的大小来计算:
    GC = floor(C / F)
    RC = R * GC

  4. 计算位于重叠区域的网格id。
    先计算粗网格的网格id:
    coarse_id = cy * GC + cx
    然后计算细网格的网格id:
    fine_id = ry * RC + rx
    最后的网格id为两个网格id的组合:
    overlap_id = coarse_id * RC + fine_id

这样,通过以上步骤,我们可以找到位于重叠区域的某个位置的网格id。

以下是一个示例代码,以帮助理解:

def get_overlap_id(x, y, C, F, R):
    # 计算粗网格上的单元格坐标
    cx = x // C
    cy = y // C

    # 计算细网格上的单元格坐标
    rx = (x % C) // F
    ry = (y % C) // F

    # 计算粗网格和细网格的单元格数量
    GC = C // F
    RC = R * GC

    # 计算网格id
    coarse_id = cy * GC + cx
    fine_id = ry * RC + rx
    overlap_id = coarse_id * RC + fine_id

    return overlap_id

# 示例使用
C = 10  # 粗网格单元格大小
F = 2   # 细网格单元格大小
R = 6   # 细网格小单元格数量

x = 15  # 位置横坐标
y = 8   # 位置纵坐标

overlap_id = get_overlap_id(x, y, C, F, R)
print("重叠区域网格id:", overlap_id)

希望以上解答能够帮助到你!如果还有任何问题,请随时提问。
如果我的回答解决了您的问题,请采纳!