Τετάρτη, 5 Απριλίου 2017

Έκδοση 8.7 και παράδειγμα!

Σε αυτήν την έκδοση, δεν πρόσθεσα κάτι στην λειτουργία, αλλά έκανα βελτιστοποίηση για να είναι πιο γρήγορη η γλώσσα.

Σήμερα λοιπόν έχω ένα παράδειγμα με ανανέωση οθόνης σε 120 πλαίσιο το δευτερόλεπτο!
Δεν κάνει κάτι σπουδαίο ο διερμηνευτής. Ο κύκλος με τα πολύγωνα έχει εμφανιστεί και σε παλαιότερη δημοσίευση (πρόγραμμα επίδειξης πολικών συντεταγμένων με περιστροφή πολυγώνων).
Σε αυτό το παράδειγμα ελέγχουμε την φορά και την ταχύτητα περιστροφής, των πολυγώνων, και επιπλέον ανάλογα την θέση του δείκτη του ποντικιού κατά ύψος αλλάζει και το μέγεθος του γραφικού. Για να γίνει πιο ωραίο έβαλα και μερικούς λόφους να ολισθαίνουν και να αλλάζουν ολίσθηση με την αλλαγή της φοράς των πολυγώνων. Επιπλέον μπορεί κανείς με δεξί κλικ να ζωγραφίσει (πίσω από τους λόφους) με το σχέδιο των πολυγώνων. Και όποτε θέλει σβήνει τη ζωγραφιά με το C. Τα πλήκτρα αναφέρονται στο πρόγραμμα. Το Esc (Διαφυγή) το έχω βγάλει εκτός Παράλληλα με την εντολή που βγάζουμε εκτός το Esc βγαίνει εκτός και το Ctrl και γράμματα, τα οποία δεν κάνουν άλλο πράγμα από το να ανοίγουν τον έλεγχο για βηματική εκτέλεση. Υπάρχει το ctrl+C που τερματίζει το πρόγραμμα, αφού μας ρωτήσει πρώτα, αλλά το τερματίζει ...όπου το πετύχουμε. Κανονικά έχει οριστεί με το διάστημα να τερματίσουμε το πρόγραμμα.

Υπάρχουν τρεις ρουτίνες, η α() που φτιάχνει τα πολύγωνα, η Λόφοι() που την καλούμε τρεις φορές για να φτιάξει τους λόφους ώστε να φαίνονται ατελειώτοι, και μια ακόμα όταν καθαρίζουμε με το C την οθόνη. Η εντολή Κράτησε αποθηκεύει την οθόνη, και η Άφησε την επαναφέρει. Οπότε κάθε φορά επαναφέρουμε την οθόνη με τα μη κινητά μέρη και πάνω σε αυτά υπολογίζουμε - σχεδιάζουμε- και έτσι έχουμε την νέα θέση των αντικειμένων και τελικά βλέπουμε την κίνηση.

Όλος ο βρόχος εκτελείται από μια Κάθε {} η οποία παίρνει τιμή σε χιλιοστά του δευτερολέπτου, οπότε δίνουμε το 1000/120 που σημαίνει ότι το ένα δευτερόλεπτο το τεμαχίζουμε σε 120 μέρη, άρα έτσι έχουμε 120 πλαίσια. Αν για κάποιο λόγο αργήσει η Κάθε τότε πιάνει στο άρτιο την επόμενη φορά (αυτό σημαίνει ότι ξεκινάει πάντα σε 1/120 του δευτερολέπτου ακόμα και αν χάσει και μέρος από το τελευταίο).

Στη φωτογραφία φαίνεται ο μεγάλος κύκλος με το τετράγωνο και το τρίγωνο, ενώ υπάρχουν δυο μικροί οι οποίοι ο ένας περιστρέφεται μαζί με το μεγάλο, και είναι κολλημένος στη θέση στη περιφέρεια του μεγάλου, και ο άλλος αν και κολλημένος στη θέση δεν περιστρέφεται (στη φωτογραφία ο δεξιός μικρός κύκλος με το τετράγωνο και το πεντάγωνο).

