Giải thuật sinh đƣờng trũn (Scan Converting Circles)(Bresenham)

Một phần của tài liệu Bài giảng Kỹ thuật đồ họa: Phần 1 (Trang 27 - 30)

Phƣơng trỡnh đƣờng trũn đi qua tõm cú toạ độ (xc,yc) là: (x - xc)2 + (y - yc)2 = r2

Hỡnh trũn là hỡnh đối xứng tỏm cỏch

Hỡnh 2.9 Hỡnh trũn đối xứng 8 phần

Để đơn giản ta xột tõm trựng gốc 0 thỡ phƣơng trỡnh đơn giản : x2

+ y2 = r2 Ta xột cỏc điểm tạo ra từ gúc phần tƣ thứ 2: từ 900 đến 450 , thực hiện theo hƣớng +x, -y 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ỏc giải thuật sinh thực thể cơ sở

Hỡnh 2.10 Mụ tả giải thuật Bresenham

Giả sử bắt đầu xi vậy xi+1 = xi +1 y2 = r2 - (xi +1)2

d1 = yi2 - y2 = yi2 - r2 - (xi +1)2

d2 = y2 - (yi - 1)2 = r2 - (xi +1)2 - (yi - 1)2 pi = d1 - d2 = 2(xi +1 )2 + yi2 + (yi - 1)2 -2r2

Xột: pi <0 (d1<d2) chọn điểm nằm ngoài đƣờng trũn yi+1 = yi pi >=0 (d1>=d2) chọn điểm nằm trong đƣờng trũn yi+1 = yi +1 pi = 2(xi +1 )2 + 2yi2 - 2yi 1 - 2r2

pi+1 = 2(xi +2 )2 + 2yi+12 - 2yi+1 + 1 - 2r2 pi+1 = pi + 4xi +6 + 2yi+12 - 2yi2- 2yi+1 + 2yi pi+1 = pi + 4xi +6 + 2(yi+12 - yi2 )- 2(yi+1 - yi )

Nếu pi <0 hay yi+1 = yi pi+1 = pi + 4xi +6

Nếu pi >=0 hay yi+1 = yi -1

pi+1 = pi + 4xi +6 - 4yi + 2 + 2 pi+1 = pi + 4(xi - yi ) + 10

Tớnh P1 ? khi đú ứng với x1=0 và y1 =r p1 = 2(x1 +1)2 + y12 + (y1 - 1)2 -2r2 = 2 + r2 + (r-1)2 - 2r2= 3 - 2r Giải thuật là:

: Cỏc giải thuật sinh thực thể cơ sở

Hỡnh 2.11 Sơ đồ khối giải thuật Bresemham cho đƣờng trũn

void Bre_circle(int xc, int yc, int Radius, int color)

{ int x, y, p; x = 0; y = Radius; p = 3 - 2 * Radius; while (x <= y) { putpixel(xc + x, yc + y, color); if (p < 0) p += 4 * x + 6; else { p += 4 * (x-y) + 10; y--; } x++;} }

Cõu hỏi: lỳc sử dụng tớnh đối xứng cho tỏm cỏch để vẽ một đƣờng trũn đầy đủ từ cỏc toạ độ pixel đƣợc tạo ứng với gúc phần tƣ thứ hai. Một vài Pixel đƣợc vẽ hai lần, hiện tƣợng này gọi là Overstrike. Hóy chỉ định xem nơi nào xảy ra hiện tƣợng đú?

Trả lời: Tại (r,0) hoặc (0,r) và vị trớ đƣờng chộo: (r, r) trong đú  = 1/2  0.7071 /* Thuat toan Bresenham de ve duong tron */

#include <graphics.h> #include <conio.h>

#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 = 3 - 2 * Radius;

pc(xc,yc, Radius,0); //ve 4 diem dac biet while (x < y){ if (d < 0) p += 4 * x + 6; else{ p += 4 * (x-y) + 10; Bắt đầu X=0; y=r; p=3-2r; Putpixel(x,y,c); p<0 p=p+4x+6; X<r X++ p=p-4y+4x+10 y-- d2

: Cỏc giải thuật sinh thực thể cơ sở y--; } x++; pc(xc,yc, x,y); pc(xc,yc, y,x); }

pc(xc,yc, y,y); // ve 4 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(); }

Một phần của tài liệu Bài giảng Kỹ thuật đồ họa: Phần 1 (Trang 27 - 30)