Başlangıçta herkesle aynı cevaba sahip olacaktım ve bu konulara tebeşir koyacaktım rand()
. Ancak, bunu yapmayı daha iyi düşündüm ve bunun yerine matematiğinizin gerçekte ürettiği dağılımı analiz ettim.
TL; DR: Gördüğünüz kalıbın altında yatan rasgele sayı üreteci ile bir ilgisi yoktur ve bunun yerine programınızın sayıları işleme biçiminden kaynaklanmaktadır.
Hepsi benzer olduğu için mavi işlevinize bağlı kalacağım.
uint8_t blue(uint32_t x, uint32_t y) {
return (rand() % 2) ? (x + y) % rand() :
((x * y % 1024) % rand()) % 2 ? (x - y) % rand() :
rand();
}
Her bir piksel değerinin üç fonksiyon birinden seçilir: (x + y) % rand()
, (x - y) % rand()
ve rand()
;
Bunların her biri tarafından üretilen görüntülere bakalım.
Bu beklediğiniz, sadece gürültü. Buna "Resim C" deyin
Burada piksel koordinatlarını bir araya getiriyorsunuz ve kalanını rastgele bir sayıya bölmekten alıyorsunuz. Görüntü 1024x1024 ise toplam [0-2046] aralığındadır. Dalış yaptığınız rasgele sayı [0, RAND_MAX] aralığındadır; burada RAND_MAX en az 32k ve bazı sistemlerde 2 milyardır. Başka bir deyişle, geri kalanın sadece(x + y)
. Yani çoğunlukla bu fonksiyon sadece + x + y yönüne doğru artan mavi bir gradyan üretecektir.
Ancak yalnızca en düşük 8 biti kullanıyorsunuz çünkü uint8_t
değerini 256 piksel genişliğinde degrade şeritleriniz olacak.
Buna "Resim A" deyin
Burada benzer bir şey yaparsınız, ancak çıkarma ile. X y'den büyük olduğu sürece önceki görüntüye benzer bir şey elde edersiniz. Ancak y'nin daha büyük olduğu yerde sonuç çok büyük bir sayıdır, çünkü x
vey
imzalanmamıştır (negatif sonuçlar imzalanmamış türün aralığının üstüne sarılır) ve sonra % rand()
vurur ve aslında gürültü alırsınız.
Buna "Resim B" deyin
Son görüntüdeki her bir piksel işlevlerini kullanarak bu üç resimlerden birini alınır rand() % 2
ve ((x * y % 1024) % rand()) % 2
. Bunlardan ilki,% 50 olasılıkla seçim olarak okunabilir (sorunları rand()
ve düşük dereceli bitlerini göz ardı ederek ).
İşte rand() % 2
doğru olanın bir örneği (beyaz pikseller), böylece Resim A seçildi.
İkinci fonksiyon , genellikle bölündüğünüzden daha büyük , en fazla 1023 olan bir ((x * y % 1024) % rand()) % 2
soruna sahiptir.rand()
(x * y % 1024)
(x*y%1024)%2
0 ve 1'i eşit sıklıkta üretmez. Herhangi bir tek sayının herhangi bir çift sayıyla çarpımı çifttir. Herhangi bir çift sayının herhangi bir çift sayıyla çarpımı da çifttir. Sadece tek bir sayının tek bir sayıyla çarpımı tuhaftır ve bu nedenle %2
zamanın dörtte üçü olan değerler zamanın dörtte üçünü üretecektir.
((x * y % 1024) % rand()) % 2
Resim B'nin seçilebilmesi için nerede doğru olduğunun bir örneği. Her iki koordinatın tam olarak nerede olacağını seçiyor.
Ve burada Resim C'nin nerede seçilebileceğinin bir örneği:
Son olarak, Resim B'nin seçildiği koşullar şöyledir:
Resim C'nin seçildiği yer:
Ortaya çıkan kombinasyon şu şekilde okunabilir:
% 50 olasılıkla Resim A'daki pikseli kullanın. Kalan süre, her iki koordinatın tek olduğu Resim B ile Resim C, B arasında seçim yapın, her ikisinin de eşit olduğu C.
Son olarak, üç farklı renk için aynı şeyi yaptığınızdan, ancak farklı yönelimlerle, desenler her renkte farklı şekilde yönlendirilir ve gördüğünüz geçiş şeritlerini veya ızgara desenini üretir.