Τρίτη 10 Νοεμβρίου 2015

Αναθεώρηση 83, Βελτίωση στην περιστροφή εικόνας!

Αναθεώρηση 83 (Τεχνικό Θέμα).
Σε αυτή την αναθεώρηση ασχολήθηκα με την περιστροφή εικόνας. Έκανα αρκετές βελτιώσεις. Τρεις διαφορετικές ρουτίνες περιστροφής, μια με μεγέθυνση που χρησιμοποιείται στην ΑΝΤΕΓΡΑΨΕ, μια στην ΔΙΑΦΑΝΟ (ή ΔΙΑΦΑΝΕΙΑ) και μία στο ΠΑΙΚΤΗΣ (το hardware sprite). Ο λόγος που υπάρχουν τρεις διαφορετικές ρουτίνες είναι ο παρακάτω:
Στην Αντέγραψε έχουμε δυο τύπους αντιγραφής με περιστροφή, με ή χωρίς πλαίσιο. Χωρίς πλαίσιο σημαίνει ότι στη θέση του θα μπουν τα εικονοστοιχεία από την οθόνη. Το πλαίσιο είναι το τετράπλευρο που περιέχει την εικόνα μετά τη περιστροφή, και έχει μέγεθος το ύψος και πλάτος της εικόνας (σε γωνία). Αν η εικόνα είναι σε 0 μοίρες (χωρίς περιστροφή) τότε το μέγεθος πλαισίου ταυτίζεται με το μέγεθος εικόνας. Τι γίνεται με τη μεγέθυνση; Στη μεγέθυνση η ρουτίνα περιστροφής πριν την 83η αναθεώρηση, πρώτα μεγάλωνε την εικόνα και μετά έκανε περιστροφή χρησιμοποιώντας μια  1 προς 1 περιστροφή, και ειδικά στην 82 είχα βάλει στην περίπτωση με το διάφανο πλαίσιο μια καλύτερη περιστροφή με έλεγχο anti-aliasing (μείξη) ενός εικονοστοιχείου (αφαιρεί τα τετράγωνα). Όμως με αυτόν τον τρόπο γίνονταν διπλό anti-aliasing, μια φορά στη μεγέθυνση και μια στην περιστροφή και αυτό είναι λάθος! Οπότε άλλαξα την ρουτίνα και τώρα κάνει την μεγέθυνση και την περιστροφή σε μια κίνηση και είναι τέλεια! (αλλά λίγο πιο αργή).
Στην Διάφανο έχει παραμείνει η παλιά ρουτίνα η οποία μάλιστα δεν έχει καν anti-aliasing, γιατί αφενός θέλουμε γρήγορα να φτιάχνει τις περιστροφές, αφετέρου θέλουμε να υπάρχουν καθαρά χρώματα (ενώ το anti-aliasing κάνει αναμείξεις), ώστε να αφαιρείται το χρώμα που ορίζουμε για διαφάνεια 100%. (Ουσιαστικά και η παλιά ρουτίνα έχει αλλάξει από την 82η αναθεώρηση, λόγω την προσθήκης ως επιλογής μάσκας εικονοστοιχείων, που προσδίδει διαπερατότητα ανά εικονοστοιχείο, αλλά δεν έχει αλλάξει ως προς την περιστροφή).
Στον Παίκτη, εκεί η περιστροφή γίνεται πάντα στο ένα προς ένα, στο μέγεθος 100% και μετά μεγεθύνεται. Επειδή  ο παίκτης έχει δική του μάσκα που φτιάχνεται με διανύσματα, μεγεθύνεται αυτή και αποκόπτει τα επιπλέον στοιχεία με ακρίβεια εικονοστοιχείου (ενώ αν δεν ήταν διανυσματική η μεγέθυνση, τα μικρά εικονοστοιχεία θα μεγάλωναν σε μεγάλα τετράγωνα, άρα θα εμφανίζονταν μεγάλα δόντια). Ο παίκτης μπορεί να δείχνει μια εικόνα χωρίς εσωτερικά διάφανα στοιχεία. Σε αυτή τη περίπτωση αν δεν υπήρχε μάσκα θα βλέπαμε τις πλευρές της εικόνας με μεγάλα δόντια, διότι η ρουτίνα περιστροφής δεν έχει φτιάξει τις άκρες - ενώ κάνει δουλειά στα άλλα εικονοστοιχεία με την μείξη. Με την μάσκα κόβουμε τις άκρες με ακρίβεια εικονοστοιχείου (ουσιαστικά δεν πειράζουμε την εικόνα αλλά αυτόματα το σύστημα παραθύρων των Windows χρησιμοποιεί την μάσκα για να αφαιρεί εικονοστοιχεία).
Μια ακόμα αλλαγή που έκανα είναι στην εντολή Εικόνα όπου σε ένα αλφαριθμητικό βάζουμε μια εικόνα και μπορούμε να ορίσουμε μέγεθος, ή μέγεθος κατά πλάτος και ύψος ανεξάρτητα. Εκεί λοιπόν έβαλα το Resample, δηλαδή τoν επαναπροσδιορισμό των εικονοστοιχείων με υψηλή ποιότητα (το είχα σε χαμηλή..). Η διαφορά ποιοτήτων αναφέρεται εδώ στην SetStretchBltMode συνάρτηση των windows. Εκεί λοιπόν αναφέρει τι κάνει η HALFTONE (αυτή είναι η ποιοτική). Για τις περιστροφές καλύτερη είναι βέβαια η ρουτίνα της ΑΝΤΕΓΡΑΨΕ, ενώ στα άλλα μας ενδιαφέρει το αποδοτικό!


