我有我的 3D 世界x, y, z。我可以使用我的宏輕松地將給定的坐標x, y,轉換z為整數XYZ:
const ulong WORLD_SIZE_X = 60;
const ulong WORLD_SIZE_Y = 60;
const ulong WORLD_SIZE_Z = 60;
const ulong WORLD_SIZE = WORLD_SIZE_X * WORLD_SIZE_Y * WORLD_SIZE_Z;
#define XYZ(_x, _y, _z) \
((_x) ((_y)*WORLD_SIZE_X) ((_z)*WORLD_SIZE_X*WORLD_SIZE_Y))
因此,我可以通過 分配一個大的“線性”陣列calloc(WORLD_SIZE, sizeof(Cube)),并且可以像這樣訪問任何多維資料集(只是一個示例):
for (int z=0; z<=WORLD_SIZE_Z; z) {
for (int y=0; y<=WORLD_SIZE_Y; y) {
for (int x=0; x<=WORLD_SIZE_X; x) {
printf("blabla\n", myWorld(XYZ(x, y, z));
}
}
}
所以:
- 我可以分配一個“線性”陣列(=對我來說比陣列陣列簡單得多)
- 給定
x,y并且z,我可以很容易地找到我想要的元素
而且我找不到做相反的正確宏:給定 a ,long long posfind和.xyz
對于 2D 陣列,它很簡單,它是x = pos % SIZE_X;和y = (int)(pos / SIZE_X);。但是對于一個 3D 世界你怎么辦?
uj5u.com熱心網友回復:
如果你重寫你的方程,也許會更容易:
u = (z * WORLD_SIZE_Y y) * WORLD_SIZE_X x;
您可以通過以下方式獲取各個坐標:
x = u % WORLD_SIZE_X;
y = (u / WORLD_SIZE_X) % WORLD_SIZE_Y;
z = (u / WORLD_SIZE_X) / WORLD_SIZE_Y;
uj5u.com熱心網友回復:
從組合中“提取”X、Y 和 Z 坐標的運算式pos需要反轉用于形成該位置的操作。
- 對于 X,它將與 2D 情況相同(僅取模 X_SIZE 的值)
x = pos % X_SIZE:。 - 對于 Y,我們可以先除以 X_SIZE(移出 X 分量),然后取模 Y_SIZE: 的結果
y = (pos / X_SIZE) % Y_SIZE。 - 對于 Z,我們擴展了您對 2D Y 的原始操作,但除以 X_SIZE 和 Y_SIZE 的乘積:
z = pos / (X_SIZE * Y_SIZE)
但是,通過為位置定義 a,您的系統可能會更有效(避免任何數學運算)struct;假設三個“世界維度”不大于 255,我們可以為每個元素使用單個位元組。然后,您可以擁有此類結構的陣列 (1D),并可以通過復合文字在一個陳述句中分配所有三個 (x、y 和 z) 值——無需使用宏。
這是一個簡短的演示:
#include <stdio.h>
#include <stdint.h>
typedef struct {
uint8_t x;
uint8_t y;
uint8_t z;
} pos_type;
int main()
{
uint8_t x = 37;
uint8_t y = 42;
uint8_t z = 123;
pos_type pos[100];
pos[3] = (pos_type){ x, y, z }; // Can assign elements using a compound literal
uint8_t ax = pos[3].x;
uint8_t ay = pos[3].y;
uint8_t az = pos[3].z;
printf("%hhu %hhu %hhu\n", ax, ay, az);
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/455472.html
