230 likes | 360 Views
CS U540 Computer Graphics. Prof. Harriet Fell Spring 2009 Lecture 19 – February 12, 2009. Vectors. A vector describes a length and a direction. a zero length vector. a. b. 1. a unit vector. a = b. a. -d. d. c. Vector Difference. a. -a. Vector Operations. b. b+a. a. c-d. b.
E N D
CS U540Computer Graphics Prof. Harriet Fell Spring 2009 Lecture 19 – February 12, 2009
Vectors • A vector describes a length and a direction. a zero length vector a b 1 a unit vector a = b
a -d d c Vector Difference a -a Vector Operations b b+a a c-d b Vector Sum
Cartesian Coordinates • Any two non-zero, non-parallel 2D vectors form a 2D basis. • Any 2D vector can be written uniquely as a linear combination of two 2D basis vectors. • x and y (or i and j) denote unit vectors parallel to the x-axis and y-axis. • x and y form an orthonormal 2D basis. a = xax + yay a =( xa, ya) or • x, y and z form an orthonormal 3D basis. or a =(ax,ay)
Vector Length Vector a =( xa, ya ) ||a|| ya a xa
a b Dot Product Dot Product a =( xa, ya ) b =( xb, yb ) ab = xa xb + ya yb ab = abcos() xa= acos(+) xb= bcos() xa= asin(+) xb= bsin()
a b ab Projection a =( xa, ya ) b =( xb, yb ) ab = abcos() The length of the projection of a onto b is given by
3D Vectors This all holds for 3D vectors too. a =( xa, ya, za ) b =( xb, yb, zb ) ab = xa xb + ya yb + za zb ab = abcos()
Vector Cross Product axb axb is perpendicular to a and b. Use the right hand rule to determine the direction of axb. b a Image from www.physics.udel.edu
b ||a|| a Cross Product and Area axb b a ||a||x||b|| = area pf the parallelogram.
b (1-t)L tL L a Linear Interpolation • LERP: /lerp/, vi.,n. • Quasi-acronym for Linear Interpolation, used as a verb or noun for the operation. “Bresenham's algorithm lerps incrementally between the two endpoints of the line.” p = (1 – t) a + t b = a + t(b – a)
t = 1 t = .75 t = .5 t = .25 t = 0 Lerp Demo p = (1 – t) a + t b = a + t(b – a) b L a
Triangles a If (x, y) is on the edge ab, (x, y) = (1 – t) a + t b = a + t(b – a). Similar formulas hold for points on the other edges. If (x, y) is in the triangle: (x, y) = a + b + c + + = 1 ( , , ) are the Barycentriccoordinates of (x, y). (x,y) c b
Triangles p = a + (b-a) + (c-a) = 2 = 1 = 0 = -1 = 2 p = (1- - )a + b + c = 1- - p = p(, ,) = a + b + c = 1 c c-a = 0 b b-a a Barycentric coordinates = -1 = 0 = 1
(x,y) (x,y) ComputingBarycentric Coordinates a b c
Barycentric Coordinates as Areas a (x,y) where A is the area of the triangle. + + = 1 c b
3D Triangles a This all still works in 3D. (x,y,z) where A is the area of the triangle. + + = 1 c b But how do we find the areas of the triangles?
3D Triangles - Areas axb B b C a A
Triangle Assignment http://www.ccs.neu.edu/home/fell/CSU540/programs/CSU540ColorTriangle.html
Portable Pixmap Format (ppm) A "magic number" for identifying the file type. • A ppm file's magic number is the two characters "P3". • Whitespace (blanks, TABs, CRs, LFs). • A width, formatted as ASCII characters in decimal. • Whitespace. • A height, again in ASCII decimal. • Whitespace. • The maximum color value again in ASCII decimal. • Whitespace. • Width * height pixels, each 3 values between 0 and maximum value. • start at top-left corner; proceed in normal English reading order • three values for each pixel for red, green, and blue, resp. • 0 means color is off; maximum value means color is maxxed out • characters from "#" to end-of-line are ignored (comments) • no line should be longer than 70 characters
ppm Example P3 # feep.ppm 4 4 15 0 0 0 0 0 0 0 0 0 15 0 15 0 0 0 0 15 7 0 0 0 0 0 0 0 0 0 0 0 0 0 15 7 0 0 0 15 0 15 0 0 0 0 0 0 0 0 0
private void saveImage() { String outFileName = “my.ppm"; File outFile = new File(outFileName); int clrR, clrG, clrB; try { PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(outFile))); out.println("P3"); out.print(Integer.toString(xmax-xmin+1)); System.out.println(xmax-xmin+1); out.print(" "); out.println(Integer.toString(ymax-ymin+1)); System.out.println(ymax-ymin+1); out.println("255"); for (int y = ymin; y <= ymax; y++){ for (int x = xmin; x <= xmax; x++) { // compute clrR, clrG, clrB out.print(" "); out.print(clrR); out.print(" "); out.print(clrG); out.print(" "); out.println(clrB); } } out.close(); } catch (IOException e) { System.out.println(e.toString()); } }