Μια προσθήκη ακόμα είναι στην εντολή Χρώμα {}  όπου μπήκε ένα ακόμα αναγνωριστικό το Πάνω, με το οποίο δεν γράφουμε την γραμμή των περιεχόμενων σχημάτων αλλά μόνο το εσωτερικό. Επιπλέον η δεύτερη παράμετρος δηλώνει τύπο γεμίσματος.Χωρίς αυτή τη παράμετρο ο τύπος είναι το 0, δηλαδή το χρώμα γεμίσματος ως αυτό που δώσαμε στη πρώτη. Με 1 έως 7 υπάρχουν επιλογές διαγράμμισης, με τη 1 να σημαίνει χωρίς φόντο (διάφανο), και τα άλλα να δίνουν πλάγιες, διαγώνιες κ.α. γραμμές, με διάφανο το χώρο μεταξύ τους)
Η χρώμα χωρίς παραμέτρους και με το ελληνικό ερωτηματικό φτιάχνει μάσκα, δηλαδή περιοχή όπου μόνο εκεί βγαίνουν τα γραφικά. Εδώ έχω χρησιμοποιήσει ένα κύκλο και τα γραφικά κόβονται (περιορίζονται) από τον κύκλο. Αν ξεχάσουμε να επαναφέρουμε τη μάσκα σε όλη την οθόνη (γίνεται στις τελευταίες δυο γραμμές), τότε με την εντολή ΟΘΟΝΗ (CLS) η μάσκα επανατοποθετείται σε όλη την οθόνη. Η μάσκα αυτή δεν είναι ίδια με την μάσκα των Παικτών. Η μάσκα των παικτών αφαιρεί "φόρμα", ενώ εδώ αφαιρεί διαθέσιμο χώρο για εκτύπωση. Η αφαίρεση φόρμας για παράδειγμα είναι οι στρογγυλοποιήσεις άκρων σε φόρμες (οπότε εκεί δεν μπορούμε να κάνουμε κλικ, ή Hit Test όπως λέγεται προγραμματιστικά).

Προσθήκη: Η ανανέωση έγινε Ανανέωση 5000 ( δηλαδή μηδενίζει έναν εσωτερικό μετρητή για να γίνει η επόμενη σε 5 δευτερόλεπτα, αλλά ουσιαστικά θα γίνει μόλις δοθεί ξανά αυτή η εντολή. Στην επιστροφή στην γραμμή εντολών ρυθμίζεται αυτόματα στο νορμάλ)

ΤΜΗΜΑ καμ {
      ΔΙΑΒΑΣΕ πολ
      ΠΕΝΑ 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
      }
}


ΟΘΟΝΗ 1
ΠΕΝΑ 15
ΑΝΑΝΕΩΣΗ 5000
ΘΕΣΗ 6000,6000
ΒΑΨΕ 8000,5000,10
ΘΕΣΗ 6000,6000
ΚΡΑΤΗΣΕ
ΧΡΩΜΑ {ΚΥΚΛΟΣ ΓΕΜΙΣΜΑ 10, 6000 };
κκ=0
ΕΠΑΝΕΛΑΒΕ {
      ΘΕΣΗ 6000+κκ,6000
      ΧΡΩΜΑ ΠΑΝΩ 12 {
            καμ 1
            ΘΕΣΗ 8000+κκ,5000
            ΚΥΚΛΟΣ 1000
            καμ .7
      }
      ΘΕΣΗ 6000+κκ,6000
      ΠΑΧΟΣ 10 {
            ΠΕΝΑ 11 {
                  ΧΡΩΜΑ 15,2 {
                  καμ 1
                  ΘΕΣΗ 8000+κκ,5000
                  ΚΥΚΛΟΣ 1000
                  καμ .7
            }
      }
      }
      ΑΝΑΝΕΩΣΗ
5000
      κκ+=30
      α$=ΚΟΜ$
      ΑΝ α$=" " ΤΟΤΕ ΕΞΟΔΟΣ
      ΑΝ ΘΕΣΗ("βb",ΠΕΖ$(α$))>0 ΤΟΤΕ κκ-=60
      ΑΦΗΣΕ
} ΠΑΝΤΑ

ΘΕΣΗ 0,0
\\ ΕΙΔΙΚΗ ΧΡΩΜΑ ΜΕ ΤΟ ΕΡΩΤΗΜΑΤΙΚΟ ΣΤΟ ΤΕΛΟΣ
\\ ΦΤΙΑΧΝΕΙ ΜΑΣΚΑ ΠΟΥ ΑΠΟΤΡΕΠΕΙ ΤΗΝ ΕΜΦΑΝΙΣΗ ΓΡΑΦΙΚΩΝ
\\ ΧΡΩΜΑ {ΠΟΛΥΓΩΝΟ 0, Χ.ΣΗΜΕΙΑ, 0,0,Υ.ΣΗΜΕΙΑ,-Χ.ΣΗΜΕΙΑ,0,0,-Υ.ΣΗΜΕΙΑ};
\\ το ίδιο κάνει και αυτή
ΧΡΩΜΑ {};




Με Ctrl+C στην εισαγωγή εμφανίζεται το CLS και πατιέται αυτόματα το Enter..
Όταν τρέχει ένα πρόγραμμα το Ctrl+C κάνει διακοπή (μας ρωτάει πρώτα).

Υ.Γ (αυτή είναι η καμπύλη που παίζει στο βίντεο με το ανθρωπάκι που τρέχει).

Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου

You can feel free to write any suggestion, or idea on the subject.