İlk. Her bir voksel hakkında ne bildiğimizi yazalım:
voxel = (x, y, z, color) // or some other information
Genel depolama
Genel yol basitçe şudur:
set of voxels = set of (x,y,z, color)
Bu üçlünün (x, y, z) her bir vokseli benzersiz bir şekilde tanımladığına dikkat edin, çünkü voksel uzayda bir noktadır ve iki noktanın bir yeri işgal etmesinin bir yolu yoktur (bence statik voksel verileri hakkında konuşuyoruz).
Basit veriler için iyi olmalıdır. Ancak hiçbir şekilde hızlı bir veri yapısı değildir.
İşleme AFAIK tarama hattı algoritması ile yapılır. Tom'un voksellerle ilgili Donanım makalesinde tarama çizgisi algoritması görüntüsü vardır .
Hızlı arama
Hızlı arama gerekiyorsa, arama için en hızlı veri yapısı karma'dır (aka dizi, harita ...). Bu yüzden karma yapmak zorundasınız. Yani, saf bir şekilde keyfi bir öğe elde etmenin en hızlı yolunu istiyoruz:
array [x][y][z] of (color)
V, x, y, z koordinatlarına göre voksel aramak için O (1) vardır.
Sorun, alan gereksinimlerinin O (D ^ 3) olması, burada D her x, y ve z sayısının aralığıdır (Gerçek sayıyı unutun, çünkü 256 değer aralığına sahip Chars olsaydı 256 ^ olurdu) 3 = 2 ^ 24 == 16 777 216 dizideki elemanlar).
Ancak bu, voksellerle ne yapmak istediğinize bağlıdır. Oluşturmak istediğiniz şeyse, muhtemelen istediğiniz bu dizidir. Ancak depolama sorunu hala devam ediyor ...
Depolama alanı sorunsa
Bir yöntem dizide RLE sıkıştırması kullanmaktır. Bir dilim voksel düşünün (voksellerin bir koordinat sabit değerine sahip olduğu voksel seti .... örneğin z = 13 olduğu düzlem gibi). Bu tür voksel dilim MSPaint'te basit bir çizim gibi görünecektir . Voksel modeli, söyleyebilirim, genellikle tüm olası yerlerin bir kısmını işgal eder (tüm olası voksellerin D ^ 3 alanı). "Bir çift koordinat üçlüsü almak ve kalan ekseni sıkıştırmak" hile yapacağına inanıyorum (örneğin [x] [y] almak ve her öğe için verilen x, y de tüm eksenlerde z ekseni sıkıştırmak .. 0 ila birkaç öğe olmalı, RLE burada iyi olur):
array [x][y] of RLE compressed z "lines" of voxel; each uncompressed voxel has color
Depolama sorununu çözmek için diğer yöntem, ağaç veri yapısını kullanarak dizi yerine:
tree data structure = recursively classified voxels
for octrees: recursively classified by which octant does voxel at (x,y,z) belong to
- Octree, Nick'in belirttiği gibi. Vokselleri sıkıştırmalıdır. Octree arama için iyi bir hıza sahip, sanırım N'nin voksel sayısı olduğu bazı O (log N).
- Octree düzgün rasgele voksel verilerini depolayabilmelidir.
Eğer vokseller basit bir yükseklik haritasıysa, sadece bunu saklayabilirsiniz. Veya parametreyi, yükseklik haritasını oluşturan, yani yordamsal olarak üreten işleve depolayabilirsiniz ...
Ve elbette tüm olası yaklaşımları birleştirebilirsiniz. Ancak kodunuzun çalışıp çalışmadığını test edip GERÇEKTEN daha hızlı olduğunu (yani optimizasyona değdiğini) ölçmedikçe aşırıya kaçmayın.
TL; DR
Octrees dışında voxels, google "voxlap", "ken silverman" ile RLE sıkıştırma ...
kaynaklar
Kaynakların listesi ve hızlı voksel oluşturucunun nasıl yapılacağı hakkında tartışmalar, kağıtlar ve kaynak kodu içerir .