रे-ट्रेस एक चमकदार क्षेत्र


15

मैंने पीओवी-रे डाउनलोड किया और इस चमकदार धातु के गोले को 90 के दशक की शैली में प्रस्तुत किया:

यहां छवि विवरण दर्ज करें

आपका काम एक ही काम करना है, लेकिन जितना संभव हो उतना कम बाइट्स में रेंडरिंग इंजन को लागू करके इसे करना है। आपको इस सटीक छवि को दोहराने की ज़रूरत नहीं है - एक अनंत चेकरबोर्ड के ऊपर एक परावर्तक क्षेत्र की कोई भी छवि, जब तक यह नीचे दिए गए मानदंडों को पूरा करती है।

नियम:

  • छवि को एक अनन्त चेकरबोर्ड के ऊपर परावर्तित क्षेत्र को चित्रित करना होगा। दोनों ही बिसात और क्षेत्र में इसका प्रतिबिंब छवि में दिखाया जाना चाहिए। यह स्पष्ट रूप से स्पष्ट होना चाहिए कि यह वही है जो हम देख रहे हैं। इसके अलावा, ज्यामिति, रंग, भौतिक गुणों आदि का विवरण आपके ऊपर है।

  • दृश्य में कुछ प्रकाश होना चाहिए: गोले के हिस्से अन्य भागों की तुलना में गहरे रंग के होने चाहिए, और नेत्रहीन को यह बताना संभव होना चाहिए कि प्रकाश कहां से आ रहा है। इसके अलावा, प्रकाश मॉडल का विवरण आपके ऊपर है। (यदि आप चाहें तो आप अपने स्वयं के सरलीकृत प्रकाश मॉडल का आविष्कार कर सकते हैं।) इस क्षेत्र में छाया डालने की आवश्यकता नहीं है।

  • उपरोक्त दो मानदंड - क्या यह वास्तव में एक प्रकाश स्रोत द्वारा प्रकाशित एक बिसात के ऊपर एक चमकदार क्षेत्र जैसा दिखता है - मतदान का उपयोग करके समुदाय द्वारा आंका जाएगा। इसलिए, जीतने के लिए पात्र होने के लिए एक उत्तर में एक सकारात्मक स्कोर होना चाहिए।

  • आउटपुट कम से कम 300x300 पिक्सेल होना चाहिए। इसे स्क्रीन पर प्रदर्शित किया जा सकता है या फ़ाइल में लिखा जा सकता है, या तो ठीक है।

  • आपका कोड एक उचित आधुनिक कंप्यूटर पर एक घंटे से भी कम समय में चलना चाहिए। (यह उदार है - पीओवी-रे उपरोक्त दृश्य को व्यावहारिक रूप से त्वरित रूप से प्रस्तुत करता है।)

  • कोई अंतर्निहित किरण अनुरेखण कार्यक्षमता का उपयोग नहीं किया जा सकता है - आपको रेंडरर को स्वयं लागू करना होगा।

  • यह , इसलिए सबसे छोटा कोड (बाइट्स में) जीत के साथ सकारात्मक स्कोरिंग प्रविष्टि है। हालाँकि, आप एक सुंदर तस्वीर खींचते हुए सबसे अधिक वोट प्राप्त करने के मेटा-गेम को खेलने के लिए भी स्वागत करते हैं (जबकि कोड की कमी को ध्यान में रखते हुए)।

यह चुनौती हास्यास्पद रूप से कठिन लग सकती है, लेकिन जब से ज्यामिति तय हो जाती है, किरण अनुरेखण द्वारा इस तरह के दृश्य को प्रस्तुत करने के लिए एल्गोरिथ्म बहुत सीधा है। यह वास्तव में आउटपुट छवि में प्रत्येक पिक्सेल पर पुनरावृत्ति करने और गणितीय अभिव्यक्ति का मूल्यांकन करने का एक मामला है कि यह किस रंग का होना चाहिए, इसलिए मैं आशावादी हूं कि हम कुछ अच्छे उत्तर देखेंगे।


मैं व्यक्तिगत रूप से प्रकाश की आवश्यकता को नापसंद करता हूं। मुझे लगता है कि यह बहुत कम लाभ के लिए अतिरिक्त जटिलता जोड़ता है। हालांकि मेरी राय, हालांकि।
स्टोकैस्टिक

आप कहते हैं कि रंग हमारे ऊपर हैं। क्या इसमें greyscale चित्र शामिल हैं?
मार्टिन एंडर

@ मार्टिनबटनर हां, ग्रेस्केल चित्र ठीक हैं।
नथानिएल

@stokastic मेरी आशा है कि यह रचनात्मकता का एक स्रोत होगा, क्योंकि लोग मौलिक रूप से सरलीकृत होते हैं, लेकिन केवल प्रकाश मॉडल को समझाने के बारे में जिसे कोड की एक छोटी मात्रा में निर्दिष्ट किया जा सकता है। मैंने इस सवाल में एक नोट जोड़ा है कि सरलीकृत प्रकाश मॉडल ठीक हैं।
नथानिएल

यह पहले से ही किया गया है: fabiensanglard.net/rayTracing_back_of_business_card/index.php बेशक यह थोड़ा कम किया जा सकता है एक क्षेत्र के लिए यह कम करने, एंटीलायज़िंग़ आदि को हटाने के द्वारा
Shujal

जवाबों:


28

पायथन 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=...

प्रोग्राम चलाने से s.pgm नाम की 800x600 इमेज बन जाएगी

एक "वास्तविक" रे ट्रेसर फ़ार्मुलों से शुरू हुआ (गोल्फिंग के लिए थोड़ा सा ट्विक किया गया)।

रेंडरिंग मेरे मृत पुराने पीसी (pypy के साथ 0.7s) पर लगभग 3s लेता है।


4
सुन्दर चित्र!
नथानिएल

आप की जगह zlib चाल कर रही बिना कुछ बाइट्स बचा सकता है 0000के साथ e4भर में।
नथानिएल

@ नथानियल: दोह ... एक कोड गोल्फ के लिए बहुत बड़ी गलती :-) फिक्स्ड। मैंने zlib पैकिंग ट्रिक को भी हटा दिया है क्योंकि मुझे इसकी वैधता पर जांच करनी है (उदाहरण के लिए नवीनतम संस्करण जब ज़िप्ड मानक पायथन के साथ काम करता है लेकिन pypy के साथ काम नहीं करता है, और यह बहुत अजीब है)।
6502

एक और कोड गोल्फ ट्रिक, आप इतने लंबे समय के a if b else cसाथ बदल सकते हैं (c,a)[b]जब तक कि आप शून्य त्रुटियों द्वारा विभाजन से बचने के लिए शॉर्ट-सर्किटिंग पर भरोसा न करें। इसके अलावा if A:code;return B\nelse:return Cआप के साथ बदल सकते हैं code;return(C,B)[A]
क्लॉडिउ

@ कोलियु: सुझाव के लिए धन्यवाद। मुझे शून्य से विभाजन से बचने के लिए मापदंडों को थोड़ा बदलना पड़ा। मैंने छवि पर एक लूप का भी इस्तेमाल किया और इससे काफी बचत हुई।
6502
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.