0% found this document useful (0 votes)
21 views10 pages

Tô Màu Đa Giác Bằng Đệ Quy và Hàng Đợi

The document discusses two algorithms for flood filling: recursive flood filling and queue-based flood filling. It explains the concepts behind both approaches and provides code examples in C++ to implement each method.

Uploaded by

Long Ngơ
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
21 views10 pages

Tô Màu Đa Giác Bằng Đệ Quy và Hàng Đợi

The document discusses two algorithms for flood filling: recursive flood filling and queue-based flood filling. It explains the concepts behind both approaches and provides code examples in C++ to implement each method.

Uploaded by

Long Ngơ
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd

Chương trình tô màu loang theo đệ quy:

#include <conio.h>
#include <winbgim.h>
#include <iostream>
using namespace std;
struct ToaDo
{
int x,y;
};
int MauNen;
void NhapDaGiac(int &n,int &x,int &y,ToaDo a[])
{
cout<<"Nhap so dinh cua da giac n= "; cin>>n;
for (int i=1;i<=n;i++)
{
cout<<"Toa do dinh P["<<i<<"].x= "; cin>>a[i].x;
cout<<"Toa do dinh P["<<i<<"].y= "; cin>>a[i].y;
}
cout<<"Nhap diem (x,y) thuoc da giac:\n";
cout<<"nhap x="; cin>>x;
cout<<"nhap y="; cin>>y;
}
void VeDaGiac(int n,ToaDo a[],int color)
{
setcolor(color);
for (int i=1;i<=n;i++)
{
int j;
if (i==n) j=1; else j=i+1;
line(a[i].x,a[i].y,a[j].x,a[j].y);
}
}
void ToLoang(int x,int y,int color)
{
if (getpixel(x,y)==MauNen && x<getmaxx() && y<getmaxy())
{
putpixel(x,y,color);
ToLoang(x-1,y,color);
ToLoang(x,y-1,color);
ToLoang(x+1,y,color);
ToLoang(x,y+1,color);
}
delay(1);
}
int main()
{
int x,y,n,Gd,Gm=VGAMAX;
ToaDo a[10];
NhapDaGiac(n,x,y,a);
Gd=DETECT;
initgraph(&Gd,&Gm,"");
VeDaGiac(n,a,15);
MauNen=getpixel(x,y);
ToLoang(x,y,10);
getch();
closegraph();
}
Chương trình tô màu loang theo hàng đợi:
#include <conio.h>
#include <winbgim.h>
#include <iostream>
#include <queue>
using namespace std;
struct ToaDo
{
int x,y;
};
int MauNen;
void NhapDaGiac(int &n,int &x,int &y,ToaDo a[])
{
cout<<"Nhap so dinh cua da giac n= "; cin>>n;
for (int i=1;i<=n;i++)
{
cout<<"Toa do dinh P["<<i<<"].x= "; cin>>a[i].x;
cout<<"Toa do dinh P["<<i<<"].y= "; cin>>a[i].y;
}
cout<<"Nhap diem (x,y) thuoc da giac:\n";
cout<<"nhap x="; cin>>x;
cout<<"nhap y="; cin>>y;
}
void VeDaGiac(int n,ToaDo a[],int color)
{
setcolor(color);
for (int i=1;i<=n;i++)
{
int j;
if (i==n) j=1; else j=i+1;
line(a[i].x,a[i].y,a[j].x,a[j].y);
}
}
void ToLoang(int x,int y,int color)
{
// Khai bao queue chua pixel chua duoc to mau
queue<ToaDo> Q;
ToaDo m, Tg;
if (getpixel(x,y)==MauNen && x<getmaxx() && y<getmaxy())
{
m.x = x;
m.y = y;
putpixel(m.x, m.y, color);
Q.push(m); // Them 1 diem vao queue, queue size tang 1
while(Q.empty() == false) //Xet 4 diem xung quanh voi moi diem luu
trong queue (neu queue con phan tu)
{
Q.pop();// Xoa 1 diem phia dau queue, queue size giam 1
//Xet cac diem lan can cua 1 diem
if(getpixel(m.x+1, m.y) == MauNen)
{
putpixel(m.x+1, m.y, color );
Tg.x = m.x+1;
Tg.y = m.y;
Q.push(Tg);// Them 1 diem vao cuoi queue
}
if(getpixel(m.x-1, m.y) == MauNen)
{
putpixel(m.x-1, m.y, color);
Tg.x = m.x-1;
Tg.y = m.y;
Q.push(Tg);
}
if(getpixel(m.x, m.y+1) == MauNen)
{
putpixel(m.x, m.y+1, color);
Tg.x = m.x;
Tg.y = m.y+1;
Q.push(Tg);
}
if(getpixel(m.x, m.y-1) == MauNen)
{
putpixel(m.x, m.y-1, color);
Tg.x = m.x;
Tg.y = m.y-1;
Q.push(Tg);
}
m = Q.front();// Dua ve gia tri dau tien cho hang doi
delay(1);
}
}
}
int main()
{
int x,y,n,Gd,Gm=VGAMAX;
ToaDo a[10];
NhapDaGiac(n,x,y,a);
Gd=DETECT;
initgraph(&Gd,&Gm,"");
VeDaGiac(n,a,15);
MauNen=getpixel(x,y);
ToLoang(x,y,10);
getch();
closegraph();
}

