Ray-vết một quả cầu sáng bóng


15

Tôi đã tải xuống POV-ray và thể hiện phong cách hình cầu kim loại sáng bóng thập niên 90 này:

nhập mô tả hình ảnh ở đây

Nhiệm vụ của bạn là làm điều tương tự, nhưng thực hiện nó bằng cách tự thực hiện công cụ kết xuất với càng ít byte càng tốt. Bạn không cần phải sao chép hình ảnh chính xác này - bất kỳ hình ảnh nào của một quả cầu phản chiếu phía trên một bàn cờ vô hạn sẽ làm, miễn là nó đáp ứng các tiêu chí dưới đây.

Quy tắc:

  • Hình ảnh phải mô tả một hình cầu phản chiếu lơ lửng phía trên một bàn cờ vô hạn. Cả bản thân bàn cờ và hình phản chiếu của nó trong hình cầu phải được hiển thị trong hình ảnh. Nó phải rõ ràng trực quan rằng đây là những gì chúng ta đang thấy. Ngoài ra, các chi tiết về hình học, màu sắc, tính chất vật liệu, vv là tùy thuộc vào bạn.

  • Phải có một số ánh sáng trong cảnh: các phần của quả cầu nên tối hơn các phần khác, và trực quan có thể cho biết đại khái là ánh sáng đến từ đâu. Ngoài ra, các chi tiết của mô hình ánh sáng là tùy thuộc vào bạn. (Bạn có thể phát minh ra mô hình chiếu sáng đơn giản của riêng bạn nếu bạn muốn.) Quả cầu không phải tạo bóng.

  • Hai tiêu chí trên - cho dù nó thực sự trông giống như một quả cầu sáng bóng phía trên một bàn cờ được chiếu sáng bởi một nguồn sáng - sẽ được cộng đồng đánh giá bằng cách sử dụng biểu quyết. Do đó, một câu trả lời phải có điểm tích cực để đủ điều kiện giành chiến thắng.

  • Đầu ra phải có ít nhất 300x300 pixel. Nó có thể được hiển thị trên màn hình hoặc ghi vào một tập tin, hoặc là tốt.

  • Mã của bạn sẽ chạy trong vòng chưa đầy một giờ trên một máy tính hiện đại hợp lý. (Điều này thật hào phóng - Tia POV tái hiện cảnh trên thực tế ngay lập tức.)

  • Không có chức năng dò tia tích hợp nào có thể được sử dụng - bạn phải tự thực hiện trình kết xuất.

  • Đây là , vì vậy mục ghi điểm tích cực với mã ngắn nhất (tính bằng byte) sẽ thắng. Tuy nhiên, bạn cũng được hoan nghênh chơi trò chơi meta để nhận được nhiều phiếu bầu nhất bằng cách vẽ một bức tranh đẹp (trong khi vẫn giữ mã ngắn).

Thử thách này có vẻ khó khăn một cách lố bịch, nhưng vì hình học đã được sửa, thuật toán hiển thị cảnh như vậy bằng phương pháp dò tia là khá đơn giản. Đây thực sự chỉ là một trường hợp lặp lại qua từng pixel trong hình ảnh đầu ra và đánh giá một biểu thức toán học để xem nó nên có màu gì, vì vậy tôi rất lạc quan rằng chúng ta sẽ thấy một số câu trả lời hay.


Cá nhân tôi không thích các yêu cầu ánh sáng. Tôi nghĩ rằng nó thêm rất nhiều phức tạp thêm, cho rất ít lợi ích. Chỉ là ý kiến ​​của tôi, mặc dù.
stokastic

Bạn nói màu sắc là tùy thuộc vào chúng tôi. Có bao gồm hình ảnh thang độ xám?
Martin Ender

@ MartinBüttner vâng, hình ảnh thang độ cao là tốt.
Nathaniel

@stokastic Hy vọng của tôi là nó sẽ là một nguồn sáng tạo, khi mọi người đưa ra các mô hình chiếu sáng đơn giản nhưng hoàn toàn thuyết phục có thể được chỉ định trong một lượng nhỏ mã. Tôi đã thêm một lưu ý trong câu hỏi rằng các mô hình chiếu sáng được đơn giản hóa là OK.
Nathaniel

Nó đã được thực hiện: fabiensanglard.net/rayTracing_back_of_business_card/index.php Tất nhiên điều này có thể được thực hiện ngắn hơn một chút bằng cách giảm nó xuống một hình cầu, loại bỏ khử răng cưa, v.v.
Shujal

Câu trả lời:


28

Python 2, 484 468 467 byte

nhập mô tả hình ảnh ở đây

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

Lưu ý: sau khi if I>0:có một dòng mới theo sau là một tab char trước t=...

Chạy chương trình sẽ tạo ra một hình ảnh 800x600 có tên s.pgm

Bắt đầu từ một công thức theo dõi tia "thực" (được điều chỉnh một chút để chơi gôn).

Kết xuất mất khoảng 3 giây trên PC cũ đã chết của tôi (0,7 giây với pypy).


4
Hình ảnh đẹp!
Nathaniel

Bạn có thể lưu một vài byte mà không cần thực hiện thủ thuật zlib bằng cách thay thế 0000bằng e4trong suốt.
Nathaniel

@Nathaniel: Doh ... một lỗi rất lớn cho một mã golf :-) Đã sửa. Tôi cũng đã loại bỏ thủ thuật đóng gói zlib vì tôi đã điều tra về tính hợp pháp của nó (ví dụ phiên bản mới nhất khi được nén với trăn tiêu chuẩn nhưng không hoạt động với pypy và điều đó rất lạ).
6502

Một mẹo chơi gôn mã khác, bạn có thể thay thế a if b else cbằng (c,a)[b]miễn là bạn không dựa vào đoản mạch để tránh việc chia sai số bằng 0. Ngoài ra if A:code;return B\nelse:return Cbạn có thể thay thế bằng code;return(C,B)[A].
Claudiu

@Claudiu: Cảm ơn lời đề nghị. Tôi đã phải thay đổi các tham số một chút để tránh chia cho 0. Tôi cũng đã sử dụng một vòng lặp duy nhất trên hình ảnh và điều đó đã tiết kiệm rất nhiều.
6502
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.