Altıgen ızgarada fayans yüzüğü alın


17

Bu yazı sayesinde: Altıgen fayans ve bitişik komşularını bulma, belirli bir karoya bitişik fayans toplayabilirim. Ama hemen hemen bana bir ofsetle belirtilen fayansların "halkasını" veren bir algoritmaya takıldım. Bu Yığın Taşması gönderisinde verilen algoritma, döşemeleri toplama sırasını tam olarak umursamıyor.

Her ofsette 6 karo eklendiğini biliyorum.

  • Ofset 1 size 6 karo verir (ilk bitişik karolar).
  • Ofset 2 size 12 verir.
  • Ofset 3 size 18 vs. verir.

Her bir ofset ile 6'lık sürekli bir büyüme var. Bu yüzden bu ofsetlere uyum sağlayan bir kural olması gerektiğini düşünüyorum. Bunu tam olarak anlayamıyorum. Kimse?

Yanıtlar:


23

N yarıçapına sahip altıgen bir halka, her biri N uzunluğunda 6 düz çizgiden oluşur - aşağıdaki son derece kaba örneğime bakın :) N = 2 için:

resim açıklamasını buraya girin

Oklar her biri 2 altıgeni kaplar.

Sana komşu karoyu kuzey (), güneydoğu () vb.Gibi belirli bir yönde veren bazı fonksiyonlara sahip olduğunu varsayıyorum.

var point = startingPoint.north(N)
for i = 0..N-1:
    result.add(point)
    point = point.southeast(1);
for i = 0..N-1:
    result.add(point)
    point = point.south(1);
for i = 0..N-1:
    result.add(point)
    point = point.southwest(1);
for i = 0..N-1:
    result.add(point)
    point = point.northwest(1);
for i = 0..N-1:
    result.add(point)
    point = point.north(1);
for i = 0..N-1:
    result.add(point)
    point = point.northeast(1);

Bunun N = 1, 6 döşemeyi döndüren ve boş bir kümeyi döndüren N = 0 kenar durumları için de çalışması gerektiğini unutmayın.

Kodun mükemmel olmadığını biliyorum :) Burada biraz fazlalık var. Düzenli olarak döşenmiş haritalar (altıgen veya başka türlü) kullanan projelerimde genellikle bunu daha sorunsuz yapmamı sağlayan bir "Yön" numaram var:

var point = startingPoint.inDir(N, Direction.North)
var dir = Direction.SouthEast.
for d = 0..Direction.count():
    for i = 0..N-1:
        result.add(point)
        point = point.inDir(1, dir);
    dir = nextDirection(dir);

Bu beni doğru yöne itmeli. Teşekkürler!
Sidar

2
Kod örneğinin ilk beş segment için yinelenen noktalar ekleyeceğini unutmayın. Ancak, bu güzel bir cevap.
MichaelHouse

@ Byte56 Evet, düşündüm. Ama en azından yön değiştirmeler arasındaki bağlantıyı görüyorum!
Sidar

1
@ Byte56 Gerçekten mi? Hm. Ben bir kaçınmaya çalıştım ... 0..N-1 N = 2 için 0..1 verir, bu yüzden bu i = 0 ve i = 1, 2 değerdir. Her seferinde 2 değer 6 yönde olması gerektiği gibi 12 karo ...?
Liosan

Hayır! Haklısın. Her döngü son döngüden bir nokta eklediğinden, döngüler için birer birer kapalı kaldım, benim hatam. Akıllı bir algoritma.
MichaelHouse

2

Bu makalenin altıgen ızgara algoritmaları için çok iyi bir başvuru olduğunu buldum ve "Mesafeler" bölümü, iki karo arasındaki adım sayısını belirlemek için bir yöntem sağlar. Eğer dönüştürürseniz eksenel koordinatları içine (xy) küp koordinatlarına (| dx |, | dy |, | dz |) (xyz), mesafe her zaman iki fayans veya maksimum arasındaki koordinat uzaklıklar büyük eşittir.

Ö(n2)

resim açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.