Ruby,784个字节* 0.5 * 0.7 = 274.4
我自己的回答,因此没有资格获得我的赏金。
既有资格获得非3D内置奖金,也有资格获得所有星状奖励。
->t,n{o=[]
g=->a{a.reduce(:+)/5}
f=->u,v,w,m{x=u.dup;y=v.dup;z=w.dup
15.times{|i|k,l=("i".to_c**(n[i/5]/90.0)).rect
j=i%5
x[j],y[j],z[j]=y[j],x[j]*k+z[j]*l,z[j]*k-x[j]*l}
p=g[x];q=g[y];r=g[z]
a=[0,1,-i=0.382,-1][t]*e=r<=>0
b=[j=1+i,0,j,j][t]*e
c=[-i*j,-i,1,i][t]*e
d=[j*j,j,0,0][t]*e
5.times{|i|o<<"<path id=\"#{"%9.0f"%(z[i]*a+r*b+(z[i-2]+z[i-3])*c+2*r*d+999)}\"
d=\"M#{(x[i]*a+p*b)} #{(y[i]*a+q*b)}L#{(x[i-2]*c+p*d)} #{(y[i-2]*c+q*d)}L#{(x[i-3]*c+p*d)} #{(y[i-3]*c+q*d)}\"
fill=\"##{m}\"/>"}}
a=233
b=377
z=[0,a,b,a,0]
y=[a,b,0,-b,-a]
x=[b,0,-a,0,b]
w=[-b,0,a,0,-b]
f[x,y,z,'F0F']
f[w,y,z,'0F0']
f[y,z,x,'00F']
f[y,z,w,'FF0']
f[z,x,y,'F00']
f[z,w,y,'0FF']
s=File.open("p.svg","w")
s.puts'<svg xmlns="http://www.w3.org/2000/svg" viewBox="-450 -450 900 900">',o.sort,'</svg>'
s.close}
输入为功能参数
整数0..3,对应于常规十二面体,小星状十二面体,大星状十二面体
三个整数数组,分别对应于围绕x,y和x(再次)轴旋转的度角(适当的Euler角,可以实现任何旋转)。
输出p.svg
可以在Web浏览器中显示
的文件。
说明
代码底部的数组x,y,z包含一个小的星状十二面体的一个面的外点的坐标。可以在二十面体中进行刻写,其十二个顶点由(+/- 377,+ /-233,+ /-0)的循环排列定义。请注意,377和233是连续的斐波那契数,因此377/233是黄金比率的极佳近似值。
另一个数组w包含x坐标乘以-1的值,等效于x平面中的反射。函数f被调用6次,每种颜色一次,分别具有x,y,z和w,y,z的不同循环排列。
三个旋转作为参数传递给n []。要在Ruby中使用sin和cos,必须这样做include Math
。为避免这种情况,通过将-1的平方根提高"i"
到(角度度数/ 90)的幂来获得角度的余弦和正弦值。此数的实部和虚部分别存储在k(余弦)和l(正弦
旋转之前,将交换x和y值。然后将矩阵乘法应用于y和z值,以绕x轴旋转。值的交换使三个旋转可以循环执行。
到目前为止,我们只有一环。要获得其余部分,我们需要找到五角形/星形的中心。这是通过找到存储在p,q,r中的5个顶点的坐标的平均值来完成的。
如前所述,每种颜色只能进行一次函数调用。测试了r的符号(z坐标的平均值,因此是面部的坐标)。如果为正,则该面为正面,因此可见。如果为负,则该面为背面。它是不可见的,并且我们没有函数调用相反的面孔。因此,所有三个坐标都必须反转。r的符号存储在e中以方便执行此操作。
面由5个三角形构成,其顶点是小星状十二面体的外部顶点和面中心的线性组合。对于小星状十二面体,对于三角形的尖端,我们设置a = 1和b = 0(x,y,z贡献1,p,q,r贡献0)。对于三角形的2个基本顶点,我们将c = -0.382(来自x,y,z的贡献1 /黄金比例^ 2)和d = 1.382(来自p,q,r的贡献)设置为。三角形的基本顶点是根据相对的尖端(位于面的相对侧)定义的。必要时将获得的坐标乘以e。
四个未命名的数组,其值被分配为a,b,c,d
包含常规十二面体,小星状十二面体,大十二面体和大星状十二面体的必需值,并根据变量进行选择。t
请注意,对于小星状十二面体和大十二面体,a + b = c + d = 1。关系a + b = c + d适用于其他形状,但比例不同。
为每个三角形创建一行svg代码。它包含一个ID,该ID是从三角形的三个顶点的z坐标的总和,三角形的三个坐标的顶点的描述以及颜色得出的。请注意,我们以正交投影的方式垂直向下查看z轴。因此,2D x = 3D x和2D y = 3D y。该行已添加到h.
最后,在所有函数调用完成后,对h进行排序,以便最后绘制z值最高的三角形(在前面),然后将整个内容另存为带有相应页眉和页脚文本的svg文件。
取消测试程序
h=->t,n{ #t=type of polygon,n=angles of rotation
o=[] #array for output
g=->a{a.reduce(:+)/5} #auxiliary function for finding average of 5 points
f=->u,v,w,m{x=u.dup;y=v.dup;z=w.dup #function to take 5 points u,v,w and plot one face (5 triangles) of the output in colour m
15.times{|i| #for each of 3 rotation angle and 5 points
k,l=("i".to_c**(n[i/5]/90.0)).rect #calculate the cos and sine of the angle, by raising sqrt(-1)="i" to a power
j=i%5 #for each of the 5 points
x[j],y[j],z[j]=y[j],x[j]*k+z[j]*l,z[j]*k-x[j]*l} #swap x and y, then perform maxtrix rotation on (new) y and z.
p=g[x];q=g[y];r=g[z] #find centre p,q,r of the face whose 5 points (in the case of small stellated dodecahedron) are in x,y,z
e=r<=>0 #if r is positive, face is front. if negative, face is back, so we need to transform it to opposite face.
a=[0, 1, -0.382, -1][t]*e #contribution of 5 points x,y,z to triangle tip vertex coordinates
b=[1.382, 0, 1.382, 1.382][t]*e #contribution of centre p,q,r to triangle tip vertex coordinates
c=[-0.528, -0.382, 1, 0.382][t]*e #contribution of 5 points x,y,z to coordinates of each triangle base vertex
d=[1.901, 1.382, 0, 0][t]*e #contribution of centre p,q,r to coordinates of each triangle base vertex
5.times{|i|
o<<"<path id=\"#{"%9.0f"%(z[i]*a+r*b+(z[i-2]+z[i-3])*c+2*r*d+999)}\"
d=\"M#{(x[i]*a+p*b)} #{(y[i]*a+q*b)}L#{(x[i-2]*c+p*d)} #{(y[i-2]*c+q*d)}L#{(x[i-3]*c+p*d)} #{(y[i-3]*c+q*d)}\"
fill=\"##{m}\"/>"} #write svg code for this triangle
}
a=233 #a,b =coordinate standard values
b=377
z=[0,a,b,a,0] #z coordinates for one face of stellated dodecahedron
y=[a,b,0,-b,-a] #y coordinates
x=[b,0,-a,0,b] #x coordinates
w=[-b,0,a,0,-b] #alternate x coordinates
f[x,y,z,'F0F'] #call f
f[w,y,z,'0F0'] #to plot
f[y,z,x,'00F'] #each
f[y,z,w,'FF0'] #face
f[z,x,y,'F00'] #in
f[z,w,y,'0FF'] #turn
s=File.open("p.svg","w") #sort output in o, plot front triangles last
s.puts'<svg xmlns="http://www.w3.org/2000/svg" viewBox="-450 -450 900 900">',o.sort,'</svg>'
s.close #add header and footer, and save as svg
}
t=gets.to_i
n=[]
3.times{n<<gets.to_i}
h[t,n]
输出量
用于小型星状十二面体(将很快添加其他多边形的一些图像)
1,0,0,0原位
1,30,0,0向下旋转30度
1,0,30,0向右旋转30度(注意:对于完美的侧视图,旋转将为atan(1/golden ratio)
= 31.7度,因此我们仍然可以看到一小段蓝色)
1,0,20,0向右旋转20度
1,60,10,-63上下左右旋转(方向示例仅可旋转3圈)
0,30,0,0常规十二面体
2,0,20,0大十二面体
3,45,45,45大星状十二面体
dodecahedron
不允许使用@ LegionMammal978内建绘图多面体(例如)。某些语言具有使用命令构建3D模型的功能triangle[[a,b,c],[p,q,r],[x,y,z]]
。这些语言通常具有用于旋转和显示模型的内建函数,自动注意不显示隐藏的面孔等。允许使用此类解决方案,但不会吸引人。奖励的目的是使不具备这些功能的语言具有竞争力,并吸引更多有趣的解决方案。