5 ο Εργαστήριο Δομές Επανάληψης (συνέχεια) Κύκλος 270 ο 3*(π/2) rad (3*HALF_PI) 180 ο π rad (PI) 0 ο 0 rad 360 ο 2π rad (TWO_PI) hyp x opp adj 90 ο π/2 rad (HALF_PI) sin(x) = opp / hyp cos(x) = adj/hyp Οι συντεταγμένες (Χ, Υ) κάθε σημείου στην περίμετρο ενός κύκλου υπολογίζονται με βάση τη γωνία x, το κέντρο του κύκλου (centerx, centery) και την ακτίνα του (radius) ως εξής: Χ = centerx + (radius * cos(x)); Y = centery + (radius * sin(x)); Σχεδιάζοντας έναν κύκλο με τριγωνομετρία Μέγεθος καμβά Ορισμός χρώματος φόντου Πάχος γραμμής Δήλωση μεταβλητής για ακτίνα κύκλου Μεταβλητές για δήλωση του κέντρου του κύκλου Ορισμός χρώματος γραμμής Ορισμός να μην έχουν χρώμα γεμίσματος τα σχήματα Σχεδίαση κύκλου Αλλαγή χρώματος γραμμής Επανάληψη από 0 έως 360 μοίρες με βήμα αύξησης 5 μοίρες Μετατροπή από μοίρες σε ακτίνια (radians) Υπολογισμός συντεταγμένων σημείου στη περίμετρο του κύκλου Σχεδίαση σημείου 1
Σχεδιάζοντας έναν κύκλο με τριγωνομετρία (animation) float radius = 100; int centx = 250; int centy = 150; float x, y; float lastx = -999; float lasty = -999; float ang = 0; void setup(){ size(500,300); framerate(10); background(255); strokeweight(5); smooth(); stroke(0, 30); nofill(); ellipse(centx,centy,radius*2,radius*2); stroke(20, 50, 70); void draw(){ if (ang <= 360 ) { float rad = radians(ang); x = centx + (radius * cos(rad)); y = centy + (radius * sin(rad)); point(x,y); ang += 5; Το ίδιο πρόγραμμα με το παραπάνω παράδειγμα αλλά τώρα βλέπουμε σε animation τη σχεδίαση κάθε σημείου πάνω στην περίμετρο του κύκλου. 2
Μετατρέποντας έναν κύκλο σε σπείρα Ορισμός αρχικής τιμής ακτίνας σε 10 Ορισμός αρχικής τιμής lastx, lasty σε -999. Επανάληψη από 0 μοίρες έως 1440 μοίρες. Θα γίνουν 1440/360=4 πλήρης περιστροφές για τη σχεδίαση της σπείρας. Η ακτίνα του κύκλου αυξάνεται κατά 0.5 μοίρες σε κάθε επανάληψη Για να σχεδιαστεί η σπείρα σχεδιάζεται κάθε φορά μια γραμμή με αρχικό σημείο το x,y που υπολογίστηκε στη τρέχουσα επανάληψη και τελικό σημείο αυτό που υπολογίστηκε στην προηγούμενη επανάληψη και αποθηκεύτηκε στις μεταβλητές lastx, lasty. Ο έλεγχος με την if διασφαλίζει ότι στην πρώτη επανάληψη δεν θα σχεδιαστεί γραμμή αλλά μόνο από τη δεύτερη επανάληψη και μετά. Αυτό χρειάζεται γιατί για να σχεδιαστεί μια γραμμή πρέπει να έχουν υπολογιστεί συντεταγμένες δύο σημείων. Δοκιμάστε να αλλάξετε το βήμα αύξησης της ακτίνας του κύκλου, τον αριθμό πλήρων περιστροφών για να δείτε το αποτέλεσμα που προκύπτει. 3
random() Παράγει τυχαίους αριθμούς. Κάθε φορά που η random() καλείται, επιστρέφει μια τυχαία τιμή εντός του καθορισμένου εύρους. Εάν μόνο μία παράμετρος περνά στη συνάρτηση, θα επιστρέψει έναν float μεταξύ μηδέν και τη τιμή της παραμέτρου. Για παράδειγμα, η random(5) επιστρέφει τιμές μεταξύ 0 και 5 (ξεκινώντας από το μηδέν, και μέχρι, αλλά μη συμπεριλαμβανομένης της τιμής 5). Εάν έχουν καθοριστεί δύο παράμετροι, η συνάρτηση θα επιστρέψει έναν float με μια τιμή μεταξύ των δύο τιμών. Για παράδειγμα, η random(-5, 10.2) επιστρέφει τιμές που ξεκινούν από -5 έως (αλλά μη συμπεριλαμβανομένης) 10.2. Παράδειγμα for (int i = 0; i < 100; i++) { float r = random(50); stroke(r*5); line(50, i, 50+r, i); noise() Επιστρέφει την τιμή του θορύβου Perlin σε συγκεκριμένες συντεταγμένες. O θόρυβος Perlin είναι μια τυχαία γεννήτρια ακολουθίας αριθμών, που παράγει όμως μια πιο φυσική, αρμονική διαδοχή των αριθμών από εκείνη της λειτουργίας βασικής συνάρτησης random(). Εφευρέθηκε από τον Ken Perlin στη δεκαετία του 1980 και έχει χρησιμοποιηθεί σε εφαρμογές γραφικών για να δημιουργήσει διαδικαστικές υφές, σχήματα, εδάφη, και άλλες φαινομενικά οργανικές μορφές. Σε αντίθεση με την random() λειτουργία, o θόρυβος Perlin ορίζεται σε ένα άπειρο χώρο n-διαστάσεων, όπου κάθε ζεύγος συντεταγμένων αντιστοιχεί σε μια σταθερή ημι-τυχαία τιμή (σταθερή μόνο για την διάρκεια ζωής του προγράμματος). Η προκύπτουσα τιμή θα είναι πάντα μεταξύ 0.0 και 1.0. Η Processing μπορεί να υπολογίσει 1Δ, 2Δ και 3Δ θόρυβο, ανάλογα με τον αριθμό των συντεταγμένων που δίνονται. Γενικά, όσο μικρότερη είναι η διαφορά μεταξύ των συντεταγμένων, τόσο ομαλότερη η προκύπτουσα ακολουθία θορύβου. Βήματα από 0.005 έως 0.03 λειτουργούν καλύτερα για τις περισσότερες εφαρμογές, αλλά αυτό θα διαφέρει ανάλογα με τη χρήση. Παράδειγμα float xoff = 0.0; void draw() { background(204); xoff = xoff +.01; float n = noise(xoff) * width; line(n, 0, n, height); 4
Δημιουργία σπείρας με θόρυβο και τυχαίους αριθμούς 5
100 σπείρες με θόρυβο Ορισμός μικρού πάχους γραμμής Επανάληψη από 0 έως 100 για να σχεδιαστούν 100 σπείρες. Η random(10) θα παράγει έναν τυχαίο αριθμό από το 0 έως το 10. Αυτός ο τυχαίος αριθμός θα είναι ο θόρυβος που θα εφαρμοστεί στην ακτίνα των κύκλων. Το χρώμα της γραμμής ορίζεται με τυχαίο τρόπο. Η γωνία έναρξης ορίζεται με τυχαίο τρόπο. Η γωνία τερματισμού ορίζεται με τυχαίο τρόπο αλλά θα είναι μεγαλύτερη από 1440. Το βήμα αύξησης της γωνίας ορίζεται με τυχαίο τρόπο. Επανάληψή με βάση τις τυχαίες τιμές που παράχθηκαν. Σε κάθε επανάληψη ο θόρυβος αυξάνεται κατά 0.05 Υπολογισμός της ακτίνας με βάση τις τυχαίες τιμές και χρήση της noise(). 6