簡體   English   中英

點之間唯一距離的一維數組

[英]1d array of unique distances between points

我正在使用 pl.nets(點)編寫一個 N 體模擬器。 我已經讓它工作了,但仍然有很多可能的優化,其中之一是計算一次點之間的距離並將它們存儲在一個數組中。 我可以使用 2d 數組(需要轉換為 1d,因為 GPU 不支持 2d 數組)但是有兩個問題:

  1. 模擬將限於 √2147483647(最大 integer 值)pl.nets = 46340 pl.nets,因為數組的大小為 n^2(n 是 pl.nets 的數量)
  2. 很多距離會重復(0 和 1 之間的距離與 1 和 0 之間的距離相同)

要獲得唯一連接的數量,公式為:D = (n*(n-1))/2
但現在我遇到了一個問題:如何在給定兩個 pl.net id-s (x,y) 的距離數組中獲取索引。 pl.net 0 和 1 之間的距離索引是 0, 0-2 -> 1, 1-2 -> 2...

為了幫助形象化這看起來像什么,這里有一個表格顯示哪個索引(在一維數組中)對應於每對 pl.net id。 要使用此表,給定一對 pl.net id,找到對應於兩個 id 中較大者的行,以及對應於兩個 id 中較小者的列,這將為您提供具有索引的單元格該距離存儲在一維數組中的位置。

在此處輸入圖像描述

所以,現在我們需要一個給定兩個 pl.net id 並計算一維索引號的公式。 為簡單起見,我們假設首先給出較大的 pl.net id。 (如果不是,那么我們可以簡單地交換兩個 pl.net id。)

第一項工作是獲取較大的 pl.net id 並確定其行中的第一個索引。 換句話說,我們需要將 1 轉換為 0、2 轉換為 1、3 轉換為 3、4 轉換為 6、5 轉換為 10、6 轉換為 15 等。幸運的是,模式 0,1,3,6,10,15 是眾所周知——它是三角數 第 N 個三角數的常用公式是 (n*(n+1))/2 但在這種情況下我們實際上想要第 N-1 個三角數,所以我們想要的公式是(n*(n-1))/2 .

一旦我們有了該行的第一個索引,我們就可以添加較小的 pl.net id 來獲得最終索引。

所以,我們的最終公式是:

 given A (larger planet id) and B (smaller planet id):
 the index of dist(A,B) in the 1D array is ((A * (A-1)) / 2) + B

暫無
暫無

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

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