Tình cờ trên mạng phát hiện ra cái hình này và tôi nghĩ là MSWLogo sẽ vẽ được, nhìn thì có vẻ đơn giản với một hình vuông và một bát giác ở ngoài. Tuy nhiên khi bắt tay vào thự hiện thì hàng loạt vấn đề phát sinh. Các bạn có thể xem chi tiết ở đây. Trước giờ chúng ta thường sử dụng SETXY cho tọa độ cố định, ở ví dụ dưới đây cũng là cách để các bạn có thể hình dung ra việc sử dụng SetXY ở mức độ tương đối, có thể thay đổi tùy vào biến.

01.jpg

Chúng tôi xin giới thiệu cách vẽ của cô Ngọc Thu Thủy (Lưu ý trong bài này biến n là chiều dài từ tâm tới đỉnh của hình vuông). Ở mức độ bình thường, nên sử dụng cách này

To hinhve :n
    Cs Fill Setpc 7 Make "m :n/2
    For [i 0 8 1][
                 pu setxy :n-:i*:m/8 0 pd setxy 0 :n]
    For [i 0 8 1][
                 pu setxy :i*:m/8-:n 0 pd setxy 0 :n] 
    For [i 0 8 1][
                 pu setxy :i*:m/8-:n 0 pd setxy 0 -:n]
    For [i 0 8 1][
                 pu setxy :n-:i*:m/8 0 pd setxy 0 -:n]
    For [i 0 8 1][
                 pu setxy -:n 0 pd setxy 0 :n-:i*:m/8]
    For [i 0 8 1][
                 pu setxy -:n 0 pd setxy 0 -:n+:i*:m/8]
    For [i 0 8 1][
                 pu setxy :n 0 pd setxy 0 :n-:i*:m/8]
    For [i 0 8 1][
                 pu setxy :n 0 pd setxy 0 -:n+:i*:m/8 ]
    Pu setxy -:n/2 0 
    Pd setxy 0 :n/2 setxy :n/2 0 setxy 0 -:n/2 setxy -:n/2 0
    Setxy 0 0
  For [i 0 4 1][
             setxy -:m+:i*:m/8 :i*:m/8 setxy -:n+:m/2 :n-:m/2 setxy -:i*:m/8 :m-:i*:m/8 setxy 0 0]
  For [i 0 4 1][
             setxy :m-:i*:m/8 :i*:m/8 setxy :n-:m/2 :n-:m/2 setxy :i*:m/8 :m-:i*:m/8 setxy 0 0]
  For [i 0 4 1][
              setxy :m-:i*:m/8 -:i*:m/8 setxy :n-:m/2 -:n+:m/2 setxy :i*:m/8 -:m+:i*:m/8 setxy 0 0]
  For [i 0 4 1][
              setxy -:m+:i*:m/8 -:i*:m/8 setxy -:n+:m/2 -:n+:m/2 setxy -:i*:m/8 -:m+:i*:m/8 setxy 0 0]
End

Giải thuật khác

Chúng ta thấy rõ ràng trong hình trên là một dạng toán từ 1 điểm kẻ 9 đường thẳng tới 2 điểm còn lại và chia nó thành 8 đoạn thẳng bằng nhau.

Và đây là cách viết truyền tọa độ 3 vị trí vào để vẽ hình trên, vì không thể truyền trực tiếp tọa độ (là biến mảng) vào chương trình nên xử lý việc này lại trở thành phức tạp code dài khó. Ở đây biến được truyền vào là độ dài cạnh của hình vuông nhỏ bên trong

HinhVe.gif

Đoạn code truyền 3 tọa độ điểm để vẽ 9 đường thẳng.
To aa :a1 :a2 :b1 :b2 :c1 :c2
    PU
    Setpos (List :b1 :b2) Make "B Pos
            Setheading Towards (List :c1 :c2)
    Setpos (List :c1 :c2) Make "C Pos
    Make "k Distance :B
    Setpos (List :a1 :a2) Make "A Pos     
    PD
    Repeat 8 [Setpos :B
            PU FD :k/8 Make "B Pos
            PD SetPos :A]
