Ubin, diberikan konfigurasi simpul


11

Tugas

Tugasnya adalah untuk memasang poligon, diberikan konfigurasi titik.

Mencetak gol

Skor Anda sama dengan "tingkat kerumitan" yang dikirim oleh kiriman Anda. Level kompleksitas bersifat kumulatif, artinya untuk mencapai # 3 Anda juga harus mendukung # 1 & # 2.

Pengajuan pada tingkat kompleksitas yang sama dibedakan dengan jumlah byte; kemenangan terendah.

Memasukkan

Input adalah string yang berisi konfigurasi titik, mewakili angka titik. Yaitu, daftar bilangan bulat yang dipisahkan titik, di mana setiap bilangan bulat (n) mewakili n-gon biasa, dihubungkan oleh simpul umum.

Konfigurasi simpul berikut harus didukung:

  • 3.3.3.3.3.3
  • 3.3.3.3.6
  • 3.3.3.4.4 (perhatikan bahwa urutan tercermin pada gambar titik, oleh karena itu di bawah ini memang berbeda)
  • 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

Output - Tingkat Kompleksitas # 1: Gambar Vertex

Pada tingkat kerumitan ini, output adalah gambar yang menunjukkan sosok titik yang sesuai dengan input yang diberikan.

Input diawali dengan a Funtuk menandakan bahwa sosok vertex harus berupa output, dan bukan ubin penuh.

Misalnya F3.6.3.6memberikan angka titik ini:

3.6.3.6 gambar titik

Output - Tingkat Kompleksitas # 2: Ubin

Pada tingkat kerumitan ini, output adalah gambar yang menunjukkan ubin yang seragam menggunakan gambar vertex yang sesuai dengan input yang diberikan.

Misalnya 3.6.3.6memberikan ubin ini:

3.6.3.6 ubin

Tidak ada batasan pada warna atau format (pembatasan lubang).

Output - Tingkat Kompleksitas # 3: Ubin Ganda

Pada tingkat kerumitan ini 'ubin ganda' dapat dibentuk dari setiap ubin. Ini dicapai dengan menggambar garis dari pusat setiap poligon ke pusat setiap poligon yang berbatasan.

Ubin ganda ditentukan dengan memasukkan input sebelumnya dengan a V.

Misalnya V3.6.3.6memberikan ubin ganda ini (merah):

V3.6.3.6 ubin


Beberapa ubin ini memiliki sinonim. Sebagai contoh berikut ini semua sama: 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. Apakah kita harus mendukung semua sinonim, atau hanya yang terendah secara leksikal (seperti yang diberikan dalam pertanyaan)? Juga, 3.3.3.3.6ada dalam dua bentuk gambar cermin. Saya mengerti keduanya bisa diterima.
Level River St

Halaman yang Anda tautkan tidak cocok dengan daftar yang diberikan. 3.3.3.4.4hilang misalnya. en.wikipedia.org/wiki/… cocok dengan daftar Anda. Saya mengerti garis besar atau poligon yang terisi dapat diterima (atau kombinasi keduanya?) Beberapa dual sudah ada dalam daftar. Sebagai contoh 4.4.4.4adalah dual sendiri 3.3.3.3.3.3dan 6.6.6saling ganda. Karena dual ditampilkan secara terpisah dari orang tua mereka, saya mengerti tidak perlu untuk menyelaraskan dengan orang tua.
Level River St

Anda harus mendukung input seperti yang muncul dalam daftar - Anda dapat mendukung sinonim tetapi Anda tidak harus - Anda harus mendukung semua dual, bahkan self-dual.
jsh

garis besar / diisi - baik cara baik. gaya apa pun diizinkan selain celah (buat semuanya putih, buat area gambar kecil, dll.). perataan tidak diperlukan. Saya bisa memberi tahu Anda bahwa Anda tidak diperbolehkan menggunakan satu refleksi 3.3.3.3.6tetapi bagaimana Anda tahu yang mana itu? :)
jsh

Sekarang Anda telah mengubah skor, apa tie-break? Apakah itu masih kode terpendek? Jika demikian, apakah konfigurasi titik harus dibatasi oleh titik atau dapatkah kita memilih simbol lain seperti koma atau spasi?
Level River St

Jawaban:


9

BBC BASIC

Kode Golf 1 Rev, 655 karakter ASCII, file tosize 614

Beberapa perbaikan besar pada tabel data, dengan hashing string A.B..Nke angka (1*A+2*B+..n*N)+nsebelum melihat ke atas, dan dengan hanya menyimpan satu vektor terjemahan (yang lain dihasilkan oleh kode.) Penjelasan lebih lanjut ketika saya selesai bermain golf.

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 kode Golf, 770 karakter ASCII, filesize terpatok 728

Yang saya lakukan di sini adalah menghapus komentar, spasi yang tidak perlu dan tanda kutip, dan menempatkan semua DATApada satu baris. Pasti ada ruang untuk bermain golf lebih banyak.

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

Penjelasan

