구두 (루비) 235 231
처음부터 모든 것이 계산되었습니다.
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)}}
커맨드 라인에서 호출 shoes cube3d.rb 0 30 0
아이디어는 3 차원에서 4 면체의 4 개의 정점을 동시에 생성 / 회전시키는 것입니다. 그런 다음 이것들이 2d로 축소됨에 따라 우리는 4 면체의 정점 4 개를 생성합니다 (총 8 개의 정점은 큐브의 정점입니다). 이것은 4 개의 대각선에 해당하는 4 쌍의 정점을 제공합니다. 마지막으로 2 차원 꼭짓점은 선으로 연결됩니다. 원래 4 면체의 각 꼭짓점은 입방체의 12 개의 가장자리와 4 개의 대각선을 형성하는 역 4 면체의 각 꼭짓점에 연결되어야합니다. 순서는 바디 대각선이 플롯되지 않도록합니다.
테스트 케이스 출력
마지막 두 테스트 사례와 일치하도록 z 축을 중심으로 회전하는 것은 뷰어의 POV에서 시계 방향입니다. 그러나 이것은 사양과 모순되는 것 같습니다. 수정하여 회전 방향을 바꿀 수 있습니다 *i**c
->/i**c
언 골프
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.
}
역사적 이유로 9 번 줄에 90의 스케일 팩터가 적용되었지만 (골프의 경우 2 번 줄의 90 도와 동일하게 선택됨) 결국이 특정 값을 사용할 때 골프 이점이 없었으므로 임의의 선택.