Ray-trace เป็นทรงกลมเงางาม


15

ฉันดาวน์โหลด POV-ray และแสดงสไตล์ทรงกลม 90s โลหะมันวาวนี้:

ป้อนคำอธิบายรูปภาพที่นี่

งานของคุณคือทำสิ่งเดียวกัน แต่ทำได้โดยการนำเอ็นจิ้นการเรนเดอร์มาใช้ด้วยตัวเองในเวลาไม่กี่ไบต์เท่าที่จะทำได้ คุณไม่จำเป็นต้องทำซ้ำภาพที่แน่นอน - ภาพใด ๆ ของทรงกลมสะท้อนแสงเหนือกระดานหมากรุกที่ไม่มีที่สิ้นสุดจะทำตราบใดที่มันเป็นไปตามเกณฑ์ด้านล่าง

กฎ:

  • ภาพจะต้องแสดงให้เห็นถึงทรงกลมสะท้อนแสงลอยอยู่เหนือกระดานหมากรุกที่ไม่มีที่สิ้นสุด ทั้งกระดานหมากรุกและการสะท้อนในทรงกลมจะต้องแสดงในภาพ ต้องชัดเจนด้วยตาว่านี่คือสิ่งที่เราเห็น นอกเหนือจากนี้รายละเอียดของรูปทรงเรขาคณิตสีคุณสมบัติของวัสดุ ฯลฯ ขึ้นอยู่กับคุณ

  • จะต้องมีแสงสว่างในฉาก: ส่วนของทรงกลมควรมืดกว่าส่วนอื่นและควรมองเห็นได้อย่างชัดเจนว่าแสงมาจากไหน ยิ่งไปกว่านั้นรายละเอียดของรูปแบบแสงขึ้นอยู่กับคุณ (คุณสามารถคิดค้นรูปแบบแสงที่เรียบง่ายของคุณเองได้หากต้องการ) ทรงกลมไม่จำเป็นต้องมีเงา

  • เกณฑ์สองข้อข้างต้น - ไม่ว่าจะเป็นรูปทรงกลมที่เป็นประกายเงางามเหนือกระดานหมากรุกที่ส่องสว่างโดยแหล่งกำเนิดแสงจะถูกตัดสินโดยชุมชนโดยใช้การลงคะแนน ดังนั้นคำตอบจะต้องมีคะแนนบวกเพื่อให้มีสิทธิ์ชนะ

  • ผลลัพธ์ต้องมีอย่างน้อย 300x300 พิกเซล สามารถแสดงผลบนหน้าจอหรือเขียนลงไฟล์ได้

  • รหัสของคุณควรทำงานในเวลาน้อยกว่าหนึ่งชั่วโมงในคอมพิวเตอร์ที่ทันสมัย (นี่คือใจกว้าง - POV-ray ทำให้ฉากเหนือจริงทันที)

  • ไม่สามารถใช้ฟังก์ชั่นการติดตามเรย์ในตัวได้ - คุณต้องติดตั้ง renderer ด้วยตนเอง

  • นี่คือดังนั้นการให้คะแนนรายการบวกด้วยรหัสที่สั้นที่สุด (เป็นไบต์) ชนะ อย่างไรก็ตามคุณยังสามารถเล่น meta-game เพื่อให้ได้คะแนนมากที่สุดโดยการวาดรูปสวย ๆ (ในขณะที่รักษารหัสให้สั้น)

ความท้าทายนี้อาจดูยากอย่างน่าขัน แต่เนื่องจากเรขาคณิตได้รับการแก้ไขแล้วอัลกอริทึมสำหรับการสร้างฉากเช่นนี้โดยการติดตามรังสีจึงค่อนข้างตรงไปตรงมา เป็นเพียงการวนซ้ำของแต่ละพิกเซลในภาพออกและประเมินการแสดงออกทางคณิตศาสตร์เพื่อดูว่ามันควรเป็นสีอะไรดังนั้นฉันจึงมองโลกในแง่ดีว่าเราจะเห็นคำตอบที่ดี


