Κυριακή, 4 Νοεμβρίου 2018

Αναθεώρηση 27 Έκδοση 9.4

Διορθώθηκε η συνάρτηση Χρώμα() ή Color(). Προστέθηκε η εντολή Χρωμάτισε η οποία χρωματίζει ένα και μόνο εικονοστοιχείο (pixel), στα αγγλικά είναι η PSet.
Μπορούμε να χρησιμοποιήσουμε την PSET χωρίς παραμέτρους και χρωματίζει με την τρέχουσα πένα στο σημείο που δείχνει ο δρομέας γραφικών (δεν τον βλέπουμε αλλά οι συντεταγμένες, για κάθε επίπεδο, και αυτό της κονσόλας και στις φόρμες, κρατούνται σε κάθε αλλαγή του δρομέα που τυχόν κάνουν άλλες εντολές γραφικών),
Μπορούμε να δώσουμε ένα χρώμα (δεν θα αλλάξει το χρώμα της τρέχουσας πένας, αλλά θα χρησιμοποιηθεί αυτό που θα δώσουμε για την εντολή αυτή και μόνο). Επίσης μπορούμε να δώσουμε απόλυτες συντεταγμένες, χωρίς να αλλάξει ο δρομέας γραφικών, και να χρωματίσουμε ένα εικονοστοιχείο (απαραίτητα θα έχουμε δώσει και χρώμα).
Έτσι έχουμε τρεις περιπτώσεις:
PSET
PSET color
PSET color, x, y

Μπορούμε να μαθαίνουμε το χρώμα με την Σημείο ή Point, η οποία δουλεύει για συγκεκριμένο σημείο, εκεί που δείχνει ο δρομέας γραφικών. Ο δρομέας μπορεί να μετακινηθεί με την Θέση ή Move (πάντα σε Twips, οπότε αν θέλουμε να είναι σε Pixels, πρέπει τα pixels να τα πολλαπλασιάσουμε με το twipsX ή το twipsY ανάλογα. (σε νορμάλ οθόνες αυτά είναι το ίδιο νούμερο, το 15 όταν η οθόνη είναι 96dpi). Δηλαδή κάθε 15 twips έχουμε 1 pixel. Τα twips της οθόνης λέγονται λογικά, γιατί δεν είναι πραγματικά. Στη σελίδα του εκτυπωτή έχουμε τα πραγματικά twips, όπου 1440twips είναι μια ίντσα. (http://www.kylesconverter.com/length/twips-to-inches)

Αν στον εκτυπωτή έχουμε 15 twips για κάθε Pixel, τότε θα έχουμε 1440/15=96, δηλαδή 96dpi (τα pixels λέγονται dots στον εκτυπωτή). Αν έχουμε 1 twip για ένα dot τότε έχουμε 1440dpi. Αυτά έχουν σημασία όταν θέλουμε να ξέρουμε το μέγεθος μιας εικόνας αν τυπωθεί 1:1, ένα προς ένα, δηλαδή 1 pixel σε 1 dot. Επίσης αν θέλουμε να βάλουμε μια εικόνα με οποιοδήποτε πλάτος στο χαρτί σε πλάτος 5 εκατοστών θα πρέπει να υπολογίσουμε αν θα πρέπει να αυξήσουμε ή μειώσουμε το πλάτος, δηλαδή να βρούμε την κλίμακα ώστε να τυπωθεί σε 5 εκατοστά πλάτος, και φυσικά με την ίδια κλίμακα να εφαρμόσουμε και στο ύψος για να διατηρηθεί η αρχική αναλογία πλάτος προς ύψος.

Στις παλαιότερε εκδόσεις για να τυπώσουμε ένα σημείο έπρεπε να χρησιμοποιήσουμε την ΒΑΨΕ ή FILL η οποία υπάρχει για να φτιάχνουμε τετράπλευρα με όσο πλάτος και ύψος θέλουμε (άρα και ένα εικονοστοιχείο), με χρήση ενός ή δυο χρωμάτων, καθώς επίσης για δυο χρώματα μπορούμε να ορίσουμε αν θα αλλάζουν σε οριζόντια ή σε κάθετη διεύθυνση, και αν θα αλλάζουν ως έχουν ή αν θα αποτελούν τμήμα ενός μεγαλύτερου τετράπλευρου, αυτού της φόρμας, οπότε το χρώμα εκκίνησης και τερματισμού θα σχετίζεται με αυτό της θέσης του τετραπλεύρου. Δείτε την Βοήθεια ΒΑΨΕ για όλα αυτά (και άλλα όπως θα δείτε, μπορεί να εμφανίζει συγκεκριμένα πλαίσια των Windows αν μετά την λέξη ΒΑΨΕ ακολουθεί το @).

Το παρακάτω πρόγραμμα φτιάχνει τέσσερις σφαίρες. Οι σφαίρες έχουν σκιάσεις, και το τμήμα Sphere δέχεται σαν τέταρτη παράμετρο μια λάμδα συνάρτηση για να εφαρμοστεί σε κάθε εικονοστοιχείο. Υπάρχουν πέντε συναρτήσεις για να δούμε το αποτέλεσμα.
Η χρήση της Pset δεν είναι γρήγορη, επειδή μεσολαβεί κάποιος χρόνος ανανέωσης της οθόνης. Για το σκοπό αυτό αφενός βάζουμε το Set Fast ! ή Θέσε Γρήγορα ! όπου γίνονται λιγότερες ανανενώσεις, και αφετέρου βάζουμε τον ρυθμό ανανέωσης σε σχέση με τα γραφικά με την Refresh, (ή Ανανέωση)| στα 500ms (μισό δευτερόλεπτο).

Η τελευταία σφαίρα μπαίνει με διαφάνεια. Για να το πετύχουμε αυτό:
1. Παίρνουμε το χρώμα που ήδη υπάρχει στο σημείο που θέλουμε να γράψουμε με την Point (Σημείο)
2. Το χρώμα έρχεται με αρνητικό πρόσημο (έχει σχέση με το πώς ορίζονται τα χρώματα στη Μ2000), αλλά εδώ πρώτα το γυρνάμε σε θετικό και το βάζουμε σε ένα πρόχειρο, στην ουσία μια Διάρθρωση μνήμης που έχουμε περάσει στη  λάμδα συνάρτηση ως "κλείσιμο" (closure).
3. Στη διάρθρωση έχουμε ορίσει να διαβάζουμε Bytes. Εκτός από Double και Single, όλοι οι άλλοι αριθμοί είναι χωρις πρόσημο, έτσι σε μια θέση για Byte (Ψηφίο) βάζουμε τιμές από 0 έως 255.
4. Για να βάλουμε τιμή σε μια διάρθρωση πρέπει να δώσουμε το offset ή την σχετική διεύθυνση, με το 0 να δηλώνει το πρώτο byte. Επίσης μπορούμε να ορίσουμε αν θα βάλουμε αυτό που πρέπει δηλαδή το Byte ή αν θα δηλώσουμε ότι θα βάλουμε κάτι μεγαλύτερο, οπότε θα καλύψει και άλλα bytes. Έτσι εδώ έχουμε 8 bytes, για να βάλουμε ως Long (ως Μακρύς)  το χρώμα που πήραμε από το Σημείο, και στην θέση 4 ( θέσεις ψηφίων 4,5,6,7) θα πέσει το χρώμα που θέλουμε να βάλουμε.
5. Τη διάρθρωση τη χρησιμοποιούμε για να διαβάσουμε το κάθε ψηφίο των RGB (τα τρία πρώτα ψηφία του Μακρύ), και να βγάζουμε το μέσο όρο, και στο τέλος διαβάζουμε το νούμερο ως μακρύς (λέει as long). Όπου χρησιμοποιούμε στις διαρθρώσεις το ως κάτι για διάβασμα τότε η σχετική διεύθυνση είναι σε μέτρο ψηφίων. Εδώ η διάρθρωση είναι με μέτρο ψηφίων (bytes) για να αλλάξουμε ψηφία (bytes).




Module CheckIt {
      Form 60, 40
      Cls 0 ' Black
      Gradient 0,1
      Pen 14 ' Yellow
      Set Fast !
      Refresh 500
      Module Sphere (R as long, X0 as long, Y0 as long, fun){
            R2 = R * R
            Def Long X, Y, D2
            Let Scale=twipsx/R*13.5
            For Y = -R To R step twipsx {
            Move X0-R, Y+Y0
            For X = -R To R step twipsy {
                  D2 = X **2 + Y **2
                  IF R2>D2 THEN Pset Fun(Max.Data(Min.Data((Sqrt(R2 - D2) - ( X + Y) / 2 )*Scale ,255),0))
                  Step twipsx
            }
            }
      }
      Blue=lambda (c)->{
            c1=c/4+192
            =Color(c,c,c1)
      }
      Blue1=lambda (c)->{
            c1=c/4+Random(150,192)
            =Color(c,c,c1)
      }
      Mystery=lambda m=1 (c)->{
            c1=c/4+m
            m+=10
            if m>192 then m=1
            =Color(c,c,c1)
      }
      Mystery2=lambda m=1, p=true (c)->{
            c1=c/4+m
           if p then m+=10
           Else m=-10
            if m>192 then m-=10 : p=false
            If m<0 then m+=10: p=true
            =Color(c,c,c1)
      }
      Buffer Alfa as byte*8
      Trans =lambda Alfa (c) -> {
            Return Alfa, 0:=-point as long
            Return Alfa, 4:=-color(c,c, c/4+192) as long
            for i=0 to 2: Return Alfa, i:=(Eval(Alfa, i)+Eval(Alfa, i+4))/2: Next i
            =-Eval(Alfa, 0 as long)
      }
      Sphere 2400, 9000,7000, Blue
      Sphere 800, 6000, 7000, Blue1
      Sphere 1200, 5000,5000, Mystery
      Sphere 1200, 10000,6000, Mystery2
      Sphere 1200, 8000,5000, trans
}
Checkit