平铺,给定顶点配置


11

任务

给定顶点配置,任务是平铺多边形。

计分

您的分数等于您提交的内容达到的“复杂程度”。复杂度级别是累积的,这意味着要达到#3,您还必须支持#1和#2。

具有相同复杂度级别的提交通过字节计数来区分;最低的胜利。

输入值

输入是一个包含顶点配置的字符串,表示一个顶点图形。也就是说,以点分隔的整数列表,其中每个整数(n)表示一个正则n角,由一个公共顶点连接。

必须支持以下顶点配置:

  • 3.3.3.3.3.3
  • 3.3.3.3.6
  • 3.3.3.4.4 (请注意,顺序反映在顶点图中,因此以下内容确实有所不同)
  • 3.3.4.3.4
  • 3.12.12
  • 3.4.6.4
  • 3.6.3.6
  • 4.4.4.4
  • 4.6.12
  • 4.8.8
  • 6.6.6

输出-复杂度级别1:顶点图形

在此复杂度级别上,输出是显示与给定输入相对应的顶点图形的图像。

输入前面带有一个F,表示应该输出顶点图形,而不是完整的图块。

例如,F3.6.3.6给出以下顶点图形:

3.6.3.6顶点图

输出-复杂度级别2:平铺

在此复杂度级别下,输出的图像是使用对应于给定输入的顶点图形显示均匀平铺的图像。

例如3.6.3.6给出以下平铺:

3.6.3.6平铺

颜色或格式(没有漏洞)没有限制。

输出-复杂度级别3:双重平铺

在这种复杂性级别上,可以从每个切片形成“双重切片”。这是通过从每个多边形的中心到每个边界多边形的中心绘制线来实现的。

通过在输入前面加上来指定双重平铺V

例如,V3.6.3.6给出以下双重平铺(红色):

V3.6.3.6平铺


其中一些拼贴具有同义词。例如,以下内容都是相同的:3.3.3.4.4 3.3.4.4.3 3.4.4.3.3 4.4.3.3.3 4.3.3.3.4。我们是否必须支持所有同义词,或者仅支持词汇最低的同义词(如问题中所述)?而且,3.3.3.3.6以两种镜像形式存在。我知道任何一个都可以接受。
水平河圣

您链接的页面与给定的列表不匹配。3.3.3.4.4例如缺少。en.wikipedia.org/wiki/…与您的列表完全匹配。我知道轮廓或填充的多边形是可以接受的(或两者结合使用?)列表中已经包含一些对偶。例如4.4.4.4,它是自己的对偶,3.3.3.3.3.3并且6.6.6互为对偶。由于对偶是独立于其父母显示的,所以我了解无需与父母正确对齐。
水平河圣

您必须支持列表中显示的输入-您可以支持同义词,但不必这样做-您必须支持所有对偶,甚至对偶。
jsh 2014年

轮廓/填充-任一种方式都可以。除漏洞外,任何样式都允许(使所有内容变白,使绘图区域变小等)。不需要对齐。我可以告诉您,不允许使用一种反射,3.3.3.3.6但是您怎么知道它是哪一种?:)
jsh

现在您已经更改了得分,抢七是什么?这仍然是最短的代码吗?如果是这样,顶点配置是否必须由点分隔,还是可以选择其他符号,例如逗号或空格?
级圣河

Answers:


9

英国广播公司

版本1高尔夫代码,655个ASCII字符,标记化文件大小614

数据表的一些重大改进,方法是在查找之前将字符串散列A.B..N为一个数字(1*A+2*B+..n*N)+n,并仅存储一个翻译矢量(另一种翻译矢量由代码生成。)完成高尔夫球之后,请进行更多说明。

