Τρίτη, 8 Δεκεμβρίου 2020

Καμπύλη Πεάνο

 

Η καμπύλη Πεάνο, γεμίζει το χώρο. Εδώ γεμίζει με μια ψευδαίσθηση τριών διαστάσεων. Δείτε τη εικόνα παρακάτω. Εμφανίζεται μια πιο καθαρή περιοχή στη μέση ενώ στις άκρες είναι πιο φλου, σαν να έχουμε βάθος πεδίου!

Το πρόγραμμα που δημιούργησε τηνjpg εικόνα αυτή είναι αυτό:

move 0,0
image "g1.emf"
a$=""
copy scale.x, scale.y to a$
image a$ export "g1.jpg", 80

Πήρε την εξαγωγή του επόμενου προγράμματος, που ήταν σε emf (σχέδιο, είναι μέγεθος 32MB, γιατί έχει όλες τις εντολές γραμμών, και εδώ το σχέδιο γίνεται με πάρα πολλές γραμμές), το εμφάνισε στην κονσόλα της Μ2000, το αντέγραψε ως Bitmap, και το έσωσε ως jpg.


Και αυτό εδώ είναι ο Εξερευνητής Πεάνο. Λογικά όλοι δημιουργούν μια καμπύλη Πεάνο με χρήση ακεραίων. Εδώ γίνεται χρήση διπλής ακρίβειας πραγματικών. Το σχέδιο γίνεται μέσα σε ένα μπλοκ Drawing (Σχέδιο) το οποίο παραδίδει μια διάρθρωση μνήμης, εδώ το B. Με μια Len(B) η Μήκος() μπορούμε να δούμε το μήκος σε Bytes. Εδώ έχει 32 εκατομμύρια Bytes. Στο τέλος την γράφουμε ως δυαδικό αρχείο, με τρεις εντολές Open, Put, Close. Η διάρθρωση B έχει φτιαχτεί ως emf, από την εντολή Drawing, δηλαδή σαν ένα αρχείο στη μνήμη. Έτσι η  εντολή εικόνα ή Image μπορεί να την διαχειριστεί.

Όπως βλέπουμε η καμπύλη δημιουργείται από μια ρουτίνα (υποπρόγραμμα), που καλεί τον εαυτό του (recursion, αναδρομή).

Την ρουτίνα την πήρα από εδώ: http://rosettacode.org/wiki/Peano_curve στην οποία έχω αναρτήσει και ένα πιο απλό πρόγραμμα!


Module Peano_Explorer {
      cls 1, 0
      once=true
      Flush
      data 3.9, 3
      for i= 3.4 to 4 step 0.018
            data i
      next i
      Drawing scale.x, scale.y {
            while not empty
                  read k
                  wi=k^4
                  n=twipsX*int(K/3*12)
                  wi2=wi*(3/k)^1.5
                  (dx, dy)=((scale.x-wi2*n)/2, (scale.y-wi2*n)/2)
                  move dx , dy
                  if once then fill wi2*n, wi2*n, 0
                  dx+=k*1.2*twipsX
                  dy+=k*1.2*twipsY
                  move dx, dy
                  if not once then Pen 15-int((k mod 0.7)*8+2) {Peano(0,0,wi,0, 0)}
                  once=false
                  next
            end while
      } as B
      Move 0,0
      image B
      open "g1.emf" for output as #f
      put #f, B
      close #f

      Sub Peano(x, y, lg, i1, i2)
            If lg ==1 Then
                  Draw to x*n+dx , y*n+dy
                  Exit sub
            end if
            lg/=k
            Peano(x+2*i1*lg, y+2*i1*lg, lg, i1, i2)
            Peano(x+(i1-i2+1)*lg, y+(i1+i2)*lg, lg, i1, 1-i2)
            Peano(x+lg, y+lg, lg, i1, 1-i2)
            Peano(x+(i1+i2)*lg, y+(i1-i2+1)*lg, lg, 1-i1, 1-i2)
            Peano(x+2*i2*lg, y+2*(1-i2)*lg, lg, i1, i2)
            Peano(x+(1+i2-i1)*lg, y+(2-i1-i2)*lg, lg, i1, i2)
            Peano(x+2*(1-i1)*lg, y+2*(1-i1)*lg, lg, i1, i2)
            Peano(x+(2-i1-i2)*lg, y+(1+i2-i1)*lg, lg, 1-i1, i2)
            Peano(x+2*(1-i2)*lg, y+2*i2*lg, lg, 1-i1, i2)
      End Sub
}

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

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