반짝이는 구를 광선 추적


15

POV-ray를 다운로드하여이 반짝이는 금속 구를 90 년대 스타일로 렌더링했습니다.

여기에 이미지 설명을 입력하십시오

귀하의 작업은 동일한 작업을 수행하는 것이지만 가능한 한 적은 바이트로 렌더링 엔진을 직접 구현하여 수행하는 것입니다. 이 정확한 이미지를 복제 할 필요는 없습니다. 아래의 기준을 충족하는 한 무한 바둑판 위의 반사 구 이미지는 그대로 적용됩니다.

규칙 :

  • 이미지는 무한 바둑판 위에 떠오르는 반사 구를 나타내야합니다. 바둑판 자체와 구에서의 반사가 이미지에 표시되어야합니다. 이것이 우리가보고있는 것임을 시각적으로 분명해야합니다. 이 외에도 지오메트리, 색상, 재료 속성 등의 세부 사항은 사용자에게 달려 있습니다.

  • 장면에 약간의 조명이 있어야합니다. 구의 일부는 다른 부분보다 어두워 야하며 시각적으로 빛의 출처를 대략적으로 알 수 있어야합니다. 그 외에도 조명 모델의 세부 사항은 사용자에게 달려 있습니다. 원한다면 간단한 조명 모델을 만들 수 있습니다. 구는 그림자를 드리울 필요가 없습니다.

  • 광원에 의해 조명 된 바둑판 위의 반짝이는 구처럼 보이는 위의 두 가지 기준은 투표를 사용하여 커뮤니티에 의해 판단됩니다. 따라서 답을 얻으려면 정답이 양수 여야합니다.

  • 출력은 300x300 픽셀 이상이어야합니다. 화면에 표시하거나 파일에 쓸 수 있습니다.

  • 코드는 합리적인 최신 컴퓨터에서 1 시간 이내에 실행되어야합니다. (이것은 관대합니다. POV-ray는 위의 장면을 실제로 즉각적으로 렌더링합니다.)

  • 내장 된 레이트 레이싱 기능을 사용할 수 없습니다. 렌더러를 직접 구현해야합니다.

  • 이것은 이므로 가장 짧은 코드 (바이트)를 가진 양의 스코어링 항목이 이깁니다. 그러나 코드를 짧게 유지하면서 예쁜 그림을 그려서 가장 많은 표를 얻는 메타 게임을 즐길 수도 있습니다.

이 문제는 어리석게 어려워 보일 수 있지만 지오메트리가 고정되어 있기 때문에 광선 추적으로 이러한 장면을 렌더링하는 알고리즘은 매우 간단합니다. 실제로 출력 이미지의 각 픽셀을 반복하고 수학 표현식을 평가하여 색상이 어떤지 확인 해야하는 경우 일뿐이므로 좋은 답변을 얻는 것이 낙관적입니다.


나는 개인적으로 조명 요구 사항을 싫어합니다. 나는 그것이 약간의 이득을 얻기 위해 많은 복잡성을 더한다고 생각합니다. 그래도 내 의견.
stokastic

당신은 색상이 우리에게 달려 있다고 말합니다. 그레이 스케일 이미지가 포함되어 있습니까?
Martin Ender

@ MartinBüttner 예, 그레이 스케일 이미지가 좋습니다.
Nathaniel

@stokastic 내 희망은 사람들이 근본적으로 단순화되었지만 소량의 코드로 지정할 수있는 조명 모델을 설득하는 것에 대해 창의성의 원천이 될 것입니다. 단순화 된 조명 모델이 괜찮다는 질문에 메모를 추가했습니다.
Nathaniel

이미 완료되었습니다 : 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 이미지가 생성됩니다

"실제"레이 트레이서 공식에서 시작했습니다 (골프를 위해 약간 조정).

죽은 오래된 PC에서 렌더링하는 데 약 3 초가 걸립니다 (pypy가있는 0.7 초).


4
아름다운 사진!
Nathaniel

당신은 대체하여 ZLIB 트릭을하지 않고 몇 바이트를 저장할 수 0000e4걸쳐.
Nathaniel

@Nathaniel : Doh ... 코드 골프에 대한 매우 큰 실수 :-) 고정. 또한 합법성에 대해 조사했기 때문에 zlib 패킹 트릭을 제거했습니다 (예 : 압축이 표준 파이썬에서는 작동하지만 파이썬에서는 작동하지 않는 매우 최신 버전입니다).
6502

또 다른 코드 골프 트릭, 당신은 대체 할 수 a if b else c(c,a)[b]너무 오래 당신이 제로 오류로 예를 들어 분열을 방지하기 위해 단락에 의존하지 않는. 또한로 if A:code;return B\nelse:return C바꿀 수 있습니다 code;return(C,B)[A].
Claudiu

@Claudiu : 제안 해 주셔서 감사합니다. 0으로 나누기를 피하기 위해 매개 변수를 약간 변경해야했습니다. 또한 이미지 위에 단일 루프를 사용하여 많은 비용을 절약했습니다.
6502
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.