ฉันเองไม่ชอบความต้องการแสง ฉันคิดว่ามันเพิ่มความซับซ้อนมากขึ้นเป็นพิเศษเพื่อผลประโยชน์ที่น้อยมาก แค่ความเห็นของฉัน
stokastic

คุณพูดว่าสีขึ้นอยู่กับเรา นั่นรวมภาพสีเทาหรือไม่?
Martin Ender

@ MartinBüttnerใช่ภาพ greyscale นั้นใช้ได้
นาธาเนียล

@stokastic ความหวังของฉันคือมันจะเป็นแหล่งที่มาของความคิดสร้างสรรค์เนื่องจากผู้คนมีรูปแบบที่เรียบง่าย แต่น่าเชื่อถือเกี่ยวกับรูปแบบแสงที่สามารถระบุได้ในรหัสเล็กน้อย ฉันได้เพิ่มบันทึกย่อในคำถามที่ว่าแสงแบบจำลองที่เรียบง่ายนั้นใช้ได้
นาธาเนียล

มันเสร็จเรียบร้อยแล้ว: fabiensanglard.net/rayTracing_back_of_business_card/index.phpแน่นอนว่าสิ่งนี้สามารถทำให้สั้นลงได้เล็กน้อยโดยลดให้เหลือหนึ่งทรงกลมลบการลดรอยหยัก ฯลฯ
Shujal

คำตอบ:


28

Python 2, 484 468 467 ไบต์

ป้อนคำอธิบายรูปภาพที่นี่

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)))

หมายเหตุ: หลังจากif I>0:มีการขึ้นบรรทัดใหม่ตามด้วยอักขระแท็บเดียวก่อนt=...

การรันโปรแกรมจะสร้างภาพ 800x600 ชื่อ s.pgm

เริ่มต้นจากสูตรการติดตามรังสี "ของจริง" (tweaked เล็กน้อยสำหรับการเล่นกอล์ฟ)

การแสดงผลใช้เวลาประมาณ 3 วินาทีบนพีซีเครื่องเก่าของฉัน (0.7 วินาทีกับ pypy)


4
ภาพที่สวยงาม!
นาธาเนียล

คุณสามารถบันทึกไม่กี่ไบต์โดยไม่ต้องทำเคล็ดลับ zlib โดยแทนที่0000ด้วยe4ตลอด
นาธาเนียล

@ นาธาเนียล: Doh ... ความผิดพลาดครั้งใหญ่มากสำหรับรหัสกอล์ฟ :-) แก้ไขแล้ว ฉันได้ลบเคล็ดลับการบรรจุ zlib ออกเพราะฉันได้ตรวจสอบความถูกต้องตามกฎหมายของมัน (เวอร์ชันล่าสุดเช่นเมื่อ zipped ทำงานกับ python มาตรฐาน แต่ไม่ได้ทำงานกับ pypy และมันแปลกมาก)
6502

อีกหนึ่งเคล็ดลับการเล่นกอล์ฟคุณสามารถแทนที่a if b else cด้วย(c,a)[b]ตราบใดที่คุณไม่ต้องพึ่งพาการลัดวงจรเพื่อหลีกเลี่ยงเช่นการหารด้วยศูนย์ข้อผิดพลาด นอกจากนี้คุณสามารถแทนที่ด้วยif A:code;return B\nelse:return C code;return(C,B)[A]
Claudiu

@Claudiu: ขอบคุณสำหรับคำแนะนำ ฉันต้องเปลี่ยนพารามิเตอร์เล็กน้อยเพื่อหลีกเลี่ยงการหารด้วยศูนย์ ฉันยังใช้ลูปเดียวเหนือรูปภาพและนั่นช่วยได้มาก
6502
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.