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.
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
Đ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