画一个简单的立方体


10

关于绘制真实的3D多维数据集,我们没有一个单一的挑战,所以就这样:

挑战

您的任务是绘制带有透视图的旋转立方体。它可以在单独的窗口中或作为图像。

输入值

您输入的是3个介于0和359.99之间的数字...这些数字表示围绕x,y和z轴的旋转(以度为单位)。

0 0 0
30 0 40
95 320 12

输出量

您可以在单独的窗口中显示它或保存图像。您可以使用任何类型的显示(基于矢量,光栅化等)。

编辑:也允许ASCII,以仅显示文本输出来允许高尔夫语言。

光栅化或ASCII图形的输出必须至少为50 * 50(光栅化像素,ASCII字符)

附加信息

正Z轴从窗口指向,x轴为水平,y轴为垂直。基本上是OpenGL标准。

如果沿特定轴的负方向查看多维数据集,则逆时针旋转,例如向下看y轴。

相机应位于z轴上,在负z方向上与多维数据集相距一段合理的距离,该多维数据集应位于(0; 0; 0)。的。立方体还需要完全可见,并至少占据绘图框的50%。相机应在z轴正方向看立方体。

立方体的旋转按x-> y-> z顺序应用。

立方体绕其中心旋转,不移动。

要在2d空间中投影多维数据集,您需要将多维数据集的x和y坐标除以与点和相机之间与z轴平行的距离。

规则

允许使用渲染库,但需要在代码中定义顶点。没有3D立方体模型类。

测试用例

在此处输入图片说明


1
它必须是线框吗?
Rɪᴋᴇʀ

关心包括积分算法吗?
Leaky Nun

3
轮换的顺序/方向是什么?相机从哪里看?我们必须使用哪种投影?
瑕疵的2016年

6
但是正如我所说,轮换将不会解决。如您现在所定义,如果例如绕x轴旋转,则多维数据集将移出视场。请使用沙箱
瑕疵的

6
@EᴀsᴛᴇʀʟʏIʀᴋ google will tell you the formula. ,挑战应包含解决问题所需的尽可能多的材料和信息,这些信息应包含在帖子正文中。我不必为了开始了解就必须使用Google或Wikipedia。

Answers:


2

(红宝石)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

想法是在3d中同时生成/旋转四面体的四个顶点。然后,当将它们减少到2d时,我们生成反四面体的四个顶点(总共8个顶点是立方体的顶点)。这给出了对应于4个对角线的4对顶点。最后,二维顶点通过线连接:原始四面体的每个顶点必须连接到反四面体的每个顶点,从而形成立方体的12个边和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度相同),但最终使用此特定值并没有高尔夫球优势,因此它已成为任意选择。


3

HTML / CSS / JS,739个字节,可能无法竞争

但是我只是想炫耀CSS 3D变换。


这实际上看起来很整洁。我以前曾经体验过CSS3转换,但是遇到了问题。
巴林特

您似乎轮换的顺序错误。应该是x,然后是y,然后是z。您有z,然后是y,然后是x。@Bálint可以确认。
Level River St

@LevelRiverSt当我写这篇文章时,我不知道命令应该是什么,也无法从测试用例中得出结果,因此感谢您的更新。我还翻转了X旋转的方向,所以现在我匹配了所有测试用例。
尼尔

您还能提供字节数吗?即使答案不符合要求,它们也应始终具有字节计数
Downgoat '16

@Downgoat打高尔夫球还是打高尔夫球?
尼尔

0

枫树,130 + 14(进行中)

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

在此处输入图片说明

这将在框内绘制常量函数,然后使用绘图选项隐藏刻度线,标签和函数本身。添加projection=.5到选项可以使摄像机更近,从而实现透视图。
我写这之前的规格已经确定并以旋转次序是x, y', z''代替x, y, z。在我确定角度之前,这是另一种解决方案

POV-射线,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>}

通过读取输入a.txt应包含文件
#declare R=<xx,yy,zz>;
xx,yy,zz作为旋转角

在此处输入图片说明


1
是的,使用POV射线是一个很棒的程序。不幸的是,这些规则现在规定不能使用3d多维数据集类。
英里
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.