Cách tính p thuật toán vẽ đg thẳng brenham năm 2024

Tuy nhiên do lý do làm tròn liên tục y và giá trị làm tròn đó lại được lưu lại để tính toán tiếp nên đường thẳng vẽ bằng thuật toán này không chính xác. Ta có thể quan sát sự khác biệt giữa thuật toán này và DDA với cùng 1 hệ các đường thẳng.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

# sử dụng thuật toán Breshenham để vẽ đường thẳng

include

int colorRedBlue \= BLUE;

void lineBresenham(int x1, int y1, int x2, int y2){

int x, y, Dx, Dy, p;

Dx \= abs(x2 - x1);

Dy \= abs(y2 - y1);

p \= 2*Dy - Dx;

x \= x1;

y \= y1;

int x_unit \= 1, y_unit \= 1;

xét trường hợp để cho y_unit và x_unit để vẽ tăng lên hay giảm xuống

if (x2 - x1 < 0)

x_unit \= -x_unit;

if (y2 - y1 < 0)

y_unit \= -y_unit;

if (x1 \== x2) // trường hợp vẽ đường thẳng đứng

{

while (y != y2+1)

{

delay(10);

y += y_unit;

putpixel(x, y, colorRedBlue);

}

}

else if (y1 \== y2) // trường hợp vẽ đường ngang

{

while (x != x2+1)

{

delay(10);

x += x_unit;

putpixel(x, y, colorRedBlue);

}

}

// trường hợp vẽ các đường xiên

else{

putpixel(x, y, colorRedBlue);

while(x != x2){

delay(10);

if (p<0) p += 2*Dy;

else{

p += 2*(Dy-Dx);

y += y_unit;

}

x += x_unit;

putpixel(x, y, colorRedBlue);

}

}

}

int main(){

int gd,gm\=VGA; gd\=DETECT;

initgraph(&gd,&gm,NULL);

setbkcolor(WHITE);

lineBresenham(200,200,50,60);

lineBresenham(200,200,50,200);

lineBresenham(200,200,50,300);

lineBresenham(200,200,200,400);

lineBresenham(200,200,300,400);

lineBresenham(200,200,300,200);

lineBresenham(200,200,400,60);

lineBresenham(200,200,200,60);

getchar();

return 0;

}