タイリング、頂点構成を指定


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.62つの鏡像形式で存在します。どちらでもよいことを理解しています。
レベルリバーセント

リンクしたページは、指定されたリストと一致しません。3.3.3.4.4たとえば欠落しています。en.wikipedia.org/wiki/…はリストと完全に一致します。アウトラインまたは塗りつぶされたポリゴンが許容されることを理解しています(または、2つの組み合わせですか?)たとえば4.4.4.4、独自のデュアルで3.3.3.3.3.3あり6.6.6、相互にデュアルです。双子は親とは独立して表示されるため、親との正確な位置合わせは必要ないと理解しています。
レベルリバーセント

リストに表示される入力をサポートする必要があります-同義語はサポートできますが、必要はありません-すべてのデュアル、セルフデュアルもサポートする必要があります。
jsh 14年

アウトライン/塗りつぶし-どちらの方法でも問題ありません。抜け穴以外のスタイリングは許可されます(すべてを白にする、描画領域を小さくするなど)。アライメントは不要です。私はあなたが1つのリフレクションを使用することを許可されていないことを伝えることができました3.3.3.3.6が、どのリフレクションをどのように知っていますか?:)
jsh 14年

得点を変更しましたが、タイブレークとは何ですか?それはまだ最も短いコードですか?その場合、頂点構成をドットで区切る必要がありますか、またはコンマやスペースなどの別のシンボルを選択できますか?
レベル川セント

回答:


9

BBC BASIC

Rev 1ゴルフコード、655 ASCII文字、トークン化ファイルサイズ614

検索A.B..Nする(1*A+2*B+..n*N)+n前に文字列を数字にハッシュし、1つの変換ベクトルのみを保存することにより(データによってコードが生成されます)、データテーブルにいくつかの大きな改善があります。

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

Rev 0ゴルフコード、770 ASCII文字、トークン化ファイルサイズ728

ここで行ったことは、コメント、不要な空白、引用符を削除し、すべてDATAを1行に入れることです。ゴルフをする余地は確かにあります。

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」テンプレートの翻訳によって達成されます。各タイルの2つの並進ベクトルはハードコードされています。私は、底辺80と高さ70の二等辺三角形が正三角形の非常に良い近似であり、斜辺ベクトルを(56,56)持つ直角三角形の斜辺の長さが80に非常に近いという事実を利用します。

レベル3

デュアルをプロットするには、ポリゴンのエッジをプロットする代わりに、そのエッジの中央からポリゴンの中心までスポークをプロットします。これはエッジに対して直角1/TAN/(PI/n)であり、ベクトル(u、v)の時間の長さはエッジの半分の長さです。

タイリング内の特定のポリゴン残念ながら、3.3.3.3.6とは3.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

出力

プログラムは、実行ごとに1回のタイリングまたはデュアルのみを実行します。ただし、デュアルを赤でプロットします。スペースを節約するために、通常のタイルの上にデュアルを重ねるために、画面をクリアせずにプログラムを2回実行しました。

ここに画像の説明を入力してください


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}]

archimedes1


切り捨てられた正方形

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

ミッキー、タイルの垂直および水平方向の変位は、行番号、列番号に依存します。手元のケースに固有のオフセットを使用します。私はそれらを一つずつ解決していき、後で一般化します。
DavidC

@DavidCarraher素晴らしいスタート。お客様に影響を与える可能性のあるスコアリング基準を変更しました。
jsh

今のところ良い!水平方向の平行移動を3.3.3.3.3.3半分に減らして、ユニットが重なるようにすると、それらのダイヤモンドを取り除き、そのタイルを修正できます。あなたはまだ上を行うに多くの持っている3.3.3.3.63.4.6.44.6.12いえ。
レベルリバーセント14年

4.6.12 anyone know what it should look like?-必要なタイルはすべてen.wikipedia.org/wiki/…にあります。質問に対する私のコメントをご覧ください。これは、質問で言及さたページとは異なるページです。しかし、4.6.12とにかくそのページにも表示されます。
レベルリバーセント14年

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!すべてのケースがまだ機能していますか?
レベル川セント14年

@steveverrillありがとう。質問のすべてのケースで機能します。
MickyT 14年

4

BBC BASIC

http://www.bbcbasic.co.uk/bbcwin/bbcwin.htmlからエミュレーターをダウンロードします

レベル1

ここに画像の説明を入力してください

レベル1.5

レベル1.5は私自身の指定ですが、私の方法の重要なマイルストーンです。

頂点の図を変換しても、常に正しいタイルが表示されるとは限りません。場合によっては、行が欠落しています。

これに対する私の解決策は、最大のポリゴンを一周し、そのポリゴンの2番目の頂点ごとに頂点図形を描画することです。これは、すべての場合の一般的なソリューションです。最大のポリゴンには常に偶数の辺があり、頂点の図は、ポリゴンの周りを回ると時計回り/反時計回りに交互に変わることが多いことに注意してください。これはで最もはっきりと見ることができ4.6.12ますが4.8.83.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を完了するのに十分な線が引かれます。場合によっては、最低限必要な量よりも多くの量が描画されますが、オーバーラップの問題はありません。ルールは線を1回だけ描​​画することについて何も言っていません:-)

一般的に、最大のポリゴンはリストの最後のポリゴンです。残念ながら、そうではない場合が1つあります。3.4.6.4したがって、この場合に描かれる図形は、六角形ではなく正方形を中心にしています。翻訳のみを使用してレベル2を完了するのに十分な線がありますが、明示的に描画されない特定の正方形があります。これにより、レベル3でいくつかの問題が発生します(残念ながら、これを解決する方法を知っていると思います)。同様に、3.3.3.3.6翻訳のみを使用してレベル2を完了するのに十分な行がありますが、明示的に描画されない特定の三角形があります。

ここに画像の説明を入力してください

コード

レベル1.5のコードはコメント化され、レベル1のコードのみがアクティブになります。で始まる4行があります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

私の他の答えをご覧ください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.