1. Trang chủ
  2. » Giáo Dục - Đào Tạo

kỹ thuật đồ họa

29 144 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 29
Dung lượng 295,43 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

 Sai số tích lũy do việc cộng số thực m vào y, điểm vẽ chệch hướng với đường thẳng thực khi đường thẳng vẽ quá dài..  Tốc độ vẫn chậm sử dụng cộng số thực, làm tròn.Có thể khắc phục th

Trang 1

CÁC THUẬT TOÁN VẼ ĐƯỜNG THẲNG:

Xét đoạn thẳng có hệ số góc 0 < m < 1 và x >0

Một đường thẳng có thể xác định nếu biết 2 điểm thuộc nó.Phương trình đường thẳng đi qua 2 điểm (x1, y1) và (x2,y2) có dạng sau:

hay ở dạng tương đương : (x - x1)(y2 -y1) = (y -y1)(x2 -x1)

Khai triển ta có dạng : y = mx + b, trong đó:

m = Dy/Dx , Dy = y2 - y1 , Dx = x2 - x1 , b = y1 - mx1

Đây được gọi là phương trình đoạn chắn của đường thẳng

Nếu khai triển dưới dạng : (y2 - y1 )x - (x2 - x1)y - x1y2 + x2y1 = 0

và đặt A = (y2 - y1 ) , B = - (x2 - x1), C = - x1y2 + x2y1 thì phương trình đường thẳng

sẽ có dạng : Ax + By + C = 0, dạng này được gọi là phương trình tổng quát của đường thẳng

1 ĐƯỜNG THẲNG BẰNG THUẬT TOÁN DDA.

a.Trình bày cơ sở toán học.

Cho phương tình đường thẳng d: y =mx + b

m = (y2 - y1)(x2 - x1) và b = y1 - mx1

Trang 2

• Giả sử ta vẽ được (xi,yi).

• Tiếp theo, chọn yi+1 là yi hay yi + 1 dựa vào phương trình của đường thẳng

• Thay xi +1 vào phương trình đường thẳng d :

• yi+1 = m(xi +1) + b = mxi +b +m = yi + m

b Viết thủ tục thuật toán :

#define Round (a) Int (a + 0,5)

int color = GREEN;

void LineDDA ( int x1,int y1, intx2, int y2)

