Συστήματα Συντεταγμένων & Βασικές Μέθοδοι Σχεδίασης Νικήτας Σγούρος sgouros@unipi.gr
Σχεδιασμός Ευθύγραμμων Τμημάτων και Ψηφίδων Κλάση Graphics Μέθοδος drawline(xa, ya, xb, yb) Μέθοδος drawline(x, y, x, y) (για pixel) Μέθοδος drawrect(xa, ya, width, height) Μέθοδος fillrect(xa, ya, width, height) Μέθοδος setcolor(color) Κλάση Canvas Μέθοδος paint(graphics) Κλάση Color
Παράδειγμα Υλοποίησης import java.awt.*; import java.awt.event.*; public class MiddleRect extends Frame { public static void main(string[] args){ new MiddleRect(); MiddleRect() { super("ορθογώνιο στη Μέση"); addwindowlistener(new WindowAdapter() {public void windowclosing(windowevent e){system.exit(0);); setsize(200, 100); add("center", new CvMiddleRect()); show(); class CvMiddleRect extends Canvas { public void paint(graphics g) { Dimension d = getsize(); int maxx = d.width - 1, maxy = d.height - 1; g.setcolor(color.red); g.drawrect(maxx/4, maxy/4, maxx/2, maxy/2);
Συντεταγμένες Συσκευής Οι συντεταγμένες (x, y) κάθε ψηφίδας στην οθόνη του υπολογιστή (device coordinates) Οι συντεταγμένες συσκευής είναι ακέραιες (0,0) x y
Λογικές Συντεταγμένες Το σύστημα συντεταγμένων με βάση το οποίο συντίθεται μια εικόνα Οι λογικές συντεταγμένες λαμβάνουν πραγματικές τιμές
Κλίμακα Μέτρησης Ένα ισοτροπικό σύστημα συντεταγμένων χρησιμοποιεί κοινές μονάδες μέτρησης σε όλους τους άξονες Διαφορετικά το σύστημα συντεταγμένων χαρακτηρίζεται ως ανισοτροπικό
Από Λογικές σε Συντεταγμένες Συσκευής // logicalrange = Το εύρος των λογικών συντεταγμένων // devicenumofpixels = Το εύρος των συντεταγμένων συσκευής // Πόση είναι η απόσταση μεταξύ δύο διαδοχικών pixel συσκευής // σε λογικές συντεταγμένες; pixelsize = logicalrange/devicenumofpixels; int ix(float x){return Math.round(xCenter+x/pixelSize); int iy(float y){return Math.round(yCenter-y/pixelSize);
Από Συντεταγμένες Συσκευής σε Λογικές Συντεταγμένες pixelsize = logicalrange/devicenumofpixels; float fx(int x){return (x-xcenter)*pixelsize; float fy(int y){return (ycenter-y)*pixelsize;
Παρατηρήσεις Η μετατροπή από λογικές συντεταγμένες σε συντεταγμένες συσκευής εφαρμόζει αριθμητικές στρογγυλοποιήσεις
Σχεδίαση Τριγώνου σε Λογικές Συντεταγμένες -1 import java.awt.*; import java.awt.event.*; public class Tri extends Frame { public static void main(string[] args){new Tri(); Tri() { super("triangle"); addwindowlistener(new WindowAdapter() {public void windowclosing(windowevent e){system.exit(0);); setsize(600, 400); add("center", new CvTri()); show();
Σχεδίαση Τριγώνου σε Λογικές Συντεταγμένες -2 class CvTri extends Canvas { int maxx, maxy, xcenter, ycenter; float pixelsize, rwidth = 10.0F, rheight = 10.0F; void initgr() { Dimension d = getsize(); maxx = d.width - 1; maxy = d.height - 1; pixelsize = Math.max(rWidth/maxX, rheight/maxy); xcenter = maxx/2; ycenter = maxy/2; int ix(float x){return Math.round(xCenter+x/pixelSize); int iy(float y){return Math.round(yCenter-y/pixelSize); float fx(int x){return (x-xcenter)*pixelsize; float fy(int y){return (ycenter-y)*pixelsize; public void paint(graphics g) { initgr(); float side = 0.95F * Math.min(rHeight, rwidth), h = side/2.0f * (float)math.sqrt(3), xa, ya, xb, yb, xc, yc; xa = - side/2.0f; ya = - 0.5F * h; xb = side/2.0f; yb = ya; xc = 0.0F; yc = 0.5F * h; g.drawline(ix(xa), iy(ya), ix(xb), iy(yb)); g.drawline(ix(xb), iy(yb), ix(xc), iy(yc)); g.drawline(ix(xc), iy(yc), ix(xa), iy(ya));
Κανονικά Πολύγωνα Πλευρές ισομήκεις, γωνίες μεταξύ πλευρών ίσες. n i = ( radius * cos(2π(i-1)/n), radius * sin(2π(i-1)/n) ) // Point2D.java: Class for points in logical coordinates. class Point2D { float x, y; Point2D(float x, float y){this.x = x; this.y = y;
Σχεδίαση Πολυγώνων public void paint(graphics g) { setbackground(black); Color curcolor = new Color(rand(), rand(), rand()); initgr(); int left = ix(-rwidth/2), right = ix(rwidth/2), bottom = iy(-rheight/2), top = iy(rheight/2); do { numofvertices = random(28); while (numofvertices < 3); vertices = new Point2D[numOfVertices]; delang = TWOPI/numOfVertices; for (int i=0; i<numofvertices; i++) { angle = i*delang + dang; vertices[i] = new Point2D((float)(radius*Math.cos(angle)), (float)(radius*math.sin(angle))); for (int i = 0; i < numofvertices; i++) for (int j = numofvertices-1; j >= 0; j--) if (j > i) { g.setcolor(curcolor); g.drawline(ix(vertices[i].x), iy(vertices[i].y), ix(vertices[j].x), iy(vertices[j].y)); else break;
Πολυσπειροειδή 1. cur_angle = init_angle, cur_dist = init_dist 2. Από τη θέση στην οποία βρίσκεσαι ζωγράφισε ένα ευθύγραμμο τμήμα με μήκος cur_dist και με διεύθυνση cur_angle. Η καινούργια σου θέση είναι το τέλος του ευθύγραμμου τμήματος που μόλις σχεδιάστηκε. 3. cur_angle = cur_angle + dangle, cur_dist = cur_dist + incr 4. Εκτέλεσε επαναληπτικά τα βήματα 2 και 3.
Turtle Graphics
Παραμετρικές αναπαραστάσεις Εξίσωση: F(x, y) = x 2 +y 2 -r 2 = 0 Αναπαράσταση ευθ. τμήματος AB όπου Α (α x, α y ) και Β (β x, β y ) x(t) = α x + (β x -α x )t, y(t) = α y + (β y - α y )t Έλλειψη x(t) = α*cos(2πt), y(t) = β*sin(2πt)