Lập trình đồ họa trong C++

Go down

Lập trình đồ họa trong C++

Bài gửi by ASSASSiN on Tue Nov 13, 2007 2:19 pm

Như chúng ta đã biết ,bất kì một chương trình nào khi được đưa vào sử dụng ngoài những tính năng độc đáo mà chương trình đó đem lại thì phần đồ họa hay thiết kế giao diện người dùng (graphic user interface_GUI) cũng không kém phần quan trọng.
Bên cạnh đó phần đồ họa trong C++ cũng rất ít được nhắc tới do C++ không hỗ trợ hoàn toàn đầy đủ (so với các phần mềm khác)
Do đó mình xin mạo muội lập ra topic này nhằm tập hợp những bài viết về đồ họa trong C++,và mình cũng xin đóng góp chút xíu những gì mà mình biết. Cũng xin nói rằng trong cuốn Lập trình C++_GS Phạm Văn Ất cũng sẽ không nói đến đồ họa vì mình sẽ tách phần đó sang đây để lấy làm phần nhập môn về đồ họa C++.
Thôi không dài dòng nữa,mình sẽ bắt đầu ngay đây!
Bài mở đầu: Các khái niệm cơ bản
1.Màn hình văn bản và màn hình đồ họa,pixel,độ phân giải
Nếu gạt bỏ đồ họa sang một bên, chỉ quan tâm tới những gì mà từ trươc đến nay chúng ta vẫn làm trên màn hình chúng ta sẽ nói rằng chúng ta làm việc trên màn hình kiểu văn bản (từ khâu viết code trên màn hình xanh của turbo C đến khâu chạy chương trình trên màn hình đen của DOS). Vậy thế nào là màn hình kiểu văn bản? Đó là loại màn hình được thiết kế với 80 cột và 25 dòng giống như một bàn cờ nhưng chỉ khác về số dòng và số cột, trong mỗi ô của một bàn cờ chứa một quân cờ thì trong mỗi ô của màn hình đồ họa chứa một kí tự.
Khi làm việc trên màn hình văn bản , các kí tự hiển thị đã được qui định từ trước bởi phần cứng máy tính, do đó không thể nào thay đổi được kích thước cũng như kiểu chữ. Tuy nhiên nhu cầu của chúng ta thì không dừng lại ở đó,vì thể người ta tìm cách thu nhỏ các ô này lại sao cho mỗi ô chỉ chiếm 1 phần rất nhỏ của 1 kí tự,khi đó chúng ta có thể xử lí kích thước và hình dạng của kiểu chữ dựa trên các phần rất nhỏ đó. Do đó một khái niệm mới được ra đời đó là pixel (chấm điểm) _một từ có lẽ cũng quen thuộc với chúng ta. Sự bố trí các pixel trên màn hình gọi là độ phân giải ,do mỗi kiểu màn hình đồ họa có một cách xử lí đồ họa riêng nên Turbo C++ cung cấp cho mỗi kiểu màn hình đồ họa một tệp tin điều khiển riêng, (trong windows ,những tệp điều khiển đồ họa gọi là driver)
Các tệp tin điều khiển trong C++ có đuôi BGI và được liệt kê dưới bảng sau:


Màn hình đồ họa được sắp xếp trên các đường thẳng ngang và dọc. Điều này đúng cho tất cả các kiểu màn hình đồ họa của máy tính.Khác biệt chủ yếu giữa chúng là kích thước của mỗi điểm ảnh (hay số điểm ảnh). Chúng ta thường hay thấy mọi người nói độ phân giải là :1024x768 hay 1600x1200… các bạn nhân nó lên sẽ ra số điểm ảnh được bỗ trí trên màn hình. Điểm ảnh càng nhỏ thì số điểm ảnh trên màn hình càng nhiều và tất nhiên sẽ cho chất lượng ảnh càng cao.
2.Hệ tọa độ của màn hình đồ họa,cấu trúc một chương trình đồ họa trong C++
Mỗi kiểu đồ họa dùng một hệ tọa độ riêng.Lấy ví dụ cho hệ tọa độ của màn hình VGA là 640x480 như sau:

