ΕΠΛ 131 Φροντιστήριο 2
Όπως και για το έμβλημα του Πανεπιστημίου Κύπρου Από πού θα αντλήσουμε τα βασικά δομικά στοιχεία για τη λύση μας; Από τη Βιβλιοθήκη StdDraw, και επίσης θα κατασκευάσουμε και δικές μας μεθόδους αξιοποιώντας και πάλι μεθόδους της StdDraw
Μέθοδοι από τη Βιβλιοθήκη StdDraw που θα χρησιμοποιήσουμε public class StdDraw void setxscale(double x0, double x1) void setyscale(double y0, double y1) void line(double x0, double y0, double x1, double x2) void circle(double x, double y, double r) void filledsquare(double x, double y, double r) void setpenradius(double r) void setpencolor(color c) void clear(color c)
/* Πρόγραμμα που ζωγραφίζει το έμβλημα των Ολυμπιακών Αγώνων */ import java.awt.color; public class Olympic_Rings{ public static void main(string[] args){
/* Βήμα 1: Προσδιορίζουμε το μέγεθος του πλαισίου (100 x 100) και δημιουργούμε το πλέγμα που αποτελεί το φόντο του εμβλήματος */ StdDraw.setXscale(0.0, 100.0); StdDraw.setYscale(0.0, 100.0); StdDraw.clear(Color.WHITE); StdDraw.setPenColor(Color.GRAY);..............
10 9 8 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8 9 10 Τι παρατηρούμε;
Το κάθε τετραγωνάκι προσδιορίζεται από τη σειρά (i) και τη στήλη (j) που βρίσκεται. Για κάθε γκρίζο τετραγωνάκι Είτε το i και το j είναι και οι δύο ζυγοί αριθμοί Είτε είναι περιττοί αριθμοί r r (x,y)
Ποια είναι η κατάλληλη αλγοριθμική δομή για τη δημιουργία των γκρίζων τετραγώνων; Διπλή απαριθμητή επανάληψη Επανέλαβε για κάθε σειρά i Επανέλαβε για κάθε στήλη j Εάν i και j είναι και οι δύο είτε ζυγοί, είτε περιττοί αριθμοί Ζωγράφισε στην εν λόγω θέση ένα γκρίζο τετραγωνάκι μεγέθους 1
for (int ri = 1; ri <= 100; ri++) /* for every row ri */ for (int cj = 1; cj <= 100; cj++) /* for every col cj */ if ((ri % 2 == 1 && cj % 2 == 1) /* both odd? */ (ri % 2 == 0 && cj % 2 == 0)) /* both even? */ StdDraw.filledSquare ((double)(ri - 1) + 0.5, /* x coordinate */ (double)(cj - 1) + 0.5, /* y coordinate */ 0.5); /* radius r */ Γιατί το βήμα 1 (δημιουργία φόντου-πλέγματος) να μην κωδικοποιηθεί ως ξεχωριστή μέθοδος; Άρθρωση
public static void draw_background_grid (){ StdDraw.setXscale(0.0, 100.0); StdDraw.setYscale(0.0, 100.0); StdDraw.clear(Color.WHITE); StdDraw.setPenColor(Color.GRAY); for (int ri = 1; ri <= 100; ri++) for (int cj = 1; cj <= 100; cj++) if ((ri % 2 == 1 && cj % 2 == 1) (ri % 2 == 0 && cj % 2 == 0)) StdDraw.filledSquare ((double)(ri - 1) + 0.5, (double)(cj - 1) + 0.5, 0.5);
/* Βήμα 1: Προσδιορίζουμε το μέγεθος του πλαισίου (100 x 100) και δημιουργούμε το πλέγμα που αποτελεί το φόντο του εμβλήματος */ draw_background_grid();
/* Βήμα 2: Ζωγραφίζουμε τους πάνω κύκλους*/ StdDraw.setPenRadius(0.030); StdDraw.setPenColor(Color.BLUE); StdDraw.circle(15.0, 60.0, 14.0); StdDraw.setPenColor(Color.BLACK); StdDraw.circle(50.0, 60.0, 14.0); StdDraw.setPenColor(Color.RED); StdDraw.circle(85.0, 60.0, 14.0);
14 60 15 50 85
/* Βήμα 3: Ζωγραφίζουμε τους κάτω κύκλους*/ StdDraw.setPenColor(Color.YELLOW); StdDraw.circle(33.0, 45.0, 14.0); StdDraw.setPenColor(Color.GREEN); StdDraw.circle(68.0, 45.0, 14.0);
14 45 33 68
Ποια είναι η αδυναμία; Δεν υπάρχει η σύμπλεξη των κάτω με τους πάνω κύκλους Πως μπορούμε να το πετύχουμε;
Εάν δεν υπήρχε η μέθοδος circle στην StdDraw πώς θα την ορίζαμε χρησιμοποιώντας τη μέθοδο line; Η ίδια μέθοδος θα μπορούσε να χρησιμοποιηθεί για το σχηματισμό οποιουδήποτε πολύγωνου
(r cos θ, r sin θ) θ (0,0) r (r,0) (r cos θ + x, r sin θ + y) θ (x,y) r (x + r, y)
public static void line_circle (double x, double y, double r){ double angle = 0.0; double x1 = x + r; double y1 = y; double x2, y2; while (angle <= 360.0){ x2 = r * Math.cos(Math.toRadians(angle)) + x; y2 = r * Math.sin(Math.toRadians(angle)) + y; StdDraw.line(x1, y1, x2, y2); x1 = x2; y1 = y2; angle = angle + 1.0;
public static void filled_circle (double x, double y, double r){ double eps = 0.05, rad = eps; while (rad <= r){ line_circle(x,y,rad); rad = rad + eps; /* Εναλλακτικά */ public static void filled_circle (double x, double y, double r){ double eps = 0.05, rad = r; while (rad > 0.0){ line_circle(x,y,rad); rad = rad - eps;
Κύκλοι με κενά! [135,225] 45 45 45 45 [0,45] [315,360]
public static void line_circle_with_gaps (double x, double y, double r, double [] gaps){ double angle = 0.0; double x1 = x + r; double y1 = y; double x2, y2; while (angle <= 360.0){ x2 = r * Math.cos(Math.toRadians(angle)) + x; y2 = r * Math.sin(Math.toRadians(angle)) + y; if (!included_in_gap(angle, gaps)) StdDraw.line(x1, y1, x2, y2); x1 = x2; y1 = y2; angle = angle + 1.0;
public static boolean included_in_gap(double angle, double [] angs){ for (int i= 0; i < angs.length - 1; i= i+2) if (angle >= angs[i] && angle <= angs[i+1]) return true; return false;
public static void filled_circle_with_gaps (double x, double y, double r, double [] gaps){ double eps = 0.05, rad = eps; while (rad <= r){ line_circle_with_gaps(x,y,rad,gaps); rad = rad + eps; /* Εναλλακτικά */ public static void filled_circle_with_gaps (double x, double y, double r, double [] gaps){ double eps = 0.05, rad = r; while (r > 0.0){ line_circle_with_gaps(x,y,rad,gaps); rad = rad - eps;
/* Πρόγραμμα που ζωγραφίζει το έμβλημα των Ολυμπιακών Αγώνων */ import java.awt.color; public class Olympic_Rings{ public static void main(string[] args){ draw_background_grid(); StdDraw.setPenRadius(0.030); StdDraw.setPenColor(Color.BLUE); StdDraw.circle(15.0, 60.0, 14.0); StdDraw.setPenColor(Color.BLACK); StdDraw.circle(50.0, 60.0, 14.0); StdDraw.setPenColor(Color.RED); StdDraw.circle(85.0, 60.0, 14.0); double angs [] = {0.0, 20.0, 95.0, 125.0, 355.0, 360.0; StdDraw.setPenColor(Color.YELLOW); line_circle_with_gaps(33.0, 45.0, 14.0, angs); StdDraw.setPenColor(Color.GREEN); line_circle_with_gaps(68.0, 45.0, 14.0, angs);
Διάφορα σχήματα που μπορούμε να δημιουργήσουμε