Boru Yerleştirme Algoritması


 Boru yerleştirme algoritması için p5js.org üzerinde kodladığım bir uygulama. Herhangi bir kopuk bağlantı vermeden, birbiriyle kapalı şekilde duran boru tesisatı oluşturuyor. Çalışma şekli aşağıdaki gibi.

Normalde Wave Function Collapse üzerinde çalışma yaparken sıkıldığım bir noktada kendi algoritmamı kurdum. Aslında, bu tip işlerin doğrusu bahsettiğim Wave Funk Collapse algoritması. Yine de farklı bir şeyi sizinle paylaşmak istedim. Adım adım yapılışına geçelim.

1. Adım: Parça görsellerini sayısallaştırma

Gerçek dünyadaki bir olayı sayıllaştırdığınız andan itibaren hesaplayabilir ve hatta kodlayabilirsiniz. Burada bir boru tesisatını, birbiriyle uyumlu bir hesap oluşturabilecek şekilde sayısallaştırıyorum.

Sayısallaştırma işlemi için bir yön sırası belirlemem lazım. Tamamen bana kalmış. Ben üst kenardan başlayıp saat yönünde ilerlemeyi tercih ettim. Bu nedenle üst: 1, sağ: 2, alt: 3 ve sol: 4 yönü olacak.

Bu sefer de her bir parça için boru ucu varsa 1, yoksa 0 olacak şekilde bir kayıt yapısı tutacağım. Mavi yazılı boru parçası için parça dizisi [1, 1, 1, 0] verisini saklayacak. Dizinin indis sırası üstte anlattığım yönlere göre okunacak.

 

Hemen başka bir parça üzerinde test yapalım. Bu parçanın tüm yönlerinde boru ucu olduğu için bunun dizisi [1, 1, 1, 1] verisini saklayacak.


 

Bu yöntemle uygulamada kullanacağım boru tiplerini aşağıdaki şekilde bir diziye attım.

Sekiller = [

    [0,0,0,0],

    [1,1,0,1],

    [1,1,1,0],

    [0,1,1,1],

    [1,0,1,1],

    [1,1,1,1],

    [1,1,0,0],

    [0,1,1,0],

    [0,0,1,1],

    [1,0,0,1],

    [1,0,1,0],

    [0,1,0,1]

];

2. Adım: Uygun Yerleşimi Seçme

Ekranda üst-sol kare 0,0 noktası olmak üzere sağa doğru tarama yaptım. İlk kare olan 0,0 karesi dahil her karede aşağıdaki kontrolü yaptım.

(bulunduğum karenin üstündeki karenin alt ucu) VE (bulunduğum karenin solundaki karenin sağ ucu) değerlerine uyan tüm boru tiplerini bir dizi içerisine topla. 

Aşağıdaki örneği inceleyelim. Bulunduğum kare kırmızı çerçeveli kare olsun. Şu an ki amacımız, kırmızı çerçeveli kareye uygun boruyu seçmek. Borunun üst ve sol komşularının uçlarının değerleri resimde görülmekte.

 

Sekiller dizisine bakarak 1. indisi 1 olan VE 4. indisi 0 olan tüm boru tiplerini bir diziye atıyorum. Bunlar sadece aşağıdakiler olabilir.

Secenekler = [

    [1,1,1,0], 

    [1,1,0,0],

    [1,0,1,0]

]; 

Sonra seçenekler dizisinden rastgele bir seçim yapıp ekrana yerleştiriyorum ve diğer kareye geçiyorum. Bu şekilde tüm ekranı taradığınızda kopuk veya açık ucu olmayan bir tesisat elde etmiş olursunuz. Tesisat içerisinde, kendi içinde gruplanmış alt tesisatlar oluşabilir. Dilerseniz JScript ile kodlanmış örneğin kodlarını inceleyebilirsiniz.

 


Daha yeni Daha eski