Vẽ một khối lập phương đơn giản


10

Chúng tôi không có một thách thức nào về việc vẽ một khối 3 chiều thực sự, vì vậy đây là:

Thử thách

Nhiệm vụ của bạn là vẽ một hình khối xoay, có phối cảnh. Nó có thể ở trong một cửa sổ riêng biệt hoặc dưới dạng hình ảnh.

Đầu vào

Đầu vào của bạn là 3 số riêng biệt trong khoảng từ 0 đến 359,99 ... Chúng đại diện cho xoay quanh trục x, y và z theo độ.

0 0 0
30 0 40
95 320 12

Đầu ra

Bạn có thể hiển thị nó trong một cửa sổ riêng biệt hoặc lưu hình ảnh. Bạn có thể sử dụng bất kỳ loại màn hình nào (dựa trên vector, rasterized, v.v.).

Chỉnh sửa: ASCII cũng được cho phép, để cho phép các ngôn ngữ chơi gôn chỉ có đầu ra văn bản.

Đầu ra cho đồ họa rasterized hoặc ASCII phải có ít nhất 50 * 50 (pixel cho rasterization, ký tự cho ASCII)

Thông tin thêm

Trục z dương chỉ ra từ cửa sổ, trục x nằm ngang và trục y thẳng đứng. Về cơ bản là tiêu chuẩn OpenGL.

Các vòng quay ngược chiều kim đồng hồ nếu bạn nhìn vào khối theo hướng tiêu cực của một trục cụ thể, ví dụ như nhìn xuống trục y.

Máy ảnh phải nằm trên trục z ở khoảng cách hợp lý với khối lập phương theo hướng z âm, khối phải ở (0; 0; 0). Các. khối lập phương cũng cần phải được nhìn thấy đầy đủ, và chiếm ít nhất 50% khung vẽ. Máy ảnh nên nhìn theo hướng z dương tại khối lập phương.

Các phép quay của khối được áp dụng theo thứ tự x-> y-> z.

Khối lập phương được xoay quanh trung tâm của nó, nó không di chuyển.

Để chiếu một khối trong không gian 2d, bạn cần chia tọa độ x và y của khối với khoảng cách song song với trục z giữa điểm và máy ảnh.

Quy tắc

Thư viện kết xuất được cho phép, nhưng các đỉnh cần được xác định trong mã. Không có mô hình khối lập phương 3d.

Các trường hợp thử nghiệm

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


1
Nó có phải là khung dây không?
Rɪᴋᴇʀ

Muốn bao gồm một thuật toán cho các điểm?
Leaky Nun

3
Thứ tự / hướng là các phép quay được thực hiện trong? Máy ảnh nhìn từ đâu? Những loại chiếu nào chúng ta phải sử dụng?
flawr

6
Nhưng như tôi đã nói, các phép quay sẽ không hoạt động. Như bạn đã xác định bây giờ, khối lập phương sẽ được chuyển ra khỏi trường nhìn nếu ví dụ xoay quanh trục x. Vui lòng sử dụng hộp cát .
flawr

6
@ EᴀsᴛᴇʀʟʏIʀᴋ google will tell you the formula. Không , các thách thức nên chứa càng nhiều tài liệu và thông tin cần thiết để giải quyết chúng càng tốt, bao gồm trong phần thân bài . Tôi không cần phải đi tìm hoặc Wikipedia chỉ để bắt đầu hiểu.
con mèo

Câu trả lời:


2

Giày (Ruby) 235 231

Tất cả mọi thứ được tính toán từ đầu.

Shoes.app{p,a,b,c=ARGV.map{|j|j.to_f/90}
k=1+i="i".to_c
p=(0..3).map{|j|y,z=(k*i**(j+a)).rect
x,z=(((-1)**j+z*i)*i**b).rect
q=(x+y*i)*i**c
[90*(k+q/(z-4)),90*(k+q/(4+z))]}
4.upto(15){|j|line *(p[j%4][0].rect+p[(j+j/4)%4][1].rect)}}

Gọi từ dòng lệnh, vd shoes cube3d.rb 0 30 0

Ý tưởng là đồng thời tạo / xoay bốn đỉnh của một khối tứ diện trong 3d. Sau đó, khi chúng giảm xuống còn 2d, chúng ta tạo ra bốn đỉnh của tứ diện nghịch đảo (tổng số 8 đỉnh là của các khối lập phương.) Điều này tạo ra 4 cặp đỉnh tương ứng với 4 đường chéo cơ thể. Cuối cùng, các đỉnh 2d được nối với nhau bằng các đường: mỗi đỉnh của tứ diện ban đầu phải được nối với mỗi đỉnh của tứ diện nghịch đảo tạo thành 12 cạnh và 4 đường chéo cơ thể của khối. Việc đặt hàng đảm bảo các đường chéo cơ thể không được vẽ.