Ini adalah kelanjutan dari jawaban Level 1 saya sebelumnya, tetapi saya memutuskan untuk mempostingnya secara terpisah karena agak panjang.

Level 2

Ini dicapai dengan menerjemahkan templat "level 1.5" saya dari jawaban saya sebelumnya. Dua vektor terjemahan untuk setiap ubin hardcoded. Saya mengambil keuntungan dari fakta bahwa segitiga sama kaki dari basis 80 dan tinggi 70 adalah pendekatan yang sangat baik dari segitiga sama sisi, dan segitiga kanan dengan vektor sisi miring (56,56)memiliki panjang sisi miring sangat dekat dengan 80.

Tingkat 3

Untuk memplot dual, alih-alih memplot sisi poligon, kami plot wicara dari tengah edge ke tengah poligon. Ini berada di sudut kanan ke tepi dan memiliki panjang 1/TAN/(PI/n)kali vektor (u, v) yang pada gilirannya adalah setengah sepanjang tepi.

Sayangnya, karena poligon tertentu miring 3.3.3.3.6dan 3.4.6.4tidak diplot secara eksplisit, mereka tidak akan diplot jika kita hanya melakukan ini. Oleh karena itu bicara juga memanjang keluar dari poligon. Ekstensi luar dikendalikan oleh variabel o.

Secara default ekstensi sudah cukup untuk mencapai pusat segitiga, tetapi untuk 3.4.6.4itu perlu diperluas lebih untuk menggambar dual dari kotak yang tidak diplot secara eksplisit. Jadi ekstensi yang cukup untuk mengisi kotak yang hilang diterapkan ketika segi enam dan segitiga diplotkan secara eksplisit, tetapi ekstensi normal diterapkan ketika kotak diplotkan secara eksplisit, untuk menghindari garis palsu di segitiga yang berdekatan.

Inilah yang terlihat seperti tanpa ekstensi berbicara. Lubang-lubang pada pola ganda dapat dilihat dengan jelas. Output yang benar dapat dilihat pada gambar utama di bagian bawah jawaban

masukkan deskripsi gambar di sini

Kode yang dikomentari

Perbedaan dari jawaban saya sebelumnya ditunjukkan sebaris

  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

Keluaran

Program hanya menjalankan satu ubin atau dua kali untuk setiap proses. Namun itu memplot dual dalam warna merah. Untuk menghemat ruang, saya menjalankan program dua kali tanpa membersihkan layar untuk menempatkan dual di atas ubin biasa.

masukkan deskripsi gambar di sini


8

Mathematica

Level 1 berisi template ubin dasar yang berulang kali dicap untuk ubin pesawat.

Level 2 mengerjakan ubin.

Masih ada 2 tilings yang belum bisa saya capai. Mereka tampaknya memerlukan rotasi serta terjemahan.

Level 1: Gambar Vertex (559 bytes)

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

Pengujian

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

perangko


Level 2: Ubin (690 byte tambahan)

Aturan mengembalikan offset ubin dan indentasi untuk setiap konfigurasi.

r adalah fungsi dasar yang menghasilkan tilings.

pmenunjukkan templat dan ubin masing-masing. Spasi putih sesuai dengan yang tidak tercakup oleh templat.

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

Pengujian

Ubin segitiga

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

berbentuk segitiga


heksagonal

p[{6, 6, 6}]

heksagonal


kotak

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

kotak


tidak diketahui

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

archimedes1


kotak terpotong

p[{4, 8, 8}]

kotak terpotong


triheksagonal

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

triheksagonal


terpotong heksagonal

p[{3, 12, 12}]

terpotong heksagonal


tidak disebutkan namanya

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

miring


segitiga memanjang

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

segitiga memanjang


Tilings untuk mencari tahu

kiri


Saya cukup banyak pada tahap yang sama dengan Anda. Saya bisa membuat ubin, tetapi mengerjakan ubinnya akan memakan waktu sedikit. Wiki steveverill yang diposting di komentarnya membuatnya tampak seperti berbagai skema yang dibuat perlu didukung. Perlu melakukan sedikit studi :)
MickyT

Micky, Perpindahan vertikal dan horizontal ubin akan tergantung pada baris no., The col no. menggunakan offset unik untuk kasing ini. Saya mengerjakannya satu per satu dan nantinya akan digeneralisasi.
DavidC

@ Davidvid awal yang bagus. Saya telah melakukan perubahan pada kriteria penilaian yang dapat memengaruhi Anda.
jsh

Bagus sejauh ini! Jika Anda mengurangi terjemahan horizontal menjadi 3.3.3.3.3.3setengahnya, sehingga unit-unit saling tumpang tindih, Anda dapat menyingkirkan berlian-berlian itu dan memperbaikinya. Anda masih memiliki banyak hal untuk dilakukan 3.3.3.3.6, 3.4.6.4dan 4.6.12meskipun.
Level River St

Re 4.6.12 anyone know what it should look like?- Semua informasi yang diperlukan ada di en.wikipedia.org/wiki/… . Lihat komentar saya pada pertanyaan. Ini adalah halaman berbeda dari yang disebutkan dalam pertanyaan. Tetapi 4.6.12juga ditampilkan di halaman itu.
Level River St

6

R

Langkah 1

Inilah usaha saya membangun ubin. Ubin untuk datang berikutnya. Ini tidak memvalidasi input, sehingga cacat akan menarik beberapa ubin aneh. Input diketik setelah baris pertama

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")

masukkan deskripsi gambar di sini

Langkah # 1, # 2 & # 3: 1898

Akhirnya kembali ke sana. Sebagian besar ini diambil dengan pengaturan offset dan menangani kasus khusus :). Sunting: V flag untuk dual sekarang ditangani

Proses umum adalah:

  • Ambil input dan buat daftar
  • Buat daftar sudut untuk menggambar ubin awal
  • Hitung pusat dari setiap poligon itu ubin dan vektor dari mereka untuk membagi dua tepi
  • Tentukan set ubin yang digambar dan buat daftar offset sudut. Beberapa ubin ditambahkan poligon tambahan untuk membantu mengisi lubang.
  • Gambarkan ubin
  • Gambar dual

Saya mungkin masih bisa bermain golf ini sedikit lebih.

##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")}}}}

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini


Wow, hanya 4 jam di belakangku. Dan mereka juga terlihat bagus, +1! Sudahkah semua case bekerja?
Level River St

@steveverrill Terima kasih dan berfungsi untuk semua kasus dalam pertanyaan.
MickyT

4

BBC BASIC

Unduh emulator di http://www.bbcbasic.co.uk/bbcwin/bbcwin.html

Tingkat 1

masukkan deskripsi gambar di sini

Level 1.5

Level 1.5 adalah tujuan saya sendiri, tetapi ini merupakan tonggak penting dalam metode saya.

Menerjemahkan angka-angka titik tidak selalu mengarah ke ubin yang benar. Dalam beberapa kasus, garis hilang.

Solusi saya untuk ini adalah berkeliling poligon terbesar, menggambar angka titik untuk setiap titik kedua dari poligon itu. Ini adalah solusi umum untuk semua kasus. Perhatikan bahwa poligon terbesar selalu memiliki jumlah sisi genap dan angka titik sering bergantian searah jarum jam / berlawanan arah jarum jam saat Anda mengitari poligon. Hal ini dapat dilihat paling jelas dengan 4.6.12, tetapi juga benar 4.8.8dan 3.12.12: bila dilihat dari setiap tertentu 8-gon atau 12-gon, simpul bolak adalah bayangan cermin satu sama lain. Ini juga yang terjadi, agak kurang jelas, dengan 3.3.3.4.4dan 3.3.4.3.4: ketika dilihat dari kotak tertentu, simpul bolak-balik adalah gambar cermin satu sama lain.

Algoritma yang saya gunakan untuk memindahkan 2 sisi di sekitar poligon adalah dengan selalu melakukan 14 iterasi dari loop gambar-tepi, terlepas dari berapa banyak sisi yang dimiliki poligon. 8 adalah faktor 16, oleh karena itu ketika menggambar octagons kursor grafik berakhir 16-14 = 2 simpul di belakangnya. 3- 4- 6- dan 12- gon semua memiliki sisi yang merupakan faktor 12, sehingga kursor grafik berakhir 14-12 = 2 simpul di depan dari mana ia dimulai.

Angka-angka tersebut dapat dilihat di bawah ini. Besok saya berharap dapat mengerjakan terjemahan yang benar untuk menyelesaikan ubin. Dalam semua kasus, garis yang cukup ditarik untuk menyelesaikan level 2 hanya dengan terjemahan. Dalam beberapa kasus, lebih dari batas minimum yang diperlukan, tetapi tidak ada masalah dengan tumpang tindih: aturan tidak mengatakan apa-apa tentang menggambar garis hanya sekali :-)

Secara umum, poligon terbesar adalah yang terakhir dalam daftar. Sayangnya, ada satu kasus di mana ini tidak begitu: 3.4.6.4Oleh karena itu angka yang diambil dalam kasus ini berpusat pada kotak daripada segi enam. Ada cukup baris untuk menyelesaikan level 2 hanya menggunakan terjemahan, meskipun akan ada kotak tertentu yang tidak ditarik secara eksplisit. Ini akan menghadirkan beberapa masalah di level 3 (untungnya saya pikir saya tahu bagaimana menyelesaikan ini.) Demikian pula dengan 3.3.3.3.6ada cukup baris untuk menyelesaikan level 2 hanya menggunakan terjemahan, tetapi akan ada segitiga tertentu yang tidak ditarik secara eksplisit.

masukkan deskripsi gambar di sini

Kode

Kode untuk level 1.5 dikomentari, hanya kode untuk level 1 yang diaktifkan. Ada empat baris yang diawali dengan a REM. Hapus ini REMuntuk mengaktifkan level 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

Tingkat 2 dan 3

Lihat jawaban saya yang lain.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.