Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 60 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
60
Dung lượng
1,51 MB
Nội dung
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