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