TRÌNH BÀY Ý TƯỞNG VÀ PHƯƠNG PHÁP TÔ MÀU THEO DÒNG


QUÉT

- Ý tưởng:
Giải thuật tô theo dòng quét (scan-line fill): tìm giao điểm của dòng
quét ngang với các cạnh của đa giác. Từ các giao điểm, xác định các đoạn
con nằm bên trong đa giác, rồi tô màu các đoạn con này.
- Phương pháp giải thuật:

Lưu đồ thuật toán:


Các bước thuật toán:
- Tìm ymin ymax lần lượt là giá trị lớn nhất và nhỏ nhất của tập các tung độ
của các đỉnh của đa giác đã cho.
- Ứng với mỗi dòng quét y = k với k thay đổi từ ymin đến ymax lặp;
- Tìm tất cả các hoành độ giao điểm của dòng quét y = k với các cạnh của đa
giác
- Sắp xếp các hoành độ giao điểm của dòng quét y = k lần lượt được giới
hạn bởi các cặp cách quãng nhau

TRÌNH BÀY CÁCH TÔ MÀU BẰNG CÁC HÀM OPENGL


Hàm glutInitDisplayMode được dùng để chỉ định chế độ
màu GLUT_RGBA hoặc GLUT_INDEX.
GLUT_RGBA là hệ màu mặc định trong
OpenGL. Hàm này được viết trong hàm main.
VD: glutInitDisplayMode(GLUT_RGB);
GLUT_RGB là bí danh của GLUT_RGBA.
Sử dụng glPolygonMode(face, mode) và glColor* để thiết lập mặt tô
và màu nền (hoặc màu đường vẽ) của hình vẽ.

#include <GL/glut.h>
void display(void)
{
GLubyte fly[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x80, 0x01, 0xC0, 0x06, 0xC0, 0x03, 0x60,
0x04, 0x60, 0x06, 0x20, 0x04, 0x30, 0x0C, 0x20,
0x04, 0x18, 0x18, 0x20, 0x04, 0x0C, 0x30, 0x20,
0x04, 0x06, 0x60, 0x20, 0x44, 0x03, 0xC0, 0x22,
0x44, 0x01, 0x80, 0x22, 0x44, 0x01, 0x80, 0x22,
0x44, 0x01, 0x80, 0x22, 0x44, 0x01, 0x80, 0x22,
0x44, 0x01, 0x80, 0x22, 0x44, 0x01, 0x80, 0x22,
0x66, 0x01, 0x80, 0x66, 0x33, 0x01, 0x80, 0xCC,
0x19, 0x81, 0x81, 0x98, 0x0C, 0xC1, 0x83, 0x30,
0x07, 0xe1, 0x87, 0xe0, 0x03,

0x3f, 0xfc, 0xc0, 0x03, 0x31,

0x8c, 0xc0, 0x03, 0x33, 0xcc,

0xc0, 0x06, 0x64, 0x26, 0x60,

0x0c, 0xcc, 0x33, 0x30,

0x18, 0xcc, 0x33, 0x18, 0x10, 0xc4, 0x23, 0x08,


0x10, 0x63, 0xC6, 0x08, 0x10, 0x30, 0x0c, 0x08,
0x10, 0x18, 0x18, 0x08, 0x10, 0x00, 0x00, 0x08 };
glEnable(GL_POLYGON_STIPPLE);
glPolygonStipple(fly);
//glPolygonMode(GL_FRONT_AND_BACK,
GL_LINE); glColor3f(0.0f, 0.0f, 1.0f);
//vẽ tam giác thứ 1
glBegin(GL_POLYGO
N);
glEdgeFlag(GL_TRUE);
glVertex2i(200,250);
glEdgeFlag(GL_TRUE);
glVertex2i(180,350);
glEdgeFlag(GL_FALSE
); glVertex2i(130,300);
glEnd();
//vẽ tam giác thứ 2
glBegin(GL_POLYGO
N);
glEdgeFlag(GL_TRUE)
; glVertex2i(130, 300);
glEdgeFlag(GL_TRUE)
; glVertex2i(20, 350);
glEdgeFlag(GL_FALSE
); glVertex2i(20, 250);
glEnd();
//vẽ tam giác thứ 3
glBegin(GL_POLYGO
N);
glEdgeFlag(GL_TRUE);
glVertex2i(20, 250);
glEdgeFlag(GL_FALSE
); glVertex2i(200, 250);
glEdgeFlag(GL_FALSE
); glVertex2i(130, 300);
glEnd();
glFlush();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitWindowSize(500, 500);
glutCreateWindow("My App!");
glutDisplayFunc(display);
gluOrtho2D(0.0, 500.0, 0.0, 500.0);
glutMainLoop();
return 0;
}

You might also like