绘制3D网-柏拉图式固体


14

这是难度更大的Drawing 3d nets-Archimedean实体的基本版本。

我对3d蚊帐有一个缺点,当将其剪裁和折叠后,可以用纸或卡片制作3d形状。任务很简单,编写最短的程序即可绘制5个柏拉图固体的网。输出应该是您选择的任何合理格式的图像文件(png,jpg等)。

http://en.wikipedia.org/wiki/Platonic_solid中描述了所有五个形状。他们的蚊帐看起来像这样(摘自http://www.newscientist.com/gallery/unfolding-the-earth/2)。

在此处输入图片说明

输入: 1到5之间的整数。假设形状按其边数的顺序编号。因此,1将是四面体,5将是二十面体。

输出:包含该形状网的图像文件。只需包括内部线条的轮廓即可。无需用颜色填充

您可以使用自己喜欢的任何编程语言,也可以使用不是专门为这次比赛而制作的任何库。两者都应该在线免费提供(从两种意义上来说)。

我会在一周的时间内接受最少字符数的答案。

优胜者。只有一个参赛者,但是很棒。优胜者是……Raufio,因为我最喜欢的代码高尔夫球是什么。

Answers:


8

Python中,456 429 381

import turtle as t
L="fl"
R="fr"
d=L*3+R*3
b=(d+R)*3
a=[b,120,L*3+"fflflffflflfrflflfffl"+R*4+"flf",90,b+"ffrfrflffrffrfrfrflflf",120,(R*5+L*5+R+L)*5+"rrfr"+L*5+R*2+L*2+R*4+"f",72,(d+"f")*5+"rfl"+((d+"b")*5)[:-1],120]
l=t.lt
f=t.fd
b=t.bk
r=t.rt
p=input()*2-2 
t.setup(.9,.9)
t.goto(-200,150)
t.clear()
for c in a[p]:exec c+"(a[p+1])"
t.getscreen().getcanvas().postscript(file="o")

我实现了一个原始解释器,它带有l r f bas运算符,可将龟形光标以形状的角度四处移动。一次只能旋转一个角度。我通过重用字符串(类似于psuedo子例程)来压缩字符串,除此之外,我没有检查是否使用了最佳路径。输出到后记文件。

取消编码的一些解释:

import turtle as t
Left="fl"
Right="fr"
diamond= Left*3 + Right*3
tetrahedron=(d+R)*3 #used to be b

导入内置的turtle模块并定义缩短字符串的宏。乌龟模块使用命令在屏幕上移动“乌龟”(即,向前(100),向左(90))

netList=[
   #tetrahedron
   tetrahedron,120,
   #cube
   Left*3+"fflflffflflfrflflfffl"+Right*4+"flf",90,
   #octohedron, builds off the tetrahedron
   tetrahedron+"ffrfrflffrffrfrfrflflf",120,
   #dodecahedron
   (Right*5 + Left*5 + Right + Left)*5
    +"rrfr"+
    Left*5 + Right*2 + Left*2 + Right*4 + "f",72,
   #icosahedron
   (diamond+"f")*5 +"rfl"+((diamond+"b")*5)[:-1],120
]

该列表包含角度和移动顺序。四面体被保存下来以与八面体一起重复使用。

l=t.left
f=t.forward
b=t.back
r=t.right

这是我喜欢的部分,它使单个字符成为本地函数,因此可以通过预定义的字符串来缩短和自动化调用。

input=int(raw_input())*2-2 
t.setup(.9,.9)
t.goto(-200,150)
t.clear()

首先从输入(介于1到5之间)并将其转换为指向netList中形状字符串的索引开始。这些设置乌龟显示整个网络。如果仅是绘制任务,则可以将其忽略,但是由于我们需要图片输出,因此需要它们。

for command in netList[input]:
    exec command+"(netList[input+1])"
t.getscreen().getcanvas().postscript(file="o")

for循环采用命令序列字符串中的命令并执行它们,因此对于像“ fl”这样的字符串,它将执行“ forward(angle); left(angle);” 通过调用新创建的本地函数。最后一行使用乌龟函数输出名为“ o”的文件,其格式为Postscript格式。

运行

将其复制到文件中并从那里运行。当您运行它时,它将等待1到5之间的数字输入(我只是更改了它,以便在设置乌龟之前询问)。输入数字时,将弹出一个窗口并绘制网络。如果您希望它运行得更快,可以在t.speed(200)之前添加setup

您可以将其复制粘贴到解释器中,但是在raw_input()调用它时,它将消耗您输入的下一个字符串"t.setup(.9,.9)"而不是数字。因此,如果执行此操作,请复制直到raw_input(),输入一个数字,然后复制并粘贴其余部分。它旨在作为一个整体运行。或者,您可以将其复制到函数中并调用它。

这是它的输出(从后记转换):

注意:这些控件在窗口中的位置已更改,但它们的整体形状相同。

四面体 立方体 八面体 十二面体 二十面体

对于代码高尔夫来说,这有点蛮力,但是我厌倦了试图在形状之间找到一致的图案。


很接近。十二面体肯定更棘手。
felipa

@Raufio很好。是否不可能先定义一个三角形(或正方形或五边形)然后旋转/移动它?还是这实际上是您所做的?
felipa

实际上,是的,这就是我所做的,但是形状更大。例如,通过绘制两个三角形(一个在另一个顶部),向前移动5次,然后在新的位置进行重置,再将钻石向后移动,然后重复5次,来绘制二十面体。d是做两个三角形的字符串,所以是(d+'f')*5+setupPosition+(d+'b')*5
Raufio

