光沢のある球をレイトレースする


15

POV-rayをダウンロードし、この光沢のある金属球90年代スタイルをレンダリングしました。

ここに画像の説明を入力してください

あなたのタスクは同じことをすることですが、できる限り少ないバイト数でレンダリングエンジンを自分で実装することです。この正確な画像を複製する必要はありません-無限のチェッカーボードの上にある反射球の画像は、以下の基準を満たしている限り実行されます。

ルール:

  • 画像は、無限のチェッカーボードの上に浮かぶ反射球を描写する必要があります。チェッカーボード自体と球体での反射の両方を画像に表示する必要があります。これが私たちが見ているものであることは視覚的に明確でなければなりません。これ以外にも、ジオメトリ、色、材料特性などの詳細はあなた次第です。

  • シーンにはある程度の照明が必要です。球体の部分は他の部分よりも暗く、視覚的には光がどこから来ているかを大まかに伝えることができるはずです。さらに、照明モデルの詳細はあなた次第です。(必要に応じて、独自の簡易照明モデルを作成できます。)球体は影を落とす必要はありません。

  • 上記の2つの基準-光源によって照らされたチェッカーボード上の真に輝く球体のように見えるかどうか-は、投票を使用してコミュニティによって判断されます。したがって、答えが勝つには、正のスコアが必要です。

  • 出力は少なくとも300x300ピクセルでなければなりません。画面に表示するか、ファイルに書き込むことができます。どちらでも構いません。

  • 合理的な最新のコンピューターでコードを1時間以内に実行する必要があります。(これは寛大です-POV-rayは上記のシーンをほぼ瞬時にレンダリングします。)

  • 組み込みのレイトレーシング機能は使用できません-レンダラーを自分で実装する必要があります。

  • これはであるため、最短のコード(バイト単位)を持つ正のスコアのエントリが優先されます。ただし、きれいな絵を描いて(もちろんコードを短くしながら)最も多くの票を獲得するメタゲームをプレイすることもできます。

この課題はとてつもなく難しいように思えるかもしれませんが、ジオメトリが固定されているため、レイトレーシングによってそのようなシーンをレンダリングするアルゴリズムは非常に簡単です。実際には、出力画像の各ピクセルを反復処理し、数式を評価してそれがどの色であるかを確認するだけのケースなので、良い答えが見つかると楽観的です。


私は個人的に照明の要件が嫌いです。私はそれが非常にわずかな利益のために、多くの余分な複雑さを追加すると思います。ただ、私の意見です。
確率論的14年

色は私たち次第だとあなたは言います。グレースケール画像が含まれていますか?
マーティンエンダー14年

@MartinBüttnerはい、グレースケール画像は問題ありません。
ナサニエル14年

@stokastic私の希望は、それが創造性の源になることです。人々は根本的に単純化されますが、わずかなコードで指定できる照明モデルを説得するだけです。単純化された照明モデルは問題ないという質問にメモを追加しました。
ナサニエル14年

これはすでに行われている:fabiensanglard.net/rayTracing_back_of_business_card/index.phpはもちろん、これは少し短くすることができるアンチエイリアスなど取り外し、1球にそれを減らすことによって
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=...

プログラムを実行すると、s.pgmという名前の800x600イメージが作成されます

「本物の」レイトレーサーの公式から始まりました(ゴルフ用に少し調整しました)。

レンダリングには、古いPCで約3秒かかります(pypyでは0.7秒)。


4
美しい画像!
ナサニエル14年

あなたは置き換えることにより、zlibのトリックを行うことなく数バイトを保存することができ0000e4全体。
ナサニエル

@Nathaniel:Doh ...コードゴルフの非常に大きな間違い:-)修正。また、合法性を調査する必要があるため、zlibパッキングトリックも削除しました(たとえば、zip圧縮された標準の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.