Επιτέλους είδα φως, γιορτινές μέρες που είναι 🙂 ,και αντιλήφθηκα την ουσία του προβλήματος. Παραθέτω τον κώδικα ολοκληρωμένο χωρίς περιττές επαναλήψεις εξαγώνων από τη χελώνα.
Παραθέτω επίσης ένα στιγμιότυπο από το kturtle , επίστρωσης βάθους 30 ,που χρειάστηκε 4-5 λεπτά.
Προκειμένου να κατανοήσετε τη λογική του αλγορίθμου χρειάζεται πρώτα καλή γνώση της αναδρομικής λογικής. Και για να κατανοήσετε γιατί χρησιμοποιούμε την αναδρομή με τον τρόπο που τη χρησιμοποιούμε πρέπει να καταλάβετε και μερικά γεωμετρικά γεγονότα που αφορούν την επίστρωση. Η κατανόηση και η ανάλυση επί χάρτου ενός αναδρομικού αλγόριθμου είναι ένα θέμα που θα αναλύσω σε μελλοντική ανάρτηση.
Η γενική λογική είναι ότι λέμε στη χελώνα να σχεδιάσει ένα εξάγωνο αλλά μόλις φτάνει σε μια γωνία ,έχοντας σχεδιάσει μια πλευρά, εκεί να καλεί πάλι την ίδια συνάρτηση για να σχεδιααστεί ένα άλλο πολύγωνο. Σε κάθε κλήση της διαδικασίας μειώνετει το $d ώστε να φτάσουμε στη συνθήκη τερματισμού της αναδρομής που είναι $d == 0.
Αν παρατηρήστε των κώδικα θα δείτε ότι μόνο στην πρώτη κληση θα σχεδιαστεί από ένα εξάγωνο σε κάθε πλευρά. Στη κλήση του αμέσως επόμενου βάθους θα σχεδιαστούν από δυο εξάγωνα για κάθε ένα του προηγούμενου βάθους και απο εκεί και έπειτα δημιουργείται μια κανονικότητα . Ο λόγος που καλείται δύο μόνο φορές η hextile σε μεγαλύτερα βάθη είναι για να αποφευχθεί η επανάληψη που θα έκανε πολύ αργό τον αλγόριθμο. Για κάθε νεα στρώση στο επόμενο βάθος αρκεί όλα τα εξάγωνα του προηγούμενου βάθους να συνεισφέρουν από ένα εκτός από τα έξι γωνιακά που πρέπει να συνεισφέρουν από δυο. Στη λογική αυτή εντάσεται και η χρήση της μεταβλητής $f (flag) που μεταφέρει την πληροφορία κατα πόσο το εξάγωνο που δημιουργείται είναι γωνιακό ή όχι. Γι’αυτό εξάλλου η ακολουθία τους πλήθους των εξαγώνων σε κάθε βάθος(στρώση) είναι 1 -> 6 -> 12 -> 18 -> 24 -> …. -> ν -> ν+6 . Δηλαδή στην αρχή έχουμε μια ειδική περίπτωση καθώς κάθε εξάγωνο πρέπει να έχει δυο προς τα έξω γειτονικά για να πάμε από 6 σε 12 αλλά απο εκεί και έπειτα αρκεί να έχουν δυο γειτονικά μόνο τα έξι γωνιακά σε κάθε στρώση και από ένα γειτονικό όλα τα υπόλοιπα.
Γιατί καλούμε τη hextile μετά τον σχεδιασμό της πλευράς και όχι από την αρχή; Αυτό γίνεται γιατί ειδάλλως η χελώνα δεν θα προχωρήσει !
#hextiling 1.0 - 220411
#GPL
# https://blogs.sch.gr/aprekates
reset
canvassize 1000,1000
center
learn hextile $d , $f {
# Συνθήκη τερματισμού
if $d == 0 {
return
}
$d = $d-1
fw 10
tl 60
if $d == $depth {
hextile $d , 0
}
tr 60
tr 60
fw 10
tl 60
if ( $d == $depth) {
hextile $d , 2
} else {
if ( $d == ($depth-1) ) {
hextile $d, 2
} else {
if ( ($d < ($depth-1)) and ($f==2) ) {
hextile $d ,2
} else {
if ( ($d < ($depth-1)) and ($f==1) ) {
hextile $d ,1
}
}
}
}
tr 60
tr 60
fw 10
tl 60
if ( $d == $depth) {
hextile $d , 2
} else {
if ( $d == ($depth-1) ) {
hextile $d, 1
} else {
if ( ($d < ($depth-1)) and ($f == 2) ) {
hextile $d ,1
}
}
}
tr 60
tr 60
fw 10
tl 60
if $d == $depth {
hextile $d , 0
}
tr 60
tr 60
fw 10
tl 60
if $d == $depth {
hextile $d, 0
}
tr 60
tr 60
fw 10
tl 60
if $d == $depth {
hextile $d, 0
}
tr 60
tr 60
}
$depthg = ask "Give depth"
$depth = $depthg - 1
hextile $depthg , 0