@Raufio打高尔夫球的代码对我不起作用。它打开一个几乎是空白的窗口。如果再按回车键,则会得到p =(ord(raw_input())-49)* 2 TypeError:ord()需要一个字符,但是找到了长度为0的字符串
felipa

1
@felipa setup使乌龟窗口大到足以容纳网。用同样的事goto,它会将“乌龟”至-200,150 clear清除所作的线goto。他们只是用来设置图纸的命令。p=(ord(raw_input())-49)*2取一个1到5的数字,对应于您想要的形状。
Raufio 2013年

6

Mathematica

出于竞争目的,不是自由语言(除非免费试用算为免费)

f[n_] := PolyhedronData[ Sort[PolyhedronData["Platonic", {"FaceCount","StandardName"}]][[n,2]],
                                                                                       "NetImage"]

用法:

f /@ Range@5

Mathematica图形


1
Mathematica绝对不是免费的。但是,非常好的答案。
felipa

@felipa是免费的,就像在Raspberry Pi上的啤酒一样。
shrx 2015年

你知道,在那台免费的计算机上,树莓派
Undergroundmonorail

6

Python 2(含cairo)-239

from cairo import*
s=PSSurface(None,99,99)
g=Context(s)
g.move_to(30,20)
a=str([34,456,3455,568788,3454445555][input()-1])
f=6.28
for c in a+a[::-1]:exec'g.rel_line_to(8,0);g.rotate(f/int(a[0]));'*int(c);f=-f
g.stroke()
s.write_to_png('o')

结果:

结果


3

徽标,199字节

TO p:d:n:s
rt :n*45 for[i 1 :n/8][pu setxy :d*:i 0 pd repeat 2[for[k 1 :s*2+2][fd 40 rt (360-720*(:k>:s))/:s] rt 720/:s]]END
TO q:j
apply "p item :j [[70 9 3][56 23 4][70 16 3][105 26 5][40 42 3]]END

回读此书,我看到我的原始版本不符合所写的规范(采用数值参数并绘制一个形状),而是由其他一些答案(绘制所有形状)进行了解释。新版本解决了该问题。它期望被称为例如q 5cs应该在清除屏幕并将乌龟指向北方之前进行。

qp使用3个参数调用main函数。它的语法非常肿,因此要超过我以前的分数,我不得不在其他地方删除字节。

新版本的p带有3个参数。不需要xy因为我们只绘制一个网,但是d单元之间的间距仍然保持。s 仍然是每个多边形的边数,n现在可以编码两种不同的东西> n/8是要绘制的子单元数,并且n*45是在开始之前乌龟必须旋转的角度(利用自然mod 360进行旋转。 )

改进的循环可在单个循环中完成s具有向右旋转的画线和具有向左旋转的画线s+2

与我第一次发表文章时相比,calormen解释器现在似乎对缺少空白的容忍度更高,但是代码在 http://turtleacademy.com/playground/en

徽标,200字节

TO p:x:y:d:n:s
for[i 1:n][pu setxy:x:y-:d*:i if:i<>6[pd]repeat 2[repeat:s[fd 40 rt 360/:s]repeat:s+2[fd 40 lt 360/:s]rt 720/:s]]END
p 0 200 40 7 3
p 70 0 80 2 3
p -200 200 105 3 5
rt 45
p 90 90 56 2 4

http://www.calormen.com/jslogo/#处的解释程序假定乌龟在程序运行之前指向北方。使用cs命令清除屏幕,将乌龟指向北,然后将其放置在屏幕中心的原点。

在此处输入图片说明

以上所有网络的基本单位是一对背对背多边形。它们排列成两行交错排列,组成一个4个多边形的子单元,可以将它们垂直平移以构成所有网(八面体除外,八面体在二十面体和四面体的图形上搭顺风车)。该亚基形成1个四面体网,二十面体网的1/5,十二面体网的1/3和立方体网的2/3(绘制了两个亚基,中间两个正方形重叠)。

非高尔夫代码

TO p :x :y :d :n :s                 ;x,y=starting point d=negative vertical offset for each iteration n=#of iterations s=# of sides on polygon
  for[i 1 :n][                      ;iterate n times 
    pu                              ;pen up
    setxy :x :y- :d* :i             ;move pen to start of iteration
    if :i<>6[pd]                    ;pen down (supressed for i=6 to enable part of octahedron to be drawn with icosahedron)
    repeat 2[                       ;draw lower row of 2 polygons, then upper row of 2 polygons
      repeat :s[fd 40 rt 360/ :s]   ;starting at lower left of polygon facing up, draw righthand polygon
      repeat :s+2[fd 40 lt 360/ :s] ;starting at lower right of polygon facing up, draw lefthand polygon, duplicating last two sides
      rt 720/ :s                    ;return turtle to upwards facing in order to draw second row
    ]
  ]
END
cs
p 0 200 40 7 3                      ;draw icosahedron and left side of octahedron (6th iteration is suppressed)
p 70 0 80 2 3                       ;draw right side of octahedron, and tetrahedron
p -200 200 105 3 5                  ;draw dodecahedron
rt 45                               ;turn turtle in preparation for drawing cube
p 90 90 56 2 4                      ;draw cube

@phase哈哈,谢谢,我实际上考虑过ht要为图像隐藏它。我很高兴我没有!
水平河圣
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.