Στο κώδικα μέσα στην Κάθε { } θα δούμε την ρουτίνα α( ) και εκεί μια έχει τα 3 και 4 (Τρίγωνο και Τετράγωνο) και οι άλλες δύο έχουν το 4 και 5 (Τετράγωνο και Πεντάγωνο). Μπορούμε να αλλάξουμε νούμερα και θα μας φτιάξει το αντίστοιχο πολύγωνο. Έχω βάλει και αξονικές γραμμές, όπως επίσης στις καμπύλες χρησιμοποιώ..προχωρημένες εντολές γραφικών.

Τα μαθηματικά του προγράμματος είναι γυμνασίου! Αυτό που παραξενεύει είναι η εντολή Καμπύλη η οποία παίρνει σειρά σημείων και φέρνει μια καμπύλη Bezier. Κάθε φορά τυπώνω την καμπύλη ως γεμάτο σχήμα και την δεύτερη μόνο την καμπύλη με πάχος 4 σημεία (pixels). Στην εικόνα φαίνεται η καμπύλη με άσπρη γραμμή πάνω από την πράσινη γεμάτη καμπύλη. Υπάρχουν τρία κομμάτια, γιατί πρέπει να φαίνεται κίνηση, και επειδή οι λόφοι μεγαλώνουν και μικραίνουν με τα άνω και κάτω βελάκια, καθώς αλλάζουμε δηλαδή την ταχύτητα περιστροφής του σχήματος!

Οι ρουτίνες βλέπουν τις μεταβλητές του τμήματος (έστω έχουμε το πρόγραμμα στο τμήμα Α). Τα ορίσματά της είναι τοπικά, και αν θέλουμε φτιάχνουμε τοπικές για να μην αλλάζουμε κατά λάθος μεταβλητές του τμήματος. Ό,τι φτιάχνουμε σε μια ρουτίνα τύπου (Ρουτίνα/ Τέλος Ρουτίνας) θα χαθεί στην επιστροφή από αυτήν. Υπάρχουν και άλλες πιο απλές που φτιάχνονται με ετικέτα (πχ) και την εντολή Επιστροφή και τις καλούμε με την Διαμέσου - Gosub- όπως στην Basic, και σε αυτές δεν υπάρχει η διαγραφή των νέων-τοπικών-, επίσης σε αυτές δεν περνάμε ορίσματα.
Παράδειγμα απλής ρουτίνας:

Α=10
Διαμέσου άλφα
Τύπωσε Β
Τέλος
άλφα: \\ δεν βάζουμε εδώ εντολές
      Τύπωσε Α
      Β=10
Επιστροφή