Nhờ hệ tọa độ này ,ta có thể tác động hay tham chiếu đến bất kì điểm ảnh nào trên màn hình đồ họa.Trong C++ để lấy tọa độ x và y lớn nhất trong kiểu đồ họa đang dùng ta lần lượt dùng 2 hàm getmaxx() và getmaxy().
Ngoài ra,trong C++,khi muốn làm việc trên màn hình đồ họa ta thường phải làm những việc sau:
+ Khởi động hệ thống đồ họa
+ Kiểm tra lỗi đồ họa
+ Các thao tác trên màn hình đồ họa
+ Đóng hệ thống đồ họa để trở về mode (kiểu) văn bản.

_________________
Hãy REPLY để ủng hộ BOTAY nhé!
avatar
ASSASSiN
♥ Strong Chicken ♥
♥ Strong Chicken ♥

Tổng số bài gửi : 329
Age : 31
Location : Việt Nam
Registration date : 05/10/2007

Xem lý lịch thành viên http://botay.1talk.net

Về Đầu Trang Go down

Re: Lập trình đồ họa trong C++

Bài gửi by ASSASSiN on Tue Nov 13, 2007 2:20 pm

GIỚI THIỆU THUẬT TOÁN VÀ TÔ CÁC ĐƯỜNG
Thuật toán DDA vẽ đường thẳng:

Code:
#include
#include
#include
#include

void ktdh()
{
int mh=9;
int mode=2;
initgraph(&mh,&mode,"D:\\BORLANDC\\BGI");
int maloi=graphresult();
if (maloi==0) cout<<"Da khoi tao do hoa";
else cout<<"Co loi khoi tao do hoa";
};
void DDA(double x1,double y1, double x2, double y2, int color){
ktdh();
double x,y,temp;
if(abs(x2-x1)>abs(y2-y1)) temp=abs(x2-x1);
else temp=abs(y2-y1);
x=x1;
y=y1;
putpixel(ceil(x),ceil(y),color);
for(double i=1;i<=temp;i++){
x=x+(x2-x1)/temp;
y=y+(y2-y1)/temp;
putpixel(ceil(x),ceil(y),color);
};
};
void main(){
double x1,x2,y1,y2;
cout<<"Nhap x1, y1:";
cin>>x1>>y1;
cout<<endl<<"Nhap x2, y2:";
cin>>x2>>y2;
DDA(x1,y1,x2,y2,4);
getch();
};


Được sửa bởi ngày Tue Nov 13, 2007 2:25 pm; sửa lần 2.

_________________
Hãy REPLY để ủng hộ BOTAY nhé!
avatar
ASSASSiN
♥ Strong Chicken ♥
♥ Strong Chicken ♥

Tổng số bài gửi : 329
Age : 31
Location : Việt Nam
Registration date : 05/10/2007

Xem lý lịch thành viên http://botay.1talk.net

Về Đầu Trang Go down

Re: Lập trình đồ họa trong C++

Bài gửi by ASSASSiN on Tue Nov 13, 2007 2:20 pm

Vẽ đường tròn.