Trường hợp kiểm tra đầu ra

Lưu ý rằng, để phù hợp với hai trường hợp thử nghiệm gần nhất, xoay quanh trục z theo chiều kim đồng hồ từ POV của người xem. Điều này dường như là mâu thuẫn với thông số kỹ thuật tuy nhiên. Hướng quay có thể được đảo ngược bằng cách sửa đổi *i**c->/i**c

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

vô dụng

Shoes.app{
  p,a,b,c=ARGV.map{|j|j.to_f/90}   #Throw away first argument (script name) and translate next three to fractions of a right angle.
  k=1+i="i".to_c                   #set up constants i=sqrt(-1) and k=1+i

  p=(0..3).map{|j|                 #build an array p of 4 elements (each element wil be a 2-element array containing the ends of a body diagonal in complex number format)
    y,z=(k*i**(j+a)).rect          #generate 4 sides of square: 1+i,i-1,-1-i,-i+1, rotate about x axis by a, and store in y and z as reals 
    x,z=(((-1)**j+z*i)*i**b).rect  #generate x axis displacements 1,-1,1,-1, rotate x and z about y axis by b, store in x and z as reals
    q=(x+y*i)*i**c                 #rotate x and y about z axis, store result in q as complex number
  [90*(k+q/(z-4)),90*(k+q/(4+z))]} #generate "far" vertex q/(4+z) and "near" vertex q/-(4-z) opposite ends of body diagonal in 2d format.

  4.upto(15){|j|                   #iterate through 12 edges, use rect and + to convert the two complex numbers into a 4 element array for line method
    line *(p[j%4][0].rect+         #cycle through 4 vertices of the "normal" tetrahedron
     p[(j+j/4)%4][1].rect)         #draw to three vertices of the "inverted" tetrahedron. j/4=1,2,3, never 0
  }                                #so the three edges are drawn but the body diagonal is not.
}

Lưu ý rằng vì lý do lịch sử, hệ số tỷ lệ 90 được áp dụng trong dòng 9 (được chọn giống với 90 độ trong dòng 2) nhưng cuối cùng không có lợi thế về việc sử dụng giá trị cụ thể này, vì vậy nó đã trở thành một Lựa chọn tùy ý.


3

HTML / CSS / JS, 739 byte, có thể không cạnh tranh

Nhưng tôi chỉ muốn thể hiện các biến đổi CSS 3D.


Điều này thực sự trông khá gọn gàng. Tôi đã có kinh nghiệm với các biến đổi CSS3 trước đây, nhưng tôi đã gặp vấn đề với nó.
Bálint

Bạn dường như có các vòng quay theo thứ tự sai. Nên là x rồi y rồi z. Bạn có z thì y rồi x. @ Bálint có thể xác nhận.
Cấp sông St

@LevelRiverSt Khi tôi viết bài này, tôi không biết thứ tự nên là gì và tôi không thể giải quyết nó từ các trường hợp thử nghiệm, vì vậy cảm ơn vì đã cập nhật cho tôi. Tôi cũng đã lật hướng xoay X, vì vậy bây giờ tôi khớp tất cả các trường hợp thử nghiệm.
Neil

Bạn vẫn có thể cung cấp số byte? Ngay cả khi các câu trả lời không có tính cạnh tranh, chúng vẫn luôn phải có số byte
Downgoat

@Downgoat Chơi gôn hay vô danh?
Neil

0

Maple, 130 + 14 (đang tiến hành)

with(plots):f:=(X,Y,Z)->plot3d(0,x=0..1,y=0..1,style=contour,tickmarks=[0,0,0],labels=["","",""],axes=boxed,orientation=[Z,-X,Y]);

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

Điều này vẽ một hàm không đổi bên trong một hộp, sau đó sử dụng các tùy chọn cốt truyện để ẩn dấu tick, nhãn và chính hàm đó. Thêm projection=.5vào các tùy chọn mang máy ảnh lại gần hơn, cho phép xem phối cảnh.
Tôi đã viết điều này trước khi thông số kỹ thuật được hoàn thiện và thứ tự xoay vòng x, y', z''thay vì x, y, z. Cho đến khi tôi sửa các góc, đây là một giải pháp khác

POV-Ray, 182

#include"a.txt"
#include"shapes.inc"
camera{location 9*z look_at 0}
light_source{9*z color 1}
object{Wire_Box(<-2,-2,-2>,<2,2,2>,.01,0)texture{pigment{color rgb 1}}rotate<R.x,-R.y,-R.z>}

đọc đầu vào thông qua các a.txttập tin mà nên chứa
#declare R=<xx,yy,zz>;
với xx,yy,zzlà góc xoay

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


1
Yay cho việc sử dụng POV-ray, đây là một chương trình tuyệt vời. Thật không may, các quy tắc hiện nay nói rằng không có lớp lập phương 3d nào có thể được sử dụng.
dặm
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.