Thông tin tài liệu
KỸ THUẬT ĐỒ HỌA Chương CÁC GIẢI THUẬT SINH THỰC THỂ CƠ SỞ Giải thuật sinh đường thẳng thông thường Giải thuật thông thường: void dline(int x1,int y1, int x2,int y2, int color) { float y; int x; for (x=x1; x điểm B chọn yi+1 = yi d < điểm A chọn yi+1 = yi + Trường hợp d = chọn điểm A, B Sử dụng phương pháp biểu diễn không tường minh f(x,y)= ax +by +c =0 (1) dx =x 2-x1 dy =y2-y1 Biểu diễn tường minh: y= (dy/dx)x +B hay f(x,y)=0= xdy - ydx +Bdx (2) So sánh (1) (2) ta có a=dy, b=-dx c= Bdx Có f(x,y)=0 với (x,y) thuộc đường thẳng Đặt di=f(xi+1,yi+1/2) = a(xi+1) +b(yi +1/2) +c Nếu chọn A (d0) M tăng theo x di+1=f(xi+2,yi+1/2) = a(xi+2) +b(yi +1/2) +c di+1 - di = a Hay di+1 = di + dy Tính d1 ? d1 = f(x1+1,y1+1/2) = a(x1+1) +b(y1 +1/2) +c = ax1 +by1 +c +a +1/2 b = f(x1,y1) +a +b/2 Có (x1,y1) điểm bắt đầu, nằm đoạn thẳng nên f(x1,y1) = Vậy d1 = a+ b/2 = dy - dx/2 Giải thuật sinh đường tròn_Bresenham /* Thuat toan Bresenham de ve duong tron */ #include #include #define pc(xc,yc,x,y) { putpixel(xc + x, yc + y, color); putpixel(xc x, yc y, color); putpixel(xc -y, yc +x, color); putpixel(xc +y, yc -x, color); } void Bresenham_Circle(int xc, int yc, int Radius, int color){ int x, y, p; x = 0; y = Radius; p = - * Radius; pc(xc,yc, Radius,0); //ve diem dac biet while (x < y){ if (d < 0) p += * x + 6; else{ p += * (x-y) + 10; y ; } x++; pc(xc,yc, x,y); pc(xc,yc, y,x); } pc(xc,yc, y,y); // ve diem phan giac x=y } void main(){ int gr_drive = DETECT, gr_mode; initgraph(&gr_drive, &gr_mode, ""); Bresenham_Circle(getmaxx() / 2, getmaxy() / 2, 150, 4); getch(); closegraph(); } 10 Câu 5: Giải thuât Midpoint sinh đương tròn Thuât toán: Void Mid_circle ( int xc, int yc, int Radius, int color) { Int x,y,d; X=0; Y=Radius; D=1-Radius; While (x
Ngày đăng: 01/07/2016, 17:53
Xem thêm: kỹ thuật đồ họa