t=PI*2DIMm(9)
c=0z=0INPUTz$
FORi=1TOLEN(z$)d%=VAL(MID$(z$,i))IFd%c+=1m(c)=d%i-=d%=12z+=c*d%
NEXTREPEATREADl,e,f
UNTILl=z+c
l=4-3*(m(3)MOD3=0)-8*(l=59)
DATA69,0,70,65,100,35,66,149,0,49,109,0,52,80,0,55,0,189,39,120,0,44,40,40,58,55,95,47,136,0,59,40,0
VDU23,23,3|
FORr=-9TO19FORs=-9TO9a=1+e*(r*2+s)-f*l*s/4b=1+f*(r*2+s)+e*l*s/4p=40q=0FORk=1TOm(c)/2FORj=1TOc
n=m(j)o=TAN(PI/3)IFe=109ANDn<>4o=1
w=-p*COS(t/n)-q*SIN(t/n)q=p*SIN(t/n)-q*COS(t/n)p=w
u=p:v=q
x=a:y=b
MOVEx,y
FORi=1TO14x+=u*2y+=v*2IFVAL(z$)DRAWx,y ELSEGCOL9LINEx-u-v/o,y-v+u/o,x-u+v/TAN(PI/n),y-v-u/TAN(PI/n)
w=v*COS(t/n)-u*SIN(t/n)u=v*SIN(t/n)+u*COS(t/n)v=w
NEXTNEXT
p=u:q=v
a=x:b=y
NEXTNEXTNEXT

修订版0高尔夫球代码,770个ASCII字符,标记化的文件大小为728

我在这里所做的只是删除注释,不必要的空格和引号,并将所有内容DATA放在一行上。当然还有更多打高尔夫球的空间。

t=PI*2DIMm(9)
c=0INPUTz$
FORi=1TOLEN(z$)d%=VAL(MID$(z$,i))IFd%c+=1:m(c)=d%:i-=d%=12
NEXTREPEATREADl$,e,f,g,h
UNTILMID$(z$,1-(VAL(z$)=0))=l$
DATA3.3.3.3.3.3,240,0,120,70,3.3.3.3.6,200,70,40,210,3.3.3.4.4,80,0,40,150,3.3.4.3.4,-40,150,150,40,3.12.12,300,0,150,260,3.4.6.4,220,0,110,188,3.6.3.6,160,0,80,140,4.4.4.4,80,0,0,80,4.6.12,0,380,330,-190,4.8.8,272,0,136,136,6.6.6,240,0,120,70
VDU23,23,3|
FORr=-9TO19 FORs=0TO9a=1+e*r+g*s
b=1+f*r+h*s
p=40q=0FORk=1TOm(c)/2FORj=1TOc
n=m(j)o=TAN(PI/3):IFe=220ANDn<>4o=1
w=-p*COS(t/n)-q*SIN(t/n)q=p*SIN(t/n)-q*COS(t/n)p=w
u=p:v=q
x=a:y=b
MOVEx,y
FORi=1TO14x+=u*2y+=v*2IFVAL(z$)DRAWx,y ELSEGCOL9LINEx-u-v/o,y-v+u/o,x-u+v/TAN(PI/n),y-v-u/TAN(PI/n)
w=v*COS(t/n)-u*SIN(t/n)u=v*SIN(t/n)+u*COS(t/n)v=w
NEXTNEXT
p=u:q=v
a=x:b=y
NEXTNEXTNEXT

说明

这是我以前的1级答案的延续,但是我决定将其单独发布,因为它相当长。

2级

这是通过翻译我以前回答中的“ 1.5级”模板来实现的。每个图块的两个转换向量都经过硬编码。我利用了一个事实,即底数为80且高度为70的等腰三角形很好地近似了等边三角形,而带有斜边矢量(56,56)的直角三角形的斜边长度非常接近80。

3级

要绘制对偶,而不是绘制多边形的边缘,我们绘制一条从该边缘的中间到多边形中心的辐条。它与边缘成直角,并且具有1/TAN/(PI/n)向量(u,v)的时间长度,而向量的长度又是边缘的一半。

不幸的是,由于平铺中的某些多边形3.3.3.3.63.4.6.4没有明确地绘制,因此仅执行此操作就不会绘制它们。因此,辐条也从多边形向外延伸。向外扩展由变量控制o