Το πρόγραμμα το αντιγράφουμε σε ένα τμήμα έστω Α (Σ Α enter και ανοίγει ο διορθωτής και γράφει Τμήμα Α και εκεί απλά κάνουμε επικόλληση από την ιστοσελίδα, μετά πατάμε Esc, γράφουμε Σώσε προγραμμα1 (μετά το σώσιμο με Ctrl+A κάνουμε αυτόματα σώσιμο), και με Α και enter το ξεκινάμε.
Την επόμενη φορά που θα ανοίξουμε τη Μ200, πατάμε το ctrl+F αν έχουμε επιλέξει ελληνικά από τις Ρυθμίσεις (γράψτε Ρυθμίσεις - enter-  και αλλάξτε το) ή το ctrl+L αν έχουμε επιλέξει λατινικά (έτσι το γράφει στις ρυθμίσεις, επειδή είχε νόημα μια εποχή που η κονσόλα της Μ2000 δεν ήταν Unicode) και έτσι θα εμφανιστεί ή η εντολή Φόρτωσε ή η εντολή Load και γράφουμε χωρίς εισαγωγικά το προγραμμα1 ή όποιο άλλο όνομα δώσαμε. Συνήθως όταν ανοίγω την Μ2000 πατάω το ctrl+N και μου δείχνει ότι προγράμματα έχει ο χρήστης, και το ctrl+M πιάνει, όταν έχουμε ήδη φορτώσει κάτι, και τότε το ctrl+N δείχνει μόνο τα φορτωμένα τμήματα/συναρτήσεις. Οι ρυθμίσεις βγαίνουn με Ctrl+U.





Διαφυγή Όχι \\ βγάζει εκτός το Esc και το Ctrl+ διάφορα πλήκτρα που ανοίγουν τον έλεγχο.
θεσε γρηγορα !
Πένα 14
ζβ=πι/17 'πι/21
ζ=ζβ
κχ=δεικτης.χ
κυ=δεικτης.υ
\\ για τους λόφους
όριο=12000
φορά=2
σκάλα=2
μεγεθ=2*δεικτης.υ/υ.σημεία+.1
ανανεωση 2000
τίτλος_και_οδηγίες()
Κράτησε
Μ=0
Πένα 15
καθε 1000/120 { \\ 1000/120 = 120 πλαίσια το δευτερόλεπτο
      Αφησε
      αν Δείκτης τοτε {
            κχ=δεικτης.χ
            κυ=δεικτης.υ
            Αν πατημένο(2) τότε Πένα 7
      } Αλλιώς {
            Πένα 15
            Αν πατημένο(67) τότε τίτλος_και_οδηγίες()
      }
      μεγεθ=2*δεικτης.υ/υ.σημεία+.1
      α(4000*μεγεθ,3,4,κχ,κυ, ζ, 0)
      α(2000*μεγεθ,4,5,θέση.χ,θέση.υ,0, 1)
      θεση κχ, κυ
      βήμα γωνια (πι/2+πι/4)+ζ,4000*μεγεθ
      α(2000*μεγεθ,5,5,θέση.χ,θέση.υ,ζ, 1)
  
      αν πατημένο(32) τοτε εξοδος
      αν όχι πατημένο(13) τότε ζ+=ζβ
      αν πατημένο(0x11) και Μ<0 τότε Μ=10: ζβ-! \\ αλλαγή προσήμου
      αν πατημένο(0x26) τότε ζβ*=1.2
      αν πατημένο(0x28) τότε ζβ/=1.2
      αν πατημένο(0x25) τότε ζβ=Απολ(ζβ)
      αν πατημένο(0x27) τότε ζβ=-Απολ(ζβ)
      Αν Πένα=7 τότε Κράτησε
Αν Πατημένο(0x26) Τότε {
            Αν σκάλα<7 Τότε {
             σκάλα+=.03
            } Αλλιώς σκάλα=7
      } Αλλιώς.Αν Πατημένο(0x28) Τότε {
            Αν σκάλα>1 Τότε {
            σκάλα-=.03
             } Αλλιώς σκάλα=1
            }
      Αν Σημ(ζβ)<0 Τότε {
            Λόφοι(σκάλα, (όριο-12000)*σκάλα,12000-1300*σκάλα/4)
            Λόφοι(σκάλα, όριο*σκάλα, 12000-1300*σκάλα/4)
            Λόφοι(σκάλα, (όριο+12000)*σκάλα, 12000-1300*σκάλα/4)
            όριο-=150+15*σκάλα
            Αν όριο<=0 Τότε όριο=12000
      } Αλλιώς {
            Λόφοι(σκάλα,(όριο-12000)*σκάλα,12000-1300*σκάλα/4)
            Λόφοι(σκάλα, όριο*σκάλα, 12000-1300*σκάλα/4)
            Λόφοι(σκάλα, (όριο+12000)*σκάλα, 12000-1300*σκάλα/4)
            όριο+=150+15*σκάλα
            Αν όριο>=12000 Τότε όριο=0
      }
ανανεωση 2000
      Μ--
}

Ρουτίνα α(α, μ1, μ2, Χ, Ψ, ζ, τρικ)
θεση Χ, Ψ
Τοπικη ι
κυκλος α
παχος 1,3 { ' άξονες
      βημα γωνια ζ, -α*1.05
      χαραξε γωνια ζ , α*2.1
      θεση Χ, Ψ
      βημα γωνια ζ+πι/2,-α*1.05
      χαραξε γωνια ζ+πι/2,α*2.1
}
για ν=μ1 εως μ2 { ' φτιάχνει πολύγωνα
      θεση Χ,Ψ
      γ=ν/2
      κ=200/γ
      βήμα γωνια -(πι/2+πι/ν),α
      β=(Χ-θεση.Χ)*2
      βήμα γωνια -(πι/2+πι/ν),-α
      βήμα γωνια -(πι/2+πι/ν)+ζ,α
      βημα γωνια 0,0
      για ι=0 εως 2*πι-πι/γ ανα πι/γ {
            αν τρικ τοτε {
                  \\ βάζει άξονες επιπλέον!
                  βημα γωνια ι+πι/2+ζ,α
                  χαραξε γωνια ι+πι/2+ζ,-α
                  βημα γωνια ι+πι/2-πι/γ+ζ,α
                  χαραξε γωνια ι+πι/2-πι/γ+ζ,-α
            }
            χαραξε γωνια ι+ζ, β
      }
}
Τέλος Ρουτίνας
Ρουτίνα Λόφοι(σκάλα, Χ, Υ)
Θέση Χ, Υ
Πένα 6 {
      Χρώμα Πάνω 6 {
            Καμπύλη 3000*σκάλα,-500*σκάλα,0,-400*σκάλα,1000*σκάλα,0,1000*σκάλα,0,0,900*σκάλα,2000*σκάλα,0, 1000*σκάλα,-200*σκάλα, 0,-700*σκάλα, 1000*σκάλα, 0,1000*σκάλα, 0,0, 900*σκάλα,2000*σκάλα,0,0,1500*σκάλα,0,3000*σκάλα,0,0,0 ,0,0,0,-12000*σκάλα,0
      }
}
Θέση Χ, Υ
Πάχος 4 {
      Καμπύλη 3000*σκάλα,-500*σκάλα,0,-400*σκάλα,1000*σκάλα,0,1000*σκάλα,0,0,900*σκάλα,2000*σκάλα,0, 1000*σκάλα,-200*σκάλα, 0,-700*σκάλα, 1000*σκάλα,0, 1000*σκάλα, 0,0,900*σκάλα,2000*σκάλα,0
}
Τέλος Ρουτίνας
Ρουτίνα τίτλος_και_οδηγίες()
      Πένα 14 {
            διπλα
            φοντο 1,6
            δρομεας 0,0
            πλαγια
            αναφορα 2,"Παράδειγμα Ανανέωσης 120 πλαίσια το δευτερόλεπτο"
            πλαγια
            κανονικα
            δρομέας 8,4
            Πένα 2 {
                  Αναφορά {Με βελάκια αλλάζουμε φορά και ταχύτητα
                              Με το ctrl βάζουμε αντίθετη φορά
                              Με το enter, όσο είναι πατημένο, το σταματάμε
                              Με αριστερό πλήκτρο του ποντικιού, και κίνηση του ποντικιού το μετακινούμε
                              Με δεξί πλήκτρο του ποντικιού ζωγραφίζουμε το ίχνος του
                              Με C καθαρίζουμε την οθόνη
                              Με Διάστημα τερματίζουμε το πρόγραμμα κανονικά
                              Με ctrl-C (τερματίζουμε μη κανονικά, εκεί που είναι ο κώδικας)
                              }
            }
      }
      Κράτησε
Τέλος Ρουτίνας