Işın izi parlak bir küre


15

POV-ray'ı indirdim ve bu parlak metal küre 90'ların stilini oluşturdum:

resim açıklamasını buraya girin

Göreviniz aynı şeyi yapmak, ancak render motorunu mümkün olduğunca az baytta kendiniz uygulayarak yapmaktır. Bu tam görüntüyü kopyalamak zorunda değilsiniz - sonsuz bir dama tahtası üzerindeki yansıtıcı bir kürenin herhangi bir görüntüsü, aşağıdaki ölçütleri karşıladığı sürece yapacaktır.

Kurallar:

  • Görüntü, sonsuz bir dama tahtası üzerinde uçan yansıtıcı bir küreyi tasvir etmelidir. Hem dama tahtasının kendisi hem de küredeki yansıması resimde gösterilmelidir. Gördüğümüz bu görsel olarak açık olmalıdır. Bunun ötesinde geometrinin, renklerin, malzeme özelliklerinin vs. detayları size kalmış.

  • Sahnede bir miktar aydınlatma olmalı: kürenin parçaları diğer bölümlerden daha karanlık olmalı ve görsel olarak ışığın nereden geldiğini söylemek mümkün olmalıdır. Bunun ötesinde, aydınlatma modelinin detayları size kalmış. (İsterseniz kendi basitleştirilmiş aydınlatma modelinizi icat edebilirsiniz.) Kürenin gölge atması gerekmez.

  • Yukarıdaki iki kriter - gerçekten bir ışık kaynağı tarafından aydınlatılan bir dama tahtasının üzerinde parlak bir küre gibi görünse de - oylama kullanılarak topluluk tarafından değerlendirilecektir. Bu nedenle, bir cevabın kazanmaya uygun olması için olumlu bir puanı olmalıdır.

  • Çıktı en az 300x300 piksel olmalıdır. Ekranda görüntülenebilir veya bir dosyaya yazılabilir, ya da iyidir.

  • Kodunuz makul ve modern bir bilgisayarda bir saatten az bir sürede çalışmalıdır. (Bu cömerttir - POV-ışını yukarıdaki sahneyi pratik olarak anında oluşturur.)

  • Yerleşik ışın izleme işlevi kullanılamaz - oluşturucuyu kendiniz uygulamanız gerekir.

  • Bu , bu nedenle en kısa kod (bayt cinsinden) ile pozitif puanlama kazanır. Bununla birlikte, hoş bir resim çizerek (kodu elbette kısa tutarken) en fazla oyu almanın meta oyununu da oynayabilirsiniz.

Bu meydan okuma gülünç derecede zor görünebilir, ancak geometri sabit olduğundan, böyle bir sahneyi ışın izlemeyle oluşturma algoritması oldukça basittir. Bu sadece çıktı görüntüsündeki her piksel üzerinde yineleme ve hangi rengin olması gerektiğini görmek için matematiksel bir ifadeyi değerlendirme örneğidir, bu yüzden bazı iyi cevaplar göreceğimiz konusunda iyimserim.


Kişisel olarak aydınlatma ihtiyacını beğenmedim. Çok az kazanç için çok fazla karmaşıklık eklediğini düşünüyorum. Sadece benim fikrim.
stokastic

Renklerin bize bağlı olduğunu söylüyorsunuz. Bu gri tonlamalı görüntüler içeriyor mu?
Martin Ender

@ MartinBüttner evet, gri tonlamalı görüntüler gayet iyi.
Nathaniel

umtokastic umudum, insanlar radikal olarak basitleştirilmiş ama sadece az miktarda kodla belirtilebilecek ikna edici aydınlatma modelleri ile geldikçe, bunun bir yaratıcılık kaynağı olacağıdır. Soruya, basitleştirilmiş aydınlatma modellerinin iyi olduğuna dair bir not ekledim.
Nathaniel

Zaten yapılmıştır: fabiensanglard.net/rayTracing_back_of_business_card/index.php kursu Of bu biraz daha kısa yapılabilir düzgünleştirme vb kaldırmak gibi bir kürenin indirgeyerek
Shujal

Yanıtlar:


28

Piton 2, 484 468 467 bayt

resim açıklamasını buraya girin

i=int;u=249.3
def Q(A,B):
 a=A*A+B*B+9e4;b=B*u+36e4;I=b*b-a*128e4
 if I>0:
    t=(-b+I**.5)/(5e2*a);F,G,H=A*t,B*t,u*t;J,K,M=F,G+.6,H+2.4;L=a**-.5;k=2*(A*J+B*K+u*M)*L;C,D,E=A*L-k*J,B*L-k*K,u*L-k*M;L=(C*C+D*D+E*E)**-.5;t=(-4e2-G)/D;return(D*D*L*L*u,((i(F+t*C)/200+i(H+t*E)/200)&1)*(u*D*L))[D>0]
 else:return(u*B*B/a,((i(-2e2/B*A)/200+i(-6e4/B)/100)&1)*u*B/a**.5)[B>0]
open("s.pgm","wb").write("P5 800 600 255 "+"".join(chr(i(Q(j%800-4e2,j/800-u)))for j in range(480000)))

Not: Yeni if I>0:bir satır ve ardından tek bir sekme karakteri geldikten sonra t=...

Programı çalıştırmak s.pgm adlı 800x600 resim oluşturur

"Gerçek" ışın izleyici formülleri (golf için biraz tweaked) başladı.

Oluşturma, ölü eski bilgisayarımda yaklaşık 3s sürüyor (pypy ile 0.7s).


4
Güzel fotoğraf!
Nathaniel

Sen değiştirerek zlib hile yapmadan birkaç byte kaydedebilirsiniz 0000ile e4boyunca.
Nathaniel

@Nathaniel: Doh ... bir kod golf için çok büyük bir hata :-) Sabit. Zlib paketleme hilesini de kaldırdım çünkü yasallığını araştırmam gerekiyor (örneğin, sıkıştırılmış standart python ile çalışıyor, ancak pypy ile çalışmadığında ve bu çok garip).
6502

Başka kod golf hile, sen yerini alabilir a if b else cile (c,a)[b]çok uzun sıfır hataları örn bölünmeyi önlemek için kısa devre güvenmeyin olarak. Ayrıca if A:code;return B\nelse:return Cile değiştirebilirsiniz code;return(C,B)[A].
Claudiu

@Claudiu: Öneri için teşekkürler. Sıfırla bölünmeyi önlemek için parametreleri biraz değiştirmek zorunda kaldım. Ayrıca görüntü üzerinde tek bir döngü kullandım ve bu çok tasarruf etti.
6502
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.