Code:
void circle(int x0, int y0, int color){
int x,y;
for(int x=0; x<=ceil(R*sqrt(2)/2); x++){
y=ceil(sqrt(R*R-x*x);
// Ve doi xung
putpixel(x0+x,y0+y,color);
putpixel(x0-x,y0+y,color);
putpixel(x0+x,y0-y,color);
putpixel(x0-x,y0-y,color);
putpixel(x0+y,y0+x,color);
putpixel(x0-y,y0+x,color);
putpixel(x0+y,y0-x,color);
putpixel(x0-y,y0-x,color);
};
};


Được sửa bởi ngày Tue Nov 13, 2007 2:25 pm; sửa lần 1.

_________________
Hãy REPLY để ủng hộ BOTAY nhé!
avatar
ASSASSiN
♥ Strong Chicken ♥
♥ Strong Chicken ♥

Tổng số bài gửi : 329
Age : 31
Location : Việt Nam
Registration date : 05/10/2007

Xem lý lịch thành viên http://botay.1talk.net

Về Đầu Trang Go down

Re: Lập trình đồ họa trong C++

Bài gửi by ASSASSiN on Tue Nov 13, 2007 2:20 pm

Thuật toán vẽ Ellipse:

Code:
void ellipse(int xc, int yc, int a, int b, int color){
int x,y
float z1,z2,P;
x=0;y=b;
z1=(b*b)/(a*a);
z2=1/z1;
P=2*z1-2*b+1;
while(z1*(x/y)<=1){
putpixel(xc+x,yc+y,color);
putpixel(xc-x;yc+y,color);
putpixel(xc+x,yc-y,color);
putpixel(xc-x,yc-y,color);
if (P<0) P=P+2*z1*(2*x+3);
else{
P=P+2*z1*(2*x+3)+4*(1-y);
y--;
};
x++;
};
x=a;y=0;
P=2*z2-2*a+1;
while(z2*(y/x)<1){
putpixel(xc+x,yc+y,color);
putpixel(xc-x;yc+y,color);
putpixel(xc+x,yc-y,color);
putpixel(xc-x,yc-y,color);
if (P<0) P=P+2*z2*(2*y+3);
else{
PP+2*z2*(2*y+3)+4*(1-x);
x--;
};
y++;
};
};


Được sửa bởi ngày Tue Nov 13, 2007 2:26 pm; sửa lần 1.

_________________
Hãy REPLY để ủng hộ BOTAY nhé!
avatar
ASSASSiN
♥ Strong Chicken ♥
♥ Strong Chicken ♥

Tổng số bài gửi : 329
Age : 31
Location : Việt Nam
Registration date : 05/10/2007

Xem lý lịch thành viên http://botay.1talk.net

Về Đầu Trang Go down

Re: Lập trình đồ họa trong C++

Bài gửi by ASSASSiN on Tue Nov 13, 2007 2:22 pm

để chạy được các cậu phải có file sau.
glut32.lib
glut32.dll
glut32.h

box.net h3qsfhb5ef

có đủ file đầy đủ trong đó và hướng dẫn.
Kỳ này Học môn này tớ quải đạn quá toàn toán hình học mình lại yếu với lại không giúp ích được gì cho mình.Dù sao trông cho thi qua

VẼ hình tròn bao gồm các ngôi sao bên trong.


Code:
#include
#include
#define PI 3.14159
#define Width 640
#define Height 480
#define Radius 200
void display(void)
{
int i,R;double phi;
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(10,1.0,0.0);
//ve ngu giac
phi=PI/2;
glBegin(GL_LINE_LOOP);
for(i=0;i<5;i++)
{
glVertex2f(Radius*cos(phi),Radius*sin(phi));
phi+=2*PI/5;
}
glEnd();
//ve luc giac
phi=PI/3;
glBegin(GL_LINE_LOOP);
for(i=0;i<6;i++)
{
glVertex2f(Radius*cos(phi),Radius*sin(phi));
phi+=2*PI/6;
}
glEnd();
//ve ngoi sao
phi=PI/2;
R=Radius;
//glBegin(GL_LINE_LOOP);
//for(int k=0;k<3;k++)
//{
glBegin(GL_LINE_LOOP);
for(i=0;i<5;i++)
{
glVertex2f(R*cos(phi),R*sin(phi));
phi+=4*PI/5;
}
glEnd();
phi=PI/2+PI/5;
R=(R*sin(PI/10))/sin(3*PI/10);
glBegin(GL_LINE_LOOP);
for(i=0;i<5;i++)
{
glVertex2f(R*cos(phi),R*sin(phi));
phi+=4*PI/5;
}
glEnd();
//}
glEnd();


// ve vong tron
glBegin(GL_LINE_LOOP);
for(i=0;i<100;i++)
{
phi=2*PI*i/100;
glVertex2f(Radius*cos(phi),Radius*sin(phi));
}
glEnd();
//ve ngoi sao
glFlush();
}
void init(void)
{
GLdouble hW,hH;
glClearColor(0.0,0.0,0.0,0.0);
hW=(GLdouble) Width/2.0;
hH=(GLdouble) Height/2.0;
gluOrtho2D(-hW,hW,-hH,hH);
}
void main(int argc,char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(Width,Height);
glutCreateWindow(" kkkkk");
init();
//glutDisplayFunc(vengugiac);
glutDisplayFunc(display);
glutMainLoop();
}

_________________
Hãy REPLY để ủng hộ BOTAY nhé!
avatar
ASSASSiN
♥ Strong Chicken ♥
♥ Strong Chicken ♥

Tổng số bài gửi : 329
Age : 31
Location : Việt Nam
Registration date : 05/10/2007

Xem lý lịch thành viên http://botay.1talk.net

Về Đầu Trang Go down

Re: Lập trình đồ họa trong C++

Bài gửi by Sponsored content


Sponsored content


Về Đầu Trang Go down

Về Đầu Trang

- Similar topics

 
Permissions in this forum:
Bạn không có quyền trả lời bài viết