Đồ họa máy tính - Các thuật toán vẽ đường - Pdf 18

TH- ðỒ HỌA MÁY TÍNH 1 GVHD: Huynh Duc Nghia

CÁC THUẬT TOÁN VẼ ðƯỜNG
Bài 1 :

Mục tiêu :
Bài thực hành cho biết cách dùng
hàm InitGraph khởi tạo chế ñộ ñồ họa
hàm closegraph

ngưng làm việc trên chế dộ ñồ họa
hàm putpixel(x,y,color) vẽ một ñiểm ảnh tại vị trí x, y với màu color
hàm getpixel(x,y) trả về giá trị màu sắc tại vị trí x, y

Xây dựng hàm khởi tạo chế ñộ ñồ họa#include <graphics.h>
void InitGraph()
{
int gd=DETECT,gm; //Khai báo 2 biến gd và gm kiểu số nguyên
initgraph(&gd,&gm,"C:\\NGHIA\\THUCHANH\\DOHOA\\TC\\BGI"); // Goi hàm khởi tạo ñồ
họa
}

Cấu trúc một chương trình ñồ họa thông thườngvoid main ()
{
Inputdata(); // Nhập dữ liệu cho chương trình – Tọa ñộ của một ñiểm, bán kính

} Bài 2: Viết hàm main() vẽ hình chữ nhật và hình tròn
Gợi ý : Dùng hàm line() hoặc rectangle() và circle() do chương trình C cung cấp.
ðường thẳng, hình vuông, hình tròn ñược vẽ như thế nào?

Bài 3: Cài ñặt giải thuật vẽ ñường thẳng bằng thuật toán thô, vẽ ñường thẳng có các tọa ñộ x1 = 150, y1 =
150, x2 = 250, y2 = 200 và màu tùy ý.
Gợi ý: tạo hàm DT(x1,y1,x2,y2,Color)
- Vẽ ñiểm ñầu tiên (x1,y1)
- Tính hệ số góc m và hệ số b
- ðiểm tiếp theo cho ñến ñiểm (x2,y2) , dùng:
for (int x=x1; x<x2; x++)
{ y=m*x+b;
putpixel(x,Round(y),Color);
}
Chương trình minh hoa

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

#define Round(a) int(a+0.5)

void Line(int x1, int y1, int x2, int y2)
{
putpixel(x1,y1,RED);
float m=(float)(y2-y1)/(x2-x1);
float b=y1-m*x1;

float y = y1;
float m = float(y2-y1)/(x2-x1);
putpixel(x, Round(y), Color);
for(int i=x1; i<x2; i++)
{
x++;
y +=m;
putpixel(x, Round(y), Color);
}
} // LineDDA

Yêu cầu
:
- Hãy dùng giải thuật trên vẽ hình vuông , chữ nhật, tam giác, tứ giác, da giác lồi, lõm.
- Cài ñặt thuật toán DDA với m>1, vẽ ñường thẳng, có các tọa ñộ x1 = 100, y1 = 100, x2 = 200, y2
= 300 và màu tùy ý (ðối xứng TH với 0<m<1) Bài 5: Cài ñặt thuật toán Bresenham, Dùng thuật toán Bresenham vẽ ñường thẳng như bài 3
Giải thuật: (với 0<m<1)
void LineBres1 (int x1, int y1, int x2, int y2, int Color)
{
int Dx, Dy, p, twoDy, twoDyDx, Const2;
int x, y;
Dx = x2 - x1;
Dy = y2 - y1;
twoDy = 2*Dy; // Dy <<1
twoDyDx = 2*(Dy-Dx); // (Dy-Dx) <<1
p = twoDy - Dx; // Dy <<1 - Dx
putpixel(x, y, Color);


Bài 6: Cài ñặt thuật toán vẽ ñường tròn MidPoint
// Ve 8 diem doi xung
void Put8Pixel(int x, int y, int Color)
{
putpixel(x, y, Color);
putpixel(y, x, Color);
putpixel(y, -x, Color);
putpixel(x, -y, Color);
putpixel(-x, -y, Color);
putpixel(-y, -x, Color);
putpixel(-y, x, Color);
putpixel(-x, y, Color);
} // Put8Pixel
void CircleMidPoint (int R)
{
int x, y;
x = 0;
y = R;
Put8Pixel(x, y,WHITE);
int p = 1 - R; //Tại sao ở ñây có số 1?
while (x < y)
{
if (p < 0)
p += 2*x + 3;
else
{
p += 2*(x -y) + 5;
y ;
}

{ y ;
p += 4*(x -y) + 10;
}
Put8Pixel(x, y,WHITE);
}
} // CircleBres

Yêu cầu:
- Dùng giải thuật trên vẽ ñường tròn.
- Vẽ ñường tròn tâm x
c
,y
c
bất kỳ.

Tự cài ñặt chương trình: vẽ ellipse, parabol, và một số ñường cong khác,… CÁC THUẬT TOÁN TÔ MÀU

Tô màu dựa theo ñường biên
Bài 1 : Cài ñặt giải thuật tô màu với lân cận 4.
Cài ñặt giải thuật:
void FloodFill4(int x, int y, int bc, int nc) //bc: back color, nc: new color
{
int color= getpixel(x,y);
if ((color != bc) && (color != nc))
{
putpixel(x,y,nc);
delay(30);

}
}
void RecTangle(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)
{
line(x1,y1,x2,y2);
line(x4,y4,x3,y3);
line(x1,y1,x4,y4);
line(x2,y2,x3,y3);
}
void InitGraph()
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"C:\\TC\\BGI");
}
void main()
{
InitGraph();
RecTangle(100,100,100,120,150,120,150,100);
FloodFill4(125,110,Color,RED);
getch();
closegraph();
}// End programing

Bài 2 : Cài ñặt giải thuật tô màu với lân cận chéo.
Cài ñặt giải thuật

void FloodFillD(int x, int y, int bc, int nc)
{
int color= getpixel(x,y);
if ((color != bc) && (color != nc))

Tô màu dựa theo dòng quét
Bài 1: Tô màu hình chữ nhật
Cài ñặt giải thuật

void ScanLineFillR(int l, int r, int t, int b, int color)
{
for (int y= t; y<=b; y++) LineDDA(l,y,r,y,color);
} Bài 2: Tô màu hình tam giác
Cài ñặt giải thuật (ðáy phẳng y2=y3)
void FillFlatBottom(int x1, int y1, int x2, int y2, int x3, int y3, int color)
{
float ml, mr, xl, xr;
ml = (float)(y2-y1)/(x2-x1);
mr = (float)(y3-y1)/(x3-x1);
xl=xr=x1;
for(int y=y1;y<=y2;y++)
{
xl += 1/ml;
xr += 1/mr;
LineDDA(round(xl),y,round(xr),y,color);
}
}

Cài ñặt giải thuật (ðỉnh phẳng y1= y2)

Ngược lại (y1#y2#y3): gọi cả 2 hàm ñáy phẳng và ñỉnh phẳng.

Tự làm: Tô màu ña giác lồi, tứ giác


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status