{ int x = x1;

float y = y1;

float m = float(y2 - y1)/(x2 - x1);

putpixel( x, Round (y) , Color);

for(int i=x1; i < x2; i++)

Trang 3

c.Nhận xét thuật toán và giải thích thuật toán.

 Cải thiện tốc độ: Sử dụng công thức yi+1 = yi + m thay cho y = mx + b, tránh phép nhân số thực

 Sai số tích lũy do việc cộng số thực m vào y, điểm vẽ chệch hướng với đường thẳng thực khi đường thẳng vẽ quá dài

 Tốc độ vẫn chậm (sử dụng cộng số thực, làm tròn).Có thể khắc phục thao tắc cộng số thực m và làm tròn thuật toán bằng cách nhận xét m

= Dx/Dy với Dx, Dy là các số nguyên

Trang 5

Gọi (xi + 1, y ) là điểm thuộc đoạn thẳng Ta có y = m(xi +1) + b

Đặt : d1= y - yi d2 = (yi +1) - y

Xét tất cả các vị trí tương đối của yi và yi +1, việc chọn điểm (xi+1,yi+1) là S hay P phụ thuộc vào việc so sánh d1 và d2 hay dấu của d1 - d2:

Xét pi = Dx(d1 - d2) = Dx(2y - 2yi - 1) > pi = Dx[ 2(m(xi+1) +b ) - 2yi - 1 ]

Thay m = Dy/Dx vào phương trình trên ta được :

Nhận xét rằng do Dx > 0 nên dấu của biểu thức d1 - d2 cũng chính là dấu của pi hay nói một cách khác, nếu tại bước thứ i ta xác dịnh được dấu của pi thì xem như

ta xác định được điểm cần chọn ở bước (i + 1) Vấn đề còn lại là làm thế nào để tính được pi tại mỗi bước thật nhanh

Ta có : p - p = (2Dyx - 2Dxy +c) - (2Dyx - 2Dxy +c)

Trang 6

< > pi+1 - pi = 2Dy(xi+1 - xi) - 2Dx(yi+1 - yi) = 2Dy - 2Dx(yi+1 - yi), do xi+1 = xi +1

Từ đây ta có thể suy ra cách tính pi+1 từ pi như sau :

• Nếu pi < 0 thì pi+1 = pi + 2Dy do ta chọn yi+1 = yi

• Ngược lại , nếu pi+1 >= 0 thì pi+1 = pi + 2Dy - 2Dx, do ta chọn yi+1 = yi +1.Giá trị của p0 được tính từ điểm vẽ đầu tiên (x0,y0) theo công thức :

p 0 = 2Dyx 0 - 2Dxy 0 +c = 2Dyx 0 - 2Dxy 0 + 2Dy - (2b -1)Dx

Do (x0,y0) là điểm nguyên thuộc về đoạn thẳng nên ta có

y0 = mx0 + b =(Dy/Dx)x0 + b Thế vào phương trình trên ta suy ra được

p 0 = 2Dy -Dx

b.Viết thủ tục thuật toán.

Đâyỳ đủ chạy được :

#define PATH "D:\\BORLANDC\\BGI"

void LineBres(int x1, int y1, int x2, int y2,int color)

int Dx, Dy, p, Const1, Const2;

Trang 7

Cài bằng minh họa thuật toán thuật toán bằng Bresenham:

void LineBres( int x1, int y1, int x2, int y2)

{

int Dx,Dy,p,Const1, Const 2;

Trang 8

intx, inty;

Dx = x2 - x1;

Dy = y2 - y1;

p = 2*Dy - Dx; // Dy << 1 -Dx

Const1 = 2*Dy; //Dy <<1

Const2 = 2*(Dy - Dx);//(Dy - Dx) << 1

Trang 9

• Thuật toán Bresenham chỉ làm việc trên số nguyên và các thao tác trên số nguyên chỉ là phép cộng và phép dịch bit( phép nhan 2) điều này là một cải tiến tăng tốc độ đáng kể so với thuật toán DDA.Ý tưởng chính của thuật toánnằm ở chỗ xét dấu pi để quyết định điểm kế tiếp, và sử dụng công thức truy hồi pi+1 - pi để tính pi bằng các phép toán đơn giản trên các số nguyên.

• Thuật toán này cho kết quả tương tự như thuật toán DDA

Trang 10

3.Đường thẳng midPoint.

a.Trình bày cơ sở toán học.

Trang 11

Thuật toán Midpoint đưa ra cách chọn yi+1 là yi hay yi+1 bằng cách so sánh điểm thực Q(xi+1.y) với điểm Midpoint trung điểm S và P ta có :

• Nếu điểm Q nằm dưới điểm Midpoint, ta chọn S

• Ngược lại nếu điểm Q nằm tren điểm Midpoint ta chọn P

Ta có phương trình tổng quát của đường thẳng : Ax + By + C = 0

với A = y2 - y1, B = -(x2 - x1) , C = x2y1 - x1y2

Đặt F(x,y) = Ax + By + C, ta có nhận xét:

• F(x,y) < 0 nếu (x,y) nằm phía trên đường thẳng

• F(x,y) = 0 nếu (x,y) thuộc về đường thẳng

• F(x,y) > 0 nếu (x,y) nằm phía dưới đường thẳng

Lúc này việc lựa chọn các điểm S,P ở trên được đưa về việc xét dấu của

pi = 2F(Midpoint) = 2F( xi +1, yi + 1/2 )

• Nếu pi <0 , điểm Midpoint nằm phía trên đoạn thẳng Lúc này điểm thực Q nằm dưới điểm Midpoint nên ta chọn S, tức là yi+1 = yi

Trang 12

• Ngược lại, điểm Midpoint nằm phía dưới đoạn thẳng Lúc này điểm thực Q nằm trên điểm Midpoint nên ta chọn P, tức là yi+1 = yi +1.

Mặt khác :

pi+1 - pi = 2F(xi+1 +1, yi+1 +1/2 ) - 2F(xi +1, yi + 1/2)

= 2[A(xi+1 +1) + B(yi+1 +1/2 ) + C ] - 2[A(xi +1) + B(yi + 1/2) +C] = 2A +2B(yi+1 - yi) = 2Dy -2Dx(yi+1 - yi)

Vây:

• pi+1 = pi + 2Dy, nếu pi < 0 do ta chọn yi+1 = yi

• pi+1 = pi + 2Dy - 2Dx, nếu pi >= 0 do ta chọn yi+1 = yi + 1

Ta tính giá trị p0 ứng với điểm ban đầu (x0, y0), với nhận xét rằng (x0, y0) là điểm thuộc về đoạn thẳng, tức là : Ax0 + By0 + C = 0

p0 = 2F(x0 +1, y0 +1/2 ) = 2[A(x0 +1) + B (y0 +1/2 ) + C]

> p0 = 2(Ax0 + By0 + C) + 2A +B = 2A + B = 2Dy - Dx

b.Viết thủ tục thuật toán.

1. void MidpointLine ( int x1 , int y1 , int x2 , int y2 )

Trang 13

c Nhận xét thuật toán và giải thích thuật toán.

• Thuật toán Midpoint chỉ làm việc trên số nguyên và các thao tác trên số nguyên chỉ là phép cộng và phép dịch bit( phép nhan 2) điều này là l một cảitiến tăng tốc độ đáng kể so với thuật toán DDA

• Thuật toán này cho kết quả tương tự như thuật toán Bresenham

Trang 15

ĐƯỜNG TRÒN

1.ĐƯỜNG TRÒN BRESENHAM:

a.Cơ sở toán học:

Xét đường tròn (C) tâm O(xc,yc) bán kính R

Phương trình tổng quáy của đường tròn có dạng:

Trang 16

Do tính đối xứng của đừng tròn nên nếu điểm thì các điểm(y,x), (-y,x), (-x,y), (-x,-y), (-y,-x), (y,-x), (x,-y) cũng thuộc (C) (Hình a):

 Phương trình đường tròn: y2 = R2 –x2

 Giả sử vẽ được điểm (xi,yi)

 Vấn đề: Chọn điểm tiếp theo

 Không thể là Q(xi+1,y)

 Mà là: S1(xi+1,yi) hoặc S2(xi+1,yi-1)

Trang 17

 Pi là tham số quyết định chọn S1 hoặc S2 dựa vào dấu của nó

Pi = (yi)2 -(R2- (xi + 1)2 )-((R2- (xi + 1)2)-(yi - 1))2

Pi = (yi)2 -R2+ (xi + 1)2-R2+ (xi + 1)2+(yi - 1)2

P i = (y i ) 2 -2R 2 + 2(x i + 1) 2 +(y i - 1) 2

Trang 18

Pi+1 = (yi+1)2 -2R2+ 2(xi+1 + 1)2+(yi+1 - 1)2

Pi+1 = 2(yi+1)2 -2R2+ 2(xi)2+8xi+8-2yi+1 + 1

Pi = (yi)2 -2R2+ 2(xi + 1)2+(yi - 1)2

Pi = 2(yi)2 -2R2+ 2 (xi)2 +4xi+ 2- 2yi+1

Pi+1 – Pi = 2(yi+1)2 -2R2+ 2(xi)2+8xi+8-2yi+1 + 1

-(2(yi)2 -2R2+ 2 (xi)2 +4xi+ 2- 2yi+1)Pi+1 – Pi = 2(yi+1)2 -2R2+ 2(xi)2+8xi+8-2yi+1 + 1

-2(yi)2 +2R2 - 2 (xi)2 -4xi- 2+ 2yi-1

P i+1 = P i +4x i +6+2((y i+1 ) 2 -y i 2 )-2(y i+1 -y i )

Trang 19

#include<iostream>

#include<math.h>

#include<dos.h>

#include<stdlib.h>

#define PATH "D:\\BORLANDC\\BGI"

void Bresenham_Circle(int xc, int yc, int Radius, int color) {

Trang 20

c Nhận xét thuật toán và giải thích thuật toán.

Thuật toán bresenham chỉ làm việc trên số nguyên và các thao tác trên số nguyên chỉ là phép cộng và phép dịch bit (phép nhân 2) điều này là 1 cái tiến làm tăng tốc

độ đáng kể so với thuật toán DDA Ý tưởng chính của thuật toán chính là ở chỗ xét

Trang 21

dấu Pi để quyết định điểm kế tiếp, và thực hiện các công thức truy hồi Pi+1 – Pi đểtinh Pi bằng các phép toán đơn giản trên số nguyên.

Thuật toán này cho kết quả tương tự như thuật toán DDA

2.ĐƯỜNG TRÒN MIDPOINT:

Trang 22

 Do tính chất đối xứng của đường tròn Ta vẽ 1/8 đường tròn, sau đó lấy đốixứng các điểm còn lại

 Giả sử đã vẽ được điểm (xp,yp)

 Vấn đề: Phải chọn điểm tiếp theo là E hay SE

Trang 23

 Phương trình đường tròn

F(x,y)=x2+y2-R2

 Cơ sở toán học

 F(x,y) <0 nếu (x,y) nằm trong đường tròn

 F(x,y) = 0 nếu (x,y) thuộc đường tròn

 F(x,y) >0 nếu (x,y) nằm ngoài đường tròn

 = 2xᵢ + 3 + (()²+ (yᵢ)² ) - ( - yᵢ)

 Nếu Pi <0 :chọn= yᵢ Khiđó Pi+1 = Pi + 2xᵢ+3

 Pi >= 0: chọn= yᵢ - 1 Khiđó Pi+1 = Pi + 2xᵢ - 2yᵢ+5Pi ứngvớiđiểm ban đầu( x˳ , y˳ ) = (0,R) là:

 P˳ = F(x˳ + 1, y˳- 1/2) = F(1, R - 1/2) = 5/4 -R

b.Cài đặt chương trình

Trang 24

minh họa thuật toán midpoint:

Procedure DTR(xc, yc, r, mau : integer);var x, y, p : integer ;

Trang 25

void pc(intxc,intyc,intx,inty,int color) {putpixel(x+xc,y+yc,color);

//goi 2 lan ham// pc(xc,yc, x,y,color);

pc(xc,yc, y,x,color);

}// bogoi ham nay di// pc(xc,yc, y,y,color);

}

int main(){

Trang 26

intg_x, g_y, r, color;

c Nhận xét thuật toán và giải thích thuật toán

• thao tác với số nguyên

• Thực hiện các phép toán cộng , trừ , nhân chia

• Vẽ 8 điểm

• Tốc độ cao, tiết kiệm bộ nhớ

Trang 27

3 LÀM TRÒN TỌA ĐỘ ĐIỂM:

a.Cơ sở toán học :

 Phương trình đường tròn có tâm tại gốc tọa độ, bán kính r :

Trang 28

b.Cài đặt thuật toán:

Procedure Circle (xc, yc, R : integer) ;

Var x, y : integer ;

Procedure DOIXUNG ;

Ngày đăng: 21/04/2016, 15:06

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w