簡體   English   中英

這個算法將坐標映射到稱為的數字是什么?

[英]What is this algorithm mapping coordinates to numbers called?

我正在編寫一個用於可視化晶體的程序。 作為程序的一部分,我必須在晶格結構中生成所有不同的基本點。 對於那些不熟悉晶體學的人,你可以在這里找到這些結構最常見的例子: https//en.wikipedia.org/wiki/Hermann%E2%80%93Mauguin_notation#Lattice_types

問題是我想跟蹤所有這些要點。 所以我給了他們一個號碼。 我正在嘗試使用筆和紙,並找到了一個很好的算法,通過以二進制形式寫出來將坐標(2D或3D)與數字(以及相反的方式)連接起來。

因此,如果您想要,例如,2D中的簡單立方晶格,並且您想知道第14點的坐標,您可以將此二進制數寫為001110.您將數字分為00 | 11 | 10,其中最多右邊的部分代表(x,y)* 1,中間部分代表(x,y)* 2,左邊的部分代表(x,y)* 4(對於數字14來說沒用,只是為了制作一切清除)等等。 所以數字14映射到點(3,2)。

一個簡單的C ++程序,用於生成前50個int的坐標:

int x, y;

for (int n = 0; n < 50; n++)
{
    x = 0;
    y = 0;

    bitset<16>  nset(n);

    for (int i = 0; i < 16/2; i++)
    {
        x+=(nset[2*i]*pow(2.,i));
        y+=(nset[2*i+1]*pow(2.,i));
    }

    cout  << n << "\t" << x << "\t" << y << endl;
}

我通過為z值保留一個額外的列將此算法擴展到3D,並通過保留第一個或兩個列的類型為x + 1/2,y + 1/2,z + 1 /來擴展其他格子類型2個屬性,每種格子類型不同。

所以這是我的問題: 這個算法是否已存在? 它有名字嗎? 或者這只是二進制數學的一個明顯應用? 我讀了一些關於hashmaps的東西,但這對我來說似乎更有效,至少如果你處理的是整數。

這是我在stackexchange的第一個問題,懷疑我必須在這里或在物理論壇上發布這個問題。 或者也許在數學論壇上,因為這是一種R ^ 2-> R雙射。 如果這個問題不在正確的地方,請糾正我。

所以這是我的問題:這個算法是否已存在? 它有名字嗎?

此映射稱為Z順序曲線或Morton代碼

在數學分析和計算機科學中,Z次序,莫頓次序或莫頓碼是將多維數據映射到一維的同時保留數據點的局部性的函數。 它由GM Morton於1966年推出。 通過交錯其坐標值的二進制表示來簡單地計算多維中的點的z值 一旦將數據分類為該排序,就可以使用任何一維數據結構,例如二叉搜索樹,B樹,跳過列表或(具有低有效位截斷)哈希表。 得到的排序可以等效地描述為從四叉樹的深度優先遍歷得到的順序。

在此輸入圖像描述

如示例C ++代碼所示,x坐標存儲在偶數位中,y坐標存儲在奇數位中。 映射可以很容易地擴展到更高的維度。

對於位編碼使用的位操作運算,這些數字的快速交織一些算法可以發現在這里

我可能會誤解你的代碼,但你似乎正在做的是獲取二進制數的偶數位,將它們連接在一起形成一個新數字,並將該數字用作x坐標。 你似乎對y坐標做了同樣的事情。

我不認為這個算法的名稱,雖然它似乎是一個非常標准的技術。 對於它的價值,我認為通過使用按位運算符而不是bitsetpow ,可以更輕松地完成你在這里所做的事情:

for (int n = 0; n < kUpperBound; n++) {
    int x = 0;
    int y = 0;

    for (int i = 0; i < 8; i++) {
        if (n & (1 << (2*i)) != 0) {
           x += 1 << i;
        }
        if (n & (1 << (2*i + 1)) != 0) {
           y += 1 << i;
        }
    }
    cout << n << " " << x << " " << y << endl;
}

1 << k是第k位為1的數字,否則為0。 如果n的第k位為0,則使用按位AND運算符將該數字與n返回0,否則返回非零數字。 因此,測試if (n & (1 << k) != 0)檢查n的第k位是否被置位。 然后,我們使用1 << k的數值為2 k的事實,而不是使用pow來評估2 n

希望這可以幫助!

遺憾的是,對你來說可能沒有任何幫助,但作為一個奇怪的瑣事,這對應於來自笑話語言INTERCAL的INTERLEAVE(或MINGLE)運算符。

我不知道這個編碼的另一個名字。 但它通常用得不多,因為在大多數計算機上都有可用的指令,簡單地將兩個(或多個)整數的二進制表示連接在一起就簡單快捷,這只需要O(d)時間(也許只需要很少)作為d-1機器指令)用於d維。 關於編碼的一個優點是它不需要你為每個維度提交固定的比特大小,因此編碼格點所需的最大比特數與日志的比例成正比。最大坐標值 - 您實際使用的是什么?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM