KHoa CNTT-DDHBK Hà nội hunglt@it-hut.edu.vn 0913030731 1 (c) SE/FIT/HUT 2002 Bài 2: Các giảithuật sinh các thực thể cơ sở Le Tan Hung hunglt@it-hut.edu.vn 0913030731 (c) SE/FIT/HUT 2002 2 Giảithuậtxâydựng các thựcthể cơ sở Giảithuậtsinhđường thẳng – Line Giảithuậtsinhđường tròn - Circle Giảithuật VanAken sinh Ellipse Giảithuậtsinhđagiác Giảithuậtsinhkýtự (c) SE/FIT/HUT 2002 3 Rờirạchoáđiểm ảnh (Scan Conversion rasterization) Là tiếntrìnhsinhcácđốitượng hình họccơ sở bằng phương pháp xấpxỉ dựatrênlưới phân giảicủamànhình Tính chất các đốitượng cần đảmbảo: smooth continuous pass through specified points uniform brightness efficient (c) SE/FIT/HUT 2002 4 Biểudiễn đoạnthẳng Biểudiễntường minh (y-y1)/( x-x1) = ( y2-y1)/( x2-x1)1 y = kx + m k = (y2-y1)/( x2-x1) m = y1- kx1 Δy = k Δx Biểudiễn không tường minh (y2-y1)x - (x2-x1)y + x2y1 - x1y2 = 0 hay rx + sy + t = 0 s = -(x2-x1 ) r = (y2-y1) và t = x2y1 - x1y2 Biểudiễnthambiến P(u) = P1 + u(P2 - P1) u [0,1] X = x1 + u( x2 - x1 ) Y = y1 + u( y2 - y1 ) m P(x 1 , y 1 ) P(x 2 , y 2 ) u (c) SE/FIT/HUT 2002 5 Thuật toán DDA (Digital Differential Analizer) Giảithuật DDA Với 0 < k < 1 x i+1 = x i + 1 y i+1 = y i + k với i=1,2,3 Thuậttoán ddaline (x1, y1, x2, y2) x1, y1, x2, y2 : tọa độ 2 điểm đầucuối k : hệ số góc x,y,m :biến begin m =(x2-x1)/(y2-y1); x = x1; y = y1; k = 1/m; putpixel(x,y); while x<x2 begin x = x+1; y = y+k; putpixel(round(x),round(y)); end; end; Giảithuật thông thường DrawLine(int x1,int y1, int x2,int y2, int color) { float y; int x; for (x=x1; x<=x2; x++) { y = y1 + (x-x1)*(y2-y1)/(x2-x1) WritePixel(x, Round(y), color ); }} (c) SE/FIT/HUT 2002 6 Giảithuật Bresenham 1960 Bresenham thuộcIBM điểmgầnvới đường thẳng dựa trên độ phân giai hưuhạn loạibỏđược các phép toán chia và phép toán làm tròn như ta đãthấytronggỉai thuật DDA Xét đoạnthẳng với 0 < k < 1 012 0 1 2 d2 d1 KHoa CNTT-DDHBK Hà nội hunglt@it-hut.edu.vn 0913030731 2 (c) SE/FIT/HUT 2002 7 Giảithuật Bresenham d 2 = y - yi = k(xi +1) + b - yi d 1 = yi+1 - y = yi + 1 - k(xi + 1) - b If d 1 ≤ d 2 => y i+1 = yi + 1 else d 1 > d 2 => y i+1 = yi D = d 1 -d 2 = -2k(xi + 1) + 2yi - 2b + 1 Pi = ΔxD = Δx (d 1 -d 2 ) d1 d2 x i x i +1 y i y i +1 (c) SE/FIT/HUT 2002 8 Pi = -2Δyxi + 2Δxyi + c P i+1 -P i = -2Δy(x i+1 - xi) + 2Δx(yi +1 -yi) NếuPi ≤ 0 ⇒ yi +1 = yi + 1 Pi +1 = Pi - 2Δy + 2Δx Nếu Pi > 0 ⇒ yi +1 = yi Pi +1 = Pi - 2Δy P 1 = Δx(d 1 -d 2 ) P 1 = -2Δy + Δx Giảithuật Bresenham (c) SE/FIT/HUT 2002 9 y i+1 M ( x i , y i ) x i x i+1 Giảithuật trung điểm-Midpoint Jack Bresenham 1965 / Pitteway 1967 VanAken áp dụng cho việc sinh các đường thẳng và đường tròn 1985 Các công thức đơngiảnhơn, tạo đượccácđiểm tương tự như với Bresenham d = F (xi + 1, yi + 1/2) là trung điểmcủa đoạn AB Việc so sánh, hay kiểmtraM sẽđược thay bằng việc xét giá trị d. Nếud > 0 điểmB đượcchọn, y i+1 = y i nếud < 0 điểmA đượcchọn. ⇒ y i+1 = y i + 1 Trong trường hợp d = 0 chúng ta có thể chọn điểmbấtkỳ hoặc A, hoặcB. A M B (c) SE/FIT/HUT 2002 10 Bresenham’s Algorithm: Midpoint Algorithm Sử dụng phương pháp biểudiễn không tường minh Tạimỗi trung điểmcủa đoạnthẳng giá trịđượctínhlà: Chúng ta gọi d i là biến quyết định củabướcthứ i 0= + + cbyax () () () iiii iiii iiii yxcbyax yxcbyax yxcbyax ,0 ,0 ,0 ⇒>++ ⇒<++ ⇒ = + + on line above line below line () cybxad iii + ⎟ ⎠ ⎞ ⎜ ⎝ ⎛ +++= 2 1 1 (c) SE/FIT/HUT 2002 11 Bresenham’s Algorithm: Midpoint Algorithm If d i > 0 then chọn điểm A⇒ trung điểmtiếptheosẽ có dạng: () bad cybxadyx i iiiii ++= + ⎟ ⎠ ⎞ ⎜ ⎝ ⎛ +++=⇒ ⎟ ⎠ ⎞ ⎜ ⎝ ⎛ ++ + 2 3 2 2 3 ,2 1 (c) SE/FIT/HUT 2002 12 Bresenham’s Algorithm: Midpoint Algorithm if d i < 0 then chọn điểm Bvà trung điểmmớilà Ta có: Ðiểm đầu () [] 2 2 1 1 2 1 ,1 b acbyax cybxadyx startstart startstartstartstartstart ++++= + ⎟ ⎠ ⎞ ⎜ ⎝ ⎛ +++=⇒ ⎟ ⎠ ⎞ ⎜ ⎝ ⎛ ++ () ad cybxadyx i iiiii += + ⎟ ⎠ ⎞ ⎜ ⎝ ⎛ +++=⇒ ⎟ ⎠ ⎞ ⎜ ⎝ ⎛ ++ + 2 1 2 2 1 ,2 1 Cx x y y xCc xxxb yyya startend startend + Δ Δ = ⎪ ⎭ ⎪ ⎬ ⎫ Δ= −=Δ−= −=Δ= where 2 0 b a ++= KHoa CNTT-DDHBK Hà nội hunglt@it-hut.edu.vn 0913030731 3 (c) SE/FIT/HUT 2002 13 Midpoint Line Algorithm dx = x_end-x_start dy = y_end-y_start d = 2*dy-dx x = x_start y = y_start while x < x_end if d <= 0 then d = d+(2*dy) x = x+1 else d = d+2*(dy-dx) x = x+1 y = y+1 endif SetPixel(x,y) endwhile initialisation choose B choose A (c) SE/FIT/HUT 2002 14 Giảithuật Bresenham's Midpoint d = a(xi + 1) + b(yi + 1/2) + c Nếu điểm đượcchọnlàB thiM sẽ tang theo x một đơnvị d i+1 = F(xi +2, yi + 1/2) = a(xi +2) + b(yi + 1/2) + c di = a(xi + 1) + b(yi + 1/2) + c Nếu điểmA đượcchọnthi` M tăng theo 2 hướng x và y với cùng một đơnvị. di + 1 = F (xi + 2, yi+ 3/2) = a(xi + 2) + b(yi +3/2) + c di + 1 = di + a + b. ¾ Với a + b = dy - dx. d <= 0 B¾t ®Çu x = x1 ; y = y1; dx = x2 - x1; dy = y2 - y1; d = dy - dx/2; Putpixel (x ,y); x < x2 KÕt thóc d = d + dy d = d + dy - dx y = y + 1 yes no No yes x = x + 1 (c) SE/FIT/HUT 2002 15 Sinh đường tròn Scan Converting Circles Implicit: f(x) = x 2 +y 2 -R 2 Explicit: y = f(x) Parametric: 22 yRx=± − cos sin xR yR θ θ = = If f(x,y) = 0 then it is on the circle. f(x,y) > 0 then it is outside the circle. f(x,y) < 0 then it is inside the circle. Usually, we draw a quarter circle by incrementing x from 0 to R in unit steps and solving for +y for each step. - by stepping the angle from 0 to 90 - avoids large gaps but still insufficient. (c) SE/FIT/HUT 2002 16 Midpoint Circle Algorithm Sử dụng phương pháp biểudiễn không tường minh trong giảithuật Thựchiệngiảithuậttrên1/8 đường tròn và lấy đốixứng xho các góc còn lại. Với d i là giá trị của đường tròn tại một điểmbấtkỳ ta có ( ) ( ) 0 2 22 =−−+− ryyxx cc ( ) () () circle outside is , if 0 circleon is , if 0 circle inside is , if 0 ⎪ ⎩ ⎪ ⎨ ⎧ > = < = ii ii ii i yx yx yx d (c) SE/FIT/HUT 2002 17 Midpoint Circle Algorithm As with the line, we determine the value of the decision variable by substituting the mid-point of the next pixel into the implicit form of the circle: If d i < 0 we choose pixel A otherwise we choose pixel B Note: we currently assume the circle is centered at the origin () 2 2 2 2 1 1 ryxd iii − ⎟ ⎠ ⎞ ⎜ ⎝ ⎛ −++= (c) SE/FIT/HUT 2002 18 Midpoint Circle Algorithm Again, as with the line algorithm, the choice of A or B can be used to determine the new value of d i+1 If A chosen then next midpoint has the following decision variable: Otherwise if B is chosen then the next decision variable is given by: () 32 2 1 2 2 1 ,2 2 2 2 1 ++= − ⎟ ⎠ ⎞ ⎜ ⎝ ⎛ −++=⇒ ⎟ ⎠ ⎞ ⎜ ⎝ ⎛ −+ + ii iiiii xd ryxdyx () 522 2 3 2 2 3 ,2 2 2 2 1 +−+= − ⎟ ⎠ ⎞ ⎜ ⎝ ⎛ −++=⇒ ⎟ ⎠ ⎞ ⎜ ⎝ ⎛ −+ + iii iiiii yxd ryxdyx KHoa CNTT-DDHBK Hà nội hunglt@it-hut.edu.vn 0913030731 4 (c) SE/FIT/HUT 2002 19 Midpoint Circle Algorithm If we assume that the radius is an integral value, then the first pixel drawn is (0, r) and the initial value for the decision variable is given by: Although the initial value is fractional, we note that all other values are integers. ⇒ we can round down: r rrrdr −= − ⎟ ⎠ ⎞ ⎜ ⎝ ⎛ +−+=⇒ ⎟ ⎠ ⎞ ⎜ ⎝ ⎛ − 4 5 4 1 1 2 1 ,1 22 0 rd −=1 0 (c) SE/FIT/HUT 2002 20 Midpoint Circle Algorithm d = 1-r x = 0 y = r while y < x if d < 0 then d = d+2*x+3 x = x+1 else d = d+2*(x-y)+5 x = x+1 y = y-1 endif SetPixel(c x +x,c y +y) endwhile initialisation choose B choose A Translate to the circle center stop at diagonal ⇒ end of octant (c) SE/FIT/HUT 2002 21 Scan Converting Ellipses 2a is the length of the major axis along the x axis. 2b is the length of the minor axis along the y axis. The midpoint can also be applied to ellipses. For simplicity, we draw only the arc of the ellipse that lies in the first quadrant, the other three quadrants can be drawn by symmetry 22 22 22 (, ) 0Fxybxayab=+−= (c) SE/FIT/HUT 2002 22 Scan Converting Ellipses: Algorithm Firstly we divide the quadrant into two regions Boundary between the two regions is the point at which the curve has a slope of -1 the point at which the gradient vector has the i and j components of equal magnitude 22 (, ) / / 2 2 g radFxy Fx Fy bx ay=∂ ∂ +∂ ∂ = +ijij A M tiep tuyen = -1 B gradient B C M i (c) SE/FIT/HUT 2002 23 Ellipses: Algorithm (cont.) At the next midpoint, if a 2 (y p -0.5)<=b 2 (x p +1), we switch region 1=>2 In region 1, choices are E and SE Initial condition: d init = b 2 +a 2 (-b+0.25) For a move to E, d new = d old +Delta E with Delta E = b 2 (2x p +3) For a move to SE, d new = d old +Delta SE with Delta SE = b 2 (2x p +3)+a 2 (-2y p +2) In region 2, choices are S and SE Initial condition: d init = b 2 (x p +0.5) 2 +a 2 ((y-1) 2 -b 2 ) For a move to S, d new = d old +Delta s with Delta s = a 2 (-2y p +3) For a move to SE, d new = d old +Delta SE with Delta SE = b 2 (2x p +2)+a 2 (-2y p +3) Stop in region 2 when the y value is zero. (c) SE/FIT/HUT 2002 24 Ký tự Bitmap Trên cơ sỏđịnh nghĩamỗikýtự với một font chư cho trướclàmột bitmap chữ nhậtnhỏ Font/typeface: set of character shapes fontcache các ký tự theo chuỗiliêntiếp nhau trong bộ nhớ Dạng cơ bản (thường N, nghiêng I, đậm B, nghiêng đậmB+I) Thuộctính Also colour, size, spacing and orientation ab KHoa CNTT-DDHBK Hà nội hunglt@it-hut.edu.vn 0913030731 5 (c) SE/FIT/HUT 2002 25 Cấutrúcfont chữ Typedef struct { int leftx, int width; } Char location; //Vị trí củatext Typedef struct { CacheId; Heiglit; // Độ rộng chữ CharSpace; // Khoảng cách giữacáckýtự Charlocation Table [128]; } fontcache (c) SE/FIT/HUT 2002 26 Ký tự vector Xây dựng theo phương pháp định nghĩa các ký tự bởi đường cong mềm bao ngoài của chúng. Tốnkémnhấtvề mặt tính toán Chất lượngcao (c) SE/FIT/HUT 2002 27 So sánh Đơngiảntrôngviệcsinhkýtự ( copypixel) Lưutrữ lớn Các phép biến đổi (I,B, scale) đòi hỏilưutrữ thêm Kích thước không dổi Phứctạp(Tínhtoánphương trình) Lưutrữ gọnnhẹ Các phép biến đổidựa vào các công thứcbiến đổi Kích thướcphụ thuôc vào môi trường ( ko có kích thướccố định) (c) SE/FIT/HUT 2002 28 Giải thuật đường quét sinh đa giác Polygon Scan Conversion Tồn tại rất nhiều giải thuật sinh đa giác. Mỗi giải thuật phục vụ cho 1 loại đa giác nhất định: some algorithms allow triangular polygons only others require that the polygons are convex and non self- intersecting and have no holes triangular convex non-convex self-intersecting religious (c) SE/FIT/HUT 2002 29 Polygon Scan Conversion Polygon scan conversion là giải thuật chung kinh điển cho các loại khác nhau Cho mỗi đoạn thẳng quét, chúng ta xác định các cạnh của đa giác cắt đoạn thẳng compute spans representing the interior portions of the polygons along this scan-line and fill the associated pixels. This represents the heart of a scan-line rendering algorithm used in many commercial products including Renderman and 3D Studio MAX. (c) SE/FIT/HUT 2002 30 Polygon Scan Conversion Dùng giảithuật (trung điểm) để xác định các điểmbiênchomỗi đagiác theo thứ tự tăng củax. Các diểmphải: Không bị chia sẻ bởicácđagiáclân cận Các đagiácchỉ toàn các điểmcạnh( điểmbiên) Đảmbảocácđagiácchiasẻđiểm biên mà không chia sẻ các điểm ảnh bên trong của mình. KHoa CNTT-DDHBK Hà nội hunglt@it-hut.edu.vn 0913030731 6 (c) SE/FIT/HUT 2002 31 Polygon Scan Conversion Thủ tục chung: Xác định giao của đường thẳng quét với cạnh đa giác Sắp xếp các giao điểm theo mức độ tăng dần của x value Điền các điểm ảnh vào giữa cặp các điểm x Need to handle 4 cases to prevent pixel sharing: if intersection has fractional x value, do we round up or down? • if inside (on left of span) round up, if outside (on right) round down what happens if intersection is at an integer x value? • if on left of span assume its interior otherwise exterior how do we handle shared vertices? • ignore pixel associated with y max of an edge how do we handle horizontal edges? • handled as a result of previous rule (lower edges not drawn) (c) SE/FIT/HUT 2002 32 Polygon Scan Conversion rounded down for A rounded up for B integer x value is on right = exterior y max not included horizontal edge removed (c) SE/FIT/HUT 2002 33 Polygon Scan Conversion Determining intersections with polygon edges is expensive rather than re-computing all intersections at each iteration, use incremental calculations i.e. if we intersect edge e on scan-line i then it is likely we will intersect the edge on scan-line i+1 (this is known as edge-coherence) Assume slope of the edge > 1 (other edges obtained via symmetries) incremental DDA calculation was: slope m is given by note that numerator and denominator are integral ⇒ we can use integer DDA. m xxyy iiii 1 ,1 11 +=+= ++ ( ) () startend startend xx yy m − − = (c) SE/FIT/HUT 2002 34 Giảithuật đường quét Scan-Line Algorithm The scan-line algorithm uses edge-coherence and incremental integer calculations for maximum efficiency: Tạobảng edge table (ET) tậpcủacáccạnh đagiáctheothứ tự giá trị y min của chúng Tạobảng active edge table (AET) tậpcáccạnh giao vớI đoạnthẳng quét scan-line Trong tiến trình quét các cạnh sẽ chuyểntừ ET ra AET. Các cạnh sẽởtrong AET cho đến khi giá trị y max củacạnh đạt tới = scanline Lúc nay cạnh sẽ bị loạirakhỏiAET. (c) SE/FIT/HUT 2002 35 Edge Table (ET) Note: line (8,6) → (13,6) has been deleted according to the scan rules y max x min numerator denominator scan-line (0,0) (15,15) 5 31 − =⇒ m (c) SE/FIT/HUT 2002 36 Active Edge Table (AET) y max current x denominator AET = current numerator round up round down KHoa CNTT-DDHBK Hà nội hunglt@it-hut.edu.vn 0913030731 7 (c) SE/FIT/HUT 2002 37 Scan-Line Algorithm y = y of first non empty entry in ET AET = null repeat move all ET entries in slot y to AET sort AET entries according to x min fill spans using pairs of AET entries for all AET members if y max = y then remove from AET y = y+1 for all AET members update numerator if numerator>denominator numerator=numerator-denominator x = x+1 until AET and ET empty . SE/FIT/HUT 20 02 4 Biểudiễn đoạnthẳng Biểudiễntường minh (y-y1)/( x-x1) = ( y2-y1)/( x2-x1)1 y = kx + m k = (y2-y1)/( x2-x1) m = y 1- kx1 Δy = k Δx Biểudiễn không tường minh (y2-y1)x - (x2-x1)y. by: () 32 2 1 2 2 1 ,2 2 2 2 1 ++= − ⎟ ⎠ ⎞ ⎜ ⎝ ⎛ −++=⇒ ⎟ ⎠ ⎞ ⎜ ⎝ ⎛ −+ + ii iiiii xd ryxdyx () 522 2 3 2 2 3 ,2 2 2 2 1 +−+= − ⎟ ⎠ ⎞ ⎜ ⎝ ⎛ −++=⇒ ⎟ ⎠ ⎞ ⎜ ⎝ ⎛ −+ + iii iiiii yxd ryxdyx KHoa CNTT-DDHBK. (x2-x1)y + x2y1 - x1y2 = 0 hay rx + sy + t = 0 s = -( x2-x1 ) r = (y2-y1) và t = x2y1 - x1y2 Biểudiễnthambiến P(u) = P1 + u(P2 - P1) u [0,1] X = x1 + u( x2 - x1 ) Y = y1 + u( y2 - y1 ) m P(x 1 ,