Ốp lát, cấu hình đỉnh đã cho


11

Bài tập

Nhiệm vụ là để đa giác gạch, đưa ra một cấu hình đỉnh.

Chấm điểm

Điểm của bạn bằng với "mức độ phức tạp" mà bài nộp của bạn đạt được. Mức độ phức tạp được tích lũy, có nghĩa là để đạt # 3, bạn cũng phải hỗ trợ # 1 & # 2.

Đệ trình ở mức độ phức tạp bằng nhau được phân biệt bằng số byte; chiến thắng thấp nhất.

Đầu vào

Đầu vào là một chuỗi chứa cấu hình đỉnh, biểu thị một hình đỉnh. Đó là, một danh sách các số nguyên được phân tách bằng dấu chấm, trong đó mỗi số nguyên (n) đại diện cho một n-gon thông thường, được kết nối bởi một đỉnh chung.

Các cấu hình đỉnh sau đây phải được hỗ trợ:

  • 3.3.3.3.3.3
  • 3.3.3.3.6
  • 3.3.3.4.4 (lưu ý rằng thứ tự được phản ánh trong hình đỉnh, do đó, bên dưới không khác nhau)
  • 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

Đầu ra - Mức độ phức tạp # 1: Hình Vertex

Ở mức độ phức tạp này, đầu ra là một hình ảnh hiển thị hình đỉnh tương ứng với đầu vào đã cho.

Đầu vào được thêm vào một Fdấu hiệu để biểu thị rằng hình đỉnh nên là đầu ra và không phải là ốp lát đầy đủ.

Ví dụ F3.6.3.6cho hình đỉnh này:

3.6.3.6 hình đỉnh

Đầu ra - Mức độ phức tạp # 2: Ốp lát

Ở mức đầu ra mức độ phức tạp này là một hình ảnh hiển thị một lát đồng nhất bằng cách sử dụng hình đỉnh tương ứng với đầu vào đã cho.

Ví dụ 3.6.3.6cho ốp lát này:

Ốp lát 3.6.3.6

Không có hạn chế về màu sắc hoặc định dạng (kẽ hở).

Đầu ra - Mức độ phức tạp # 3: Ốp kép

Ở mức độ phức tạp này, một 'ốp lát kép' có thể được hình thành từ mỗi ốp lát. Điều này đạt được bằng cách vẽ các đường từ trung tâm của mỗi đa giác đến trung tâm của mỗi đa giác giáp.

Lát kép được chỉ định bằng cách thêm vào đầu vào với a V.

Ví dụ, V3.6.3.6cung cấp cho ốp kép này (màu đỏ):

Ốp lát V3.6.3.6


Một số trong những nghiêng này có từ đồng nghĩa. Ví dụ như sau đây đều giống nhau : 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. Chúng ta có phải hỗ trợ tất cả các từ đồng nghĩa, hoặc chỉ từ đồng nghĩa thấp nhất (như được đưa ra trong câu hỏi) không? Ngoài ra, 3.3.3.3.6tồn tại trong hai hình ảnh phản chiếu. Tôi hiểu một trong hai là chấp nhận được.
Cấp sông St

Trang bạn liên kết không khớp với danh sách đã cho. 3.3.3.4.4thiếu ví dụ. vi.wikipedia.org/wiki/ đá khớp chính xác với danh sách của bạn. Tôi hiểu phác thảo hoặc đa giác điền có thể được chấp nhận (hoặc kết hợp cả hai?) Một số đối tượng đã có trong danh sách. Ví dụ 4.4.4.4là kép của riêng nó 3.3.3.3.3.36.6.6là kép. Vì các đối tượng được hiển thị độc lập với cha mẹ của chúng, tôi hiểu rằng không cần phải căn chỉnh chính xác với cha mẹ.
Cấp sông St

bạn phải hỗ trợ đầu vào vì nó xuất hiện trong danh sách - bạn có thể hỗ trợ các từ đồng nghĩa nhưng bạn không phải - bạn phải hỗ trợ tất cả các đối ngẫu, thậm chí là tự đối ngẫu.
JSH

phác thảo / điền - tốt một trong hai cách. bất kỳ kiểu dáng nào cũng được cho phép ngoài các sơ hở (làm cho mọi thứ trở nên trắng, làm cho vùng vẽ nhỏ xíu, v.v.). căn chỉnh không bắt buộc. Tôi có thể nói với bạn rằng bạn không được phép sử dụng một phản xạ 3.3.3.3.6nhưng làm thế nào để bạn biết đó là cái gì? :)
JSH

Bây giờ bạn đã thay đổi cách tính điểm, tie-break là gì? Đó vẫn là mã ngắn nhất? Nếu vậy, các cấu hình đỉnh phải được phân định bằng dấu chấm hoặc chúng ta có thể chọn một biểu tượng khác như dấu phẩy hoặc dấu cách không?
Cấp sông St

Câu trả lời:


9

BBC CƠ BẢN

Rev 1 Mã được đánh gôn, 655 ký tự ASCII, kích thước tệp được mã hóa 614

Một số cải tiến lớn đối với bảng dữ liệu, bằng cách băm chuỗi A.B..Nthành một số (1*A+2*B+..n*N)+ntrước khi tra cứu và chỉ lưu trữ một vectơ dịch (cái còn lại được tạo bởi mã.) Giải thích thêm khi tôi đã chơi golf xong.

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 Mã được đánh gôn, 770 ký tự ASCII, kích thước tệp được mã hóa 728

Tất cả những gì tôi đã làm ở đây là xóa các bình luận, khoảng trắng và dấu ngoặc kép không cần thiết và đặt tất cả các dòng DATAtrên một dòng. Chắc chắn có chỗ để chơi gôn nhiều hơn.

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

Giải trình

Đây là phần tiếp theo của câu trả lời Cấp 1 trước đây của tôi, nhưng tôi đã quyết định đăng riêng vì nó khá dài.

Cấp độ 2

Điều này đạt được bằng cách dịch các mẫu "cấp 1,5" từ câu trả lời trước của tôi. Hai vectơ dịch cho mỗi ốp lát được mã hóa cứng. Tôi lợi dụng thực tế là một tam giác cân của cơ sở 80 và chiều cao 70 là một xấp xỉ rất tốt của một tam giác đều, và một tam giác vuông có vectơ cạnh huyền (56,56)có độ dài cạnh huyền rất gần với 80.

Cấp 3

Để vẽ đồ thị đối ngẫu, thay vì vẽ một cạnh của đa giác, chúng ta vẽ một ô nói từ giữa cạnh đó đến trung tâm của đa giác. Đây là góc vuông với cạnh và có độ dài 1/TAN/(PI/n)thời gian của vectơ (u, v) lần lượt dài bằng một nửa so với cạnh.

Thật không may, vì một số đa giác nhất định trong các nghiêng 3.3.3.3.63.4.6.4không được vẽ rõ ràng, chúng sẽ không được vẽ nếu chúng ta chỉ làm điều này. Do đó, nói cũng mở rộng ra từ đa giác. Phần mở rộng ra bên ngoài được điều khiển bởi biến o.

Theo mặc định, phần mở rộng là đủ để đến trung tâm của một hình tam giác, nhưng đối với 3.4.6.4nó cần phải được mở rộng nhiều hơn để vẽ các hình vuông của các hình vuông không được vẽ rõ ràng. Vì vậy, phần mở rộng đủ để điền vào các ô vuông bị thiếu được áp dụng khi các hình lục giác và hình tam giác được vẽ rõ ràng, nhưng phần mở rộng bình thường được áp dụng khi hình vuông được vẽ rõ ràng, để tránh các đường thẳng trong các hình tam giác liền kề.

Đây là những gì họ trông giống như không có phần mở rộng nói. Các lỗ trong mô hình kép có thể được nhìn thấy rõ ràng. Đầu ra chính xác có thể được nhìn thấy trong hình chính ở dưới cùng của câu trả lời

nhập mô tả hình ảnh ở đây

Mã nhận xét

Sự khác biệt so với câu trả lời trước của tôi được chỉ định nội tuyến

  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

Đầu ra

Chương trình chỉ thực hiện một lát hoặc kép cho mỗi lần chạy. Tuy nhiên, nó vẽ đồ thị màu đỏ. Để tiết kiệm không gian, tôi đã chạy chương trình hai lần mà không xóa màn hình để đặt chồng lên trên lớp ốp thông thường.

nhập mô tả hình ảnh ở đây


8

Toán học

Cấp 1 chứa các mẫu gạch cơ bản được đóng dấu nhiều lần để xếp một mặt phẳng.

Cấp 2 làm ốp lát.

Vẫn còn 2 nghiêng tôi chưa thể đạt được. Chúng xuất hiện để yêu cầu luân chuyển cũng như dịch thuật.

Cấp 1: Hình Vertex (559 byte)

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

Kiểm tra

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

tem


Cấp độ 2: Lát gạch (690 byte bổ sung)

Các quy tắc trả lại giá trị bù đắp và thụt lề cho mỗi cấu hình.

r là chức năng cơ bản tạo ra các nghiêng.

phiển thị các mẫu và ốp lát tương ứng. Các khoảng trắng tương ứng với các khoảng trắng không được bao phủ bởi mẫu.

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

Kiểm tra

Ốp lát hình tam giác

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

hình tam giác


lục giác

p[{6, 6, 6}]

lục giác


Quảng trường

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

Quảng trường


không xác định

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

archimedes1


cắt ngắn vuông

p[{4, 8, 8}]

cắt ngắn vuông


hình tam giác

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

hình tam giác


hình lục giác cắt ngắn

p[{3, 12, 12}]

hình lục giác cắt ngắn


vô danh

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

dốc


hình tam giác thuôn dài

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

hình tam giác thuôn dài


Nghiêng để tìm ra

trái


Tôi khá nhiều ở cùng giai đoạn với bạn. Tôi có thể tạo các ô, nhưng làm việc ốp lát sẽ mất một chút. Các steveverill wiki được đăng trong các bình luận của anh ấy làm cho nó trông giống như các chương trình khác nhau cần được hỗ trợ. Cần học một chút :)
MickyT

Micky, Sự dịch chuyển dọc và ngang của gạch sẽ phụ thuộc vào hàng số., Số không. sử dụng offset duy nhất cho trường hợp trong tầm tay. Tôi đang làm việc từng cái một và sau đó sẽ khái quát hóa.
DavidC

@DavidCarraher khởi đầu tuyệt vời. Tôi đã thay đổi các tiêu chí chấm điểm có thể ảnh hưởng đến bạn.
JSH

Tốt cho đến nay! Nếu bạn giảm 3.3.3.3.3.3một nửa bản dịch ngang của mình , để các đơn vị trùng nhau, bạn có thể thoát khỏi những viên kim cương đó và sửa chữa ốp lát đó. Bạn vẫn còn nhiều việc phải làm 3.3.3.3.6, 3.4.6.44.6.12mặc dù.
Cấp sông St

Re 4.6.12 anyone know what it should look like?- Tất cả các nghiêng cần thiết là tại en.wikipedia.org/wiki/ . Xem bình luận của tôi về câu hỏi. Đây là một trang khác với trang được đề cập trong câu hỏi. Nhưng 4.6.12dù sao cũng được hiển thị trên trang đó.
Cấp độ sông St

6

R

Bước 1

Đây là nỗ lực của tôi trong việc xây dựng gạch. Ốp lát để đến tiếp. Điều này không xác thực đầu vào, vì vậy thương binh sẽ rút ra một số gạch lạ. Đầu vào được nhập vào sau dòng đầu tiên

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

nhập mô tả hình ảnh ở đây

Bước # 1, # 2 & # 3: 1898

Cuối cùng đã trở lại với nó. Hầu hết điều này được thực hiện với việc thiết lập bù đắp và xử lý các trường hợp đặc biệt :). Chỉnh sửa: Cờ V cho duals hiện được xử lý

Quy trình chung là:

  • Lấy đầu vào và lập danh sách
  • Tạo một danh sách các góc để vẽ ô ban đầu
  • Tính toán các tâm của mỗi đa giác nó gạch và các vectơ từ chúng để chia đôi các cạnh
  • Xác định bộ gạch đang được vẽ và lập danh sách các góc lệch. Một số gạch có thêm đa giác được thêm vào chúng để hỗ trợ lấp lỗ.
  • Vẽ gạch
  • Vẽ đối ngẫu

Tôi có lẽ vẫn có thể chơi golf này nhiều hơn một chút.

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

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây


Wow, chỉ sau tôi 4 giờ. Và chúng trông cũng rất đẹp, +1! Bạn đã có tất cả các trường hợp làm việc chưa?
Cấp sông St

@steveverrill Cảm ơn và nó hoạt động cho tất cả các trường hợp trong câu hỏi.
MickyT

4

BBC CƠ BẢN

Tải xuống trình giả lập tại http://www.bbcbasic.co.uk/bbcwin/bbcwin.html

Cấp độ 1

nhập mô tả hình ảnh ở đây

Cấp 1,5

Cấp 1.5 là chỉ định của riêng tôi, nhưng nó là một cột mốc quan trọng trong phương pháp của tôi.

Dịch các số liệu đỉnh không phải lúc nào cũng dẫn đến ốp lát chính xác. Trong một số trường hợp dòng bị thiếu.

Giải pháp của tôi cho vấn đề này là đi xung quanh đa giác lớn nhất, vẽ hình đỉnh cho mỗi đỉnh thứ hai của đa giác đó. Đây là một giải pháp chung cho tất cả các trường hợp. Lưu ý rằng đa giác lớn nhất luôn có số cạnh chẵn và hình đỉnh thường xen kẽ theo chiều kim đồng hồ / ngược chiều kim đồng hồ khi bạn đi xung quanh đa giác. Điều này có thể được nhìn thấy rõ nhất với 4.6.12, nhưng nó cũng đúng 4.8.83.12.12: khi nhìn từ bất kỳ 8-gon hoặc 12-gon cụ thể nào, các đỉnh xen kẽ là hình ảnh phản chiếu của nhau. Đây cũng là những gì đang xảy ra, có phần ít rõ ràng hơn, với 3.3.3.4.43.3.4.3.4: khi nhìn từ bất kỳ hình vuông cụ thể nào, các đỉnh xen kẽ là hình ảnh phản chiếu của nhau.

Thuật toán tôi sử dụng để di chuyển 2 cạnh xung quanh đa giác là luôn thực hiện 14 lần lặp của vòng lặp vẽ cạnh, bất kể đa giác có bao nhiêu cạnh. 8 là hệ số 16, do đó, khi vẽ các hình bát giác, con trỏ đồ họa kết thúc 16-14 = 2 đỉnh phía sau nơi nó bắt đầu. 3- 4- 6- và 12- gons đều có các cạnh là các yếu tố của 12, vì vậy con trỏ đồ họa kết thúc 14-12 = 2 đỉnh trước nơi nó bắt đầu.

Các số liệu có thể được nhìn thấy dưới đây. Ngày mai tôi hy vọng sẽ tìm ra các bản dịch chính xác để hoàn thành việc ốp lát. Trong mọi trường hợp, các dòng đủ được vẽ để hoàn thành cấp 2 chỉ với bản dịch. Trong một số trường hợp, rất nhiều so với yêu cầu tối thiểu được rút ra, nhưng không có vấn đề gì với sự chồng chéo: các quy tắc không nói gì về việc vẽ các đường chỉ một lần :-)

Nói chung, đa giác lớn nhất là đa giác cuối cùng trong danh sách. Thật không may, có một trường hợp không đúng như vậy: 3.4.6.4Do đó, hình vẽ trong trường hợp này được tập trung vào một hình vuông thay vì hình lục giác. Có đủ dòng để hoàn thành cấp 2 chỉ bằng các bản dịch, mặc dù sẽ có một số hình vuông nhất định không được vẽ rõ ràng. Điều này sẽ đưa ra một số vấn đề ở cấp độ 3 (may mắn thay tôi nghĩ rằng tôi biết cách giải quyết vấn đề này.) Tương tự như vậy, 3.3.3.3.6có đủ dòng để hoàn thành cấp độ 2 chỉ sử dụng bản dịch, nhưng sẽ có một số hình tam giác nhất định không được vẽ rõ ràng.

nhập mô tả hình ảnh ở đây

Mã cho cấp 1.5 được nhận xét, chỉ mã cho cấp 1 được kích hoạt. Có bốn dòng bắt đầu bằng a REM. Loại bỏ những REMs này để kích hoạt cấp 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

Cấp 2 và 3

Xem câu trả lời khác của tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.