默认情况下,扩展名足以到达三角形的中心,但是对于3.4.6.4它的扩展需要更多,以便绘制未明确绘制的正方形的对偶。因此,当显式绘制六边形和三角形时,将应用足够的扩展来填充缺失的正方形,而当显式绘制正方形时,将应用法向扩展,以避免相邻三角形中出现伪线。

这是没有辐条扩展的外观。可以清楚地看到双重图案中的孔。正确的输出可以在答案底部的主图看到

在此处输入图片说明

注释代码

与我以前的答案的差异以内联方式表示

  t=PI*2                                          :REM constant Tau = PI*2

  DIMm(9)                                         :REM declare array for the numbers in the input
  c=0                                             :REM number of polygons in the list

  INPUTz$
  FORi=1TOLEN(z$)                                 :REM for each character in the input
    d%=VAL(MID$(z$,i))                            :REM use VAL to return the numeric value of the substring to the right and store to integer variable
    IF d% c+=1 :m(c)=d%: i-=d%=12                 :REM if the last character read was a number, d% contains it, otherwise 0. Advance c and store to m. If it is 12, increment i to skip a character.
  NEXT

  REM BLOCK OF NEW CODE to define vectors (e,f) and (g,h) for each possible tiling

  REPEAT
    READ l$,e,f,g,h                               :REM read an entire line of the data below
  UNTIL MID$(z$,1-(VAL(z$)=0))=l$                 :REM abort the loop when l$ coincides with the input. the MID$ strips off the 'V' from the input where necessary.

  DATA"3.3.3.3.3.3",240,0,120,70
  DATA"3.3.3.3.6",200,70,40,210
  DATA"3.3.3.4.4",80,0,40,150
  DATA"3.3.4.3.4",-40,150,150,40
  DATA"3.12.12",300,0,150,260
  DATA"3.4.6.4",220,0,110,188
  DATA"3.6.3.6",160,0,80,140
  DATA"4.4.4.4",80,0,0,80
  DATA"4.6.12",0,380,330,-190
  DATA"4.8.8",272,0,136,136
  DATA"6.6.6",240,0,120,70

  VDU23,23,3|                                           :REM change linewidth to 3 (default is 1)

  REM END BLOCK OF NEW CODE

  FORr=-9TO19 FORs=0TO9                                 :REM two new loops for translations

      a=1+e*r+g*s                                       :REM modified code for
      b=1+f*r+h*s                                       :REM coordinates to start drawing at


      p=40:q=0                                          :REM vector of first line

      FORk=1TOm(c)/2                                    :REM draw half as many vertex figures as there are sides on the last polygon in the list

        FORj=1TOc                                       :REM for each polygon on the list
          n=m(j)                                        :REM n=number of sides
          o=TAN(PI/3): IF e=220 AND n<>4 o=1            :REM new code for the spoke extension 1/o. 

          w=-p*COS(t/n)-q*SIN(t/n)                      :REM rotate the starting vector anticlockwise by the internal angle of the current polygon
          q=p*SIN(t/n)-q*COS(t/n)                       :REM to avoid overlapping the previous one, if any.
          p=w

          u=p:v=q                                       :REM make a local copy of the vector and coordinates
          x=a:y=b                                       :REM to avoid corruption of p,q,a,b during the drawing of the polygon
          MOVE x,y                                      :REM move the graphics cursor to the start without drawing
          FORi=1TO14                                    :REM do 14 iterations regardless of the number of sides on the polygon
            x+=u*2                                      :REM increment x and y by the vector representing the side
            y+=v*2                                      :REM the value is double (u,v) to facilitate drawing duals later

            REM if z$ begins with a numeric character, draw an edge. If not, change to red and draw a spoke.
            IFVAL(z$) DRAW x,y ELSE GCOL9: LINEx-u-v/o,y-v+u/o,x-u+v/TAN(PI/n),y-v-u/TAN(PI/n)             

            w=v*COS(t/n)-u*SIN(t/n)                     :REM rotate the vector clockwise
            u=v*SIN(t/n)+u*COS(t/n)                     :REM through the external angle of the polygon
            v=w
          NEXT                                          :REM draw next edge of the current polygon
        NEXT                                            :REM draw next polygon of the current vertex

        p=u:q=v                                         :REM once the vertex is finished, we will be two sides around the perimeter of the last polygon.
        a=x:b=y                                         :REM copy the position and direction data into p,q,a,b.
      NEXT                                              :REM draw next vertex figure

    NEXT                                                :REM close the two new translation loops
  NEXT

输出量

该程序每次运行仅执行一次平铺或两次平铺。但是,它以红色绘制对偶。为了节省空间,我将程序运行了两次而不清除屏幕,以便将双精度叠加在常规平铺的顶部。

在此处输入图片说明


8

Mathematica

级别1包含基本图块模板,这些图块模板被重复冲压以平铺平面。

2级进行平铺。

我仍然无法实现2个拼贴。它们似乎需要旋转和平移。

级别1:顶点图形(559字节)

nGon[n_]:=
{ColorData[46,"ColorList"][[n]],Polygon@Switch[n,
3,{{0,0},{-1/2,.866},{-1,0},{0,0}},
4,{{0,0},{0,1},{-1,1},{-1,0},{0,0}},
6,Table[{Cos[i 2Pi/n],Sin[i 2Pi/n]}+{-.5,.866},{i,0,n}],
8,Table[1.31{Cos[i Pi/4],Sin[i Pi/4]}+{-0.5`,1.207},{i,1/2,9}],
_,Table[2{Cos[i 2Pi/n],Sin[i 2Pi/n]}+{-0.5176,1.932},{i,1/2,13}]]}
innerAngle[n_]:=180-360/n
g[{}]=0;
g[a_]:=-(Plus@@innerAngle/@a)

h[{{},__,out_}]:=out
h[{list_,angles_,out_}]:=(
z=GeometricTransformation[nGon[l=list[[1]]],RotationTransform[g[angles] Degree]];
h[{Rest@list,Append[angles,l],Append[out,z]}])

测试中

Row[Graphics[{EdgeForm[{Blue}], #}, 
      ImageSize -> 70] & @@ {h[{#, {}, {}}]} & /@ {{3, 3, 3, 3, 3, 
    3}, {3, 3, 3, 3, 6}, {3, 3, 3, 4, 4}, {3, 3, 4, 3, 4}, {3, 12, 
    12}, {3, 4, 6, 4}, {3, 6, 3, 6}, {4, 4, 4, 4}, {4, 6, 12}, {4, 8, 
    8}, {6, 6, 6}}]

邮票


级别2:平铺(690个其他字节)

规则返回每种配置的平铺偏移量和缩进量。

r 是输出图块的基本功能。

p显示模板和相应的切片。空白对应于模板未涵盖的空白。

rules={
{3,6,3,6}-> {2,3.47,0,0},
{4,4,4,4}-> {1,1,0,0},
{6,6,6}-> {3,2.6,1.5,0},
{3,3,3,3,3,3}-> {1.5,1.74,0,.9},
{3,3,3,3,6}-> {2,2.6,-0.4,1.8},

{4,6,12}->{4.2,4.9,0,2.5},
{3,3,4,3,4}-> {1.87,1.86,-.5,-0.5},
{4,8,8}-> {3.4,3.4,0,0},
{3,3,3,4,4}-> {2,1.87,.52,0},
{3,12,12}-> {3.82,6.73,0,0},
{3,4,6,4}-> {1.4,4.3,0(*1.375*)-1,-2.4}};


r[nGons_]:=
Module[{horizHop,vertHop,indent,downIndent},
{horizHop,vertHop,indent,downIndent}=(nGons/.rules);
Graphics[{EdgeForm[{Blue}],Table[GeometricTransformation[h[{#,{},{}}]&/@{nGons},
TranslationTransform[{
If[MemberQ[{{3,3,4,3,4},{3,3,3,3,6},{3,4,6,4}},nGons],indent *row,indent Boole[OddQ[row]]]+col horizHop,
If[MemberQ[{{3,3,4,3,4},{3,3,3,3,6},{3,4,6,4}},nGons],downIndent *col,downIndent Boole[OddQ[col]]]-row vertHop}]],
{col,0,5},{row,0,4}]},ImageSize-> 250]]

p[nGon_]:=Row[{Graphics[{EdgeForm[{Blue}],h[{nGon,{},{}}]},ImageSize->70],r@nGon}];

测试中

三角平铺

p[{3, 3, 3, 3, 3, 3}]

三角形的


六角形

p[{6, 6, 6}]

六角形


广场

p[{4, 4, 4, 4}]

广场


未知

p[{3, 3, 4, 3, 4}]

阿基米德1


截短的正方形

p[{4, 8, 8}]

截短的正方形


三六角形

p[{3, 6, 3, 6}]

三六角形


六角形

p[{3, 12, 12}]

六角形


未命名

p[{3, 3, 3, 3, 6}]

倾斜的


细长的三角形

p[{3, 3, 3, 4, 4}]

细长的三角形


瓷砖要弄清楚

剩下


我几乎和您处于同一阶段。我可以创建图块,但计算图块将需要一些时间。在他的评论中张贴的wiki steveverill使得看起来需要支持各种方案。需要做一些研究:)
MickyT 2014年

米奇(Micky),图块的垂直和水平位移将取决于行号,列号。使用针对当前情况的唯一偏移量。我正在逐一研究它们,以后再进行概括。
DavidC

@DavidCarraher伟大的开始。我对可能会影响您的评分标准进行了更改。
jsh 2014年

目前很好!如果将水平平移减小3.3.3.3.3.3一半,以使单位重叠,则可以去除这些菱形并修复该平铺。你还有更多的工作要做的3.3.3.3.63.4.6.44.6.12虽然。
级圣河

重新4.6.12 anyone know what it should look like?-所有必需的拼贴图都位于en.wikipedia.org/wiki/…。看到我对这个问题的评论。这是一个不同的页面所提到的一个的问题。但是4.6.12无论如何也显示在该页面上。
级圣河

6

[R

第1步

这是我努力制作的瓷砖。平铺下一个。这不会验证输入,因此无效对象会绘制一些奇怪的图块。在第一行之后输入

i=as.numeric(unlist(strsplit(readline(),"[.]")))
e=c()
for(n in 1:length(i)){
    o=sum(c(0,180-360/i[1:n-1]))
    for(z in 1:i[n]){
        e=c(e,(360/i[n])*(z-1)+o)
    }
}
f=pi/180
plot(c(0,cumsum(sin(e*f))),c(0,cumsum(cos(e*f))),type="l")

在此处输入图片说明

步骤#1,#2和#3:1898

终于回到它了。这大部分是通过设置偏移量和处理特殊情况来解决的:)。编辑:双打的V标志现在已处理

一般过程是:

  • 接受输入并列出清单
  • 创建一个角度列表以绘制初始图块
  • 计算每个多边形的中心,将其平铺,并从中计算出矢量以将边缘一分为二
  • 确定要绘制的图块集并列出角度偏移量。一些瓷砖上添加了其他多边形,以辅助填充孔。
  • 画瓷砖
  • 绘制双打

我可能还能再打些高尔夫球。

##Get input (Enter by itself then type in the tile scheme)
i=strsplit(readline(),"[.]")[[1]]
## Run once i is set
q=0
if(substr(i[1],1,1)=="V"){q=1;i[1]=substr(i[1],2,9)}
i=as.numeric(i)
f=pi/180
e=x=y=q=p=c()
l=length(i)
d=1/(2*tan(pi/3))
g=1/(2*sin(pi/3))
for(n in 1:l){o=sum(c(0,180-360/i[1:n-1]))
r=1/(2*sin(pi/i[n]))
a=o+(180-360/i[n])/2
b=1/(2*tan(pi/i[n]))+d
for(z in 1:i[n]){x=c(x,r*sin(a*f))
y=c(y,r*cos(a*f))
q=c(q,b)
p=c(p,(360/i[n])*(z-1)+o-90)
e=c(e,(360/i[n])*(z-1)+o)}}
if(sum(i)==18&l==6){h=c(60,0);w=c(60,120)}
if(sum(i)==18&l==5){h=c(0,0,60);w=c(60,120,60)
e=c(e,0,-60,60,180,60,180)
x=c(x,g*sin(-30*f),g*sin(-30*f),g*sin(90*f))
y=c(y,1+g*cos(-30*f),1+g*cos(-30*f),1)
q=c(q,d+d,d+d,d+d)
p=c(p,-30,90,-30)}
if(sum(i)==17&l==5&sum(abs(diff(c(i,i[1]),1)))==2){h=c(0,0);w=c(90,60)}
if(sum(i)==17&l==5&sum(abs(diff(c(i,i[1]),1)))==4){h=c(0,30);w=c(270,300)}
if(sum(i)==17&l==4){h=c(0,30,-30);w=c(60,30,90)
e=c(e,150,120,210,300)
x=c(x,sin(150*f)+g*sin(90*f),sin(150*f)+sin(210*f)/2)
y=c(y,cos(150*f)+(1/(2*cos(pi/3)))*cos(90*f),cos(150*f)+cos(210*f)/2)
q=c(q,1,1)
p=c(p,210,120)}
if(sum(i)==18&l==4){h=c(0,0);w=c(120,120)}
if(sum(i)==16&l==4){h=c(0,0);w=c(90,90)}
if(sum(i)==27&l==3){h=c(0,-30,0,30);w=c(60,90,120,150,180)}
if(sum(i)==22&l==3){h=c(0,-30,30,90,60,30)
w=c(90,150,120,90,60,30)
e=c(e,0,-30,-60,30,120,210,30,90,150)
q=q-d+1/(2*tan(pi/4));q[13]=q[17]=q[21]=q[21]+3}
if(sum(i)==20&l==3){h=c(0,-45,-90);w=c(90,0,45)}
if(sum(i)==18&l==3){h=c(0,60,0,-60);w=c(0,60,120,60)}
hx=sum(sin(h*f))
hy=sum(cos(h*f))
wx=sum(sin(w*f))
wy=sum(cos(w*f))
plot(0,0,type="n")
par(pin=c(5,5),usr=c(0,20,0,20))
for(c in -20:20){for(j in -20:20){lines(c((c*hx)+(j*wx)+0,(c*hx)+(j*wx)+cumsum(sin(e*f))),c((c*hy)+(j*wy)+0,(c*hy)+(j*wy)+cumsum(cos(e*f))),type="l")
if(q){for(n in 1:length(x)){lines(c((c*hx)+(j*wx)+x[n],(c*hx)+(j*wx)+x[n]+q[n]*sin(p[n]*f)),c((c*hy)+(j*wy)+y[n],(c*hy)+(j*wy)+y[n]+q[n]*cos(p[n]*f)),col="RED")}}}}

在此处输入图片说明 在此处输入图片说明 在此处输入图片说明


哇,只比我落后4小时。而且它们看起来也不错,+ 1!你有所有的案件工作了吗?
Level River St

@steveverrill谢谢,它适用于问题中的所有情况。
MickyT 2014年

4

英国广播公司

http://www.bbcbasic.co.uk/bbcwin/bbcwin.html下载仿真器

1级

在此处输入图片说明

1.5级

1.5级是我自己指定的,但这是我的方法中的重要里程碑。

平移顶点图形并不总是会导致正确的平铺。在某些情况下,行会丢失。

我对此的解决方案是绕着最大的多边形,为该多边形的第二个顶点绘制一个顶点图形。这是所有情况下的通用解决方案。请注意,最大的多边形始终具有偶数个边,并且在围绕多边形移动时,顶点图形通常会顺时针/逆时针交替。使用可以最清楚地看到4.6.12这一点,但是4.8.8and 的确如此3.12.12:从任何特定的8边形或12边形看时,交替的顶点都是彼此的镜像。这也是正在发生的事情,稍差明显,与3.3.3.4.43.3.4.3.4:从任何特定方看时,交替顶点互为镜像。

我用来在多边形周围移动2边的算法是,总是执行14次边缘绘制循环的迭代,而不管多边形有多少个边缘。8是16的因数,因此,在绘制八边形时,图形光标在其开始处落后16-14 = 2个顶点。3- 4- 6-和12-角的边均为12的因数,因此图形光标在其开始处提前14-12 = 2个顶点。

这些数字可以在下面看到。明天我希望找出正确的译文以完成平铺。在所有情况下,仅通过翻译就可以画出足够的线条以完成第2级。在某些情况下,绘制的数量远远超过所需的最小值,但是重叠没有问题:规则只对绘制线条一无所提:-)

通常,最大的多边形是列表中的最后一个多边形。不幸的是,有一种情况并非如此:3.4.6.4因此,在这种情况下绘制的图形以正方形而不是六边形为中心。尽管有某些未明确绘制的正方形,但有足够的线条仅使用翻译即可完成第2级。这将在第3级中出现一些问题(幸运的是,我认为我知道如何解决这个问题。)类似地,3.3.3.3.6有足够的线条仅使用平移就可以完成第2级,但是会有某些三角形没有明确绘制。

在此处输入图片说明

注释掉了级别1.5的代码,仅激活了级别1的代码。有四行以开头REM。删除这些REM以激活级别1.5。

  t=PI*2                                          :REM constant Tau = PI*2
  DIMm(9)                                         :REM declare array for the numbers in the input
  c=0                                             :REM number of polygons in the list

  INPUTz$
  FORi=1TOLEN(z$)                                 :REM for each character in the input
    d%=VAL(MID$(z$,i))                            :REM use VAL to return the numeric value of the substring to the right and store to integer variable
    IF d% c+=1 :m(c)=d%: i-=d%=12                 :REM if the last character read was a number, d% contains it, otherwise 0. Advance c and store to m. If it is 12, increment i to skip a character.
  NEXT

  FORi=1TOc PRINTm(i),:NEXT                       :REM parsing check for debugging.


  a=601:b=601                                     :REM coordinates to start drawing at
  p=40:q=0                                        :REM vector of first line

  REM FORk=1TOm(c)/2                              :REM draw half as many vertex figures as there are sides on the last polygon in the list

  FORj=1TOc                                       :REM for each polygon on the list
    n=m(j)                                        :REM n=number of sides

    w=-p*COS(t/n)-q*SIN(t/n)                      :REM rotate the starting vector anticlockwise by the internal angle of the current polygon
    q=p*SIN(t/n)-q*COS(t/n)                       :REM to avoid overlapping the previous one, if any.
    p=w

    u=p:v=q                                       :REM make a local copy of the vector and coordinates
    x=a:y=b                                       :REM to avoid corruption of p,q,a,b during the drawing of the polygon
    MOVE x,y                                      :REM move the graphics cursor to the start without drawing
    FORi=1TO14                                    :REM do 14 iterations regardless of the number of sides on the polygon
      x+=u*2                                      :REM increment x and y by the vector representing the side
      y+=v*2                                      :REM the value is double (u,v) to facilitate drawing duals later
      IFVAL(z$) DRAW x,y ELSE LINEx-u,y-v,x-u,y-v :REM if the first character of the input is a number, draw the side of the polygon. The ELSE part is unfinished and will be for drawing duals.
      w=v*COS(t/n)-u*SIN(t/n)                     :REM rotate the vector clockwise
      u=v*SIN(t/n)+u*COS(t/n)                     :REM through the external angle of the polygon
      v=w
    NEXT                                          :REM draw next edge of the current polygon
  NEXT                                            :REM draw next polygon of the current vertex

  REM p=u:q=v                                     :REM once the vertex is finished, we will be two sides around the perimeter of the last polygon.
  REM a=x:b=y                                     :REM copy the position and direction data into p,q,a,b.
  REM NEXT                                        :REM draw next vertex figure

2级和3级

看到我的其他答案。

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.