End ;Ve 9 line dua vao 3 toa do

 

Đoạn code lấy tọa độ đỉnh của hình vuông bên trong và đa giác bên ngoài
To LayToaDo :n
        PU LT 45 Fd :n/2 LT 90 Fd :n/2
        PD LT 180    
        Make "TVx(Array 4 0) ; Toa do x hinh vuong ben trong
        Make "TVy(Array 4 0) ; Toa do y hinh vuong ben trong    
        Make "TGx(Array 8 0) ; Toa do x hinh bat giac ben ngoai    
        Make "TGy(Array 8 0) ; Toa do y hinh bat giac ben ngoai    
        For [i 0 3 1][Setitem :i :TVx Xcor
                       Setitem :i :TVy Ycor
                           FD :n RT 90] ; Lay xong toa do hinh vuong nho
        PU Home LT 90
        Make "Canh Distance(List Item 1 :TVx Item 1 :TVy) Make "Canh :Canh*2 
        ; Tinh do dai tu tam toi dinh cua da giac
        For [i 0 7 1][FD :canh Setitem :i :TGx Xcor
                                         Setitem :i :TGy Ycor
                           BK :canh RT 45] ;Lay xong toa do cac dinh cua bat giac.
End;Lay toa do dua vao mang
Đoạn code chính thiết lập môi trường và vẽ hình
To xHinhVe :n
        SETPENCOLOR [255 0 0]
        SETPENSIZE [2 2]
        CS  Fill PD
        LayToaDo :n
For [i 0 3 1][
        Make "t1 Item :i :TVx
        Make "t2 Item :i :TVy
        Make "j :i
        IfElse :j=3 [Make "j 0][Make "j :i+1]    
        Make "t3 Item :j :TVx
        Make "t4 Item :j :TVy
        aa 0 0 :t1 :t2 :t3 :t4] ;to duong ke trong hinh vuong
        SETPENCOLOR [255 255 0]
For [i 1 7 2][
        Make "t1 Item :i :TGx
        Make "t2 Item :i :TGy
        IF :i=1 [Make "j 1]
        IF :i=3 [Make "j 2]
        IF :i=5 [Make "j 3]
        IF :i=7 [Make "j 4]
        Make "t3 Item :j-1 :TVx
        Make "t4 Item :j-1 :TVy
        IF :j=4 [Make "j 0]
        Make "t5 Item :j :TVx
        Make "t6 Item :j :TVy   
aa :t1 :t2 :t3 :t4 :t5 :t6] ;to duong ke phia dinh bat giac(3, 5, 7) vao canh hinh vuong
        SETPENCOLOR [0 0 255]
For [i 0 6 2][
        Make "t1 Item :i :TGx
        Make "t2 Item :i :TGy
        IF :i=0 [Make "j 2]
        IF :i=2 [Make "j 4]
        IF :i=4 [Make "j 6]
        IF :i=6 [Make "j 0]
        Make "t3 Item :j :TGx
        Make "t4 Item :j :TGy
        IF :i=0 [Make "j 1]
        IF :i=2 [Make "j 2]
        IF :i=4 [Make "j 3]
        IF :i=6 [Make "j 0]
        Make "t5 Item :j :TVx
        Make "t6 Item :j :TVy
aa :t1 :t2 :t3 :t4 :t5 :t6]
For [i 0 6 2][
        Make "t1 Item :i :TGx
        Make "t2 Item :i :TGy
        IF :i=0 [Make "j 6]
        IF :i=2 [Make "j 0]
        IF :i=4 [Make "j 2]
        IF :i=6 [Make "j 4]
        Make "t3 Item :j :TGx
        Make "t4 Item :j :TGy
        IF :i=0 [Make "j 3]
        IF :i=2 [Make "j 0]
        IF :i=4 [Make "j 1]
        IF :i=6 [Make "j 2]
        Make "t5 Item :j :TVx
        Make "t6 Item :j :TVy
aa :t1 :t2 :t3 :t4 :t5 :t6]
END ;Ket Thuc