March 2024 | Mon | Tue | Wed | Thu | Fri | Sat | Sun |
---|
| | | | 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 | Calendar |
|
| | Lớp Graphics | |
| | Tác giả | Thông điệp |
---|
minhlapb Thành viên bậc 2
Tổng số bài gửi : 32 Points : 90 Reputation : 2 Join date : 22/07/2009
| Tiêu đề: Lớp Graphics Wed Nov 04, 2009 4:35 pm | |
| Có ai sửa dùm bài này cám ơn --- thầy cũng no way
bài mình làm là tạo một lớp Graphics de ve hinh trong OpenGL như chỗ hàm InitOpenGL nó không nhận ra các hàm sự kiện như myDraw trong glutDisplayFunc(myDraw);
file Graphics.h
#ifndef _GRAPHICS_H #define _GRAPHICS_H
#include"glut.h"
struct colorentry { GLubyte Red; GLubyte Blue; GLubyte Green; colorentry() {Red=Green=Blue=0; } colorentry(GLbyte R,GLbyte G,GLbyte B) { Red=R; Green=G; Blue=B; } }; class Graphics { colorentry m_color; void myInit(); void myDraw(); void OnSize(int width,int height); void OnKeyDown(unsigned char key,int x, int y); void OnMouse(int btn, int state, int x, int y); void OnMotion(int x, int y); void OnIdle(); public: void InitOpenGL(int argc,char *argv[],char *s,int w=640,int h=480); void PutPixel(int x,int y,colorentry c); colorentry GetPixel(int x,int y); void SetColor(colorentry c);; void DrawLine_GL(int x1,int y1,int x2,int y2,colorentry c); void DrawLineDDA(int x1,int y1,int x2,int y,colorentry c); void DrawLineBresenham(int x1,int y1,int x2,int y2,colorentry c); };
#endif
file Graphics.cpp
#include"Graphics.h" #define Round(x) (int)(x+0.5)
void Graphics::PutPixel(int x,int y,colorentry c) { glColor3ub(c.Red,c.Green,c.Blue); glBegin(GL_POINTS); glVertex2f(x,y); glEnd(); } colorentry Graphics::GetPixel(int x,int y) { GLbyte color[3]; float Pos[4]; glRasterPos2d(x,y); glGetFloatv(GL_CURRENT_RASTER_POSITION,Pos); glReadPixels(Pos[0],Pos[1],1,1,GL_RGB,GL_UNSIGNED_BYTE,color); return colorentry(color[0],color[1],color[2]); } void Graphics::SetColor(colorentry c) { glColor3ub(c.Red,c.Green,c.Blue); } void Graphics::DrawLine_GL(int x1,int y1,int x2,int y2,colorentry c) { glColor3ub(c.Red,c.Green,c.Blue); glBegin(GL_LINES); glVertex2f(x1,y1); glVertex2f(x2,y2); glEnd(); } void Graphics::DrawLineDDA(int x1,int y1,int x2,int y2,colorentry c) { int x=x1; float y=y2; float m=(float)((y2-y1)/(x2-x1)); PutPixel(x,y1,c); while(x<x2) { x++; y+=m; PutPixel(x,Round(y),c); } } void Graphics::DrawLineBresenham(int x1,int y1,int x2,int y2,colorentry c) { int x=x1,y=y1; int dx=x2-x1,dy=y2-y1; int c1=(dy<<1); int c2=((dy-dx)<<1); int p=(dy<<1)-dx; glBegin(GL_POINTS);
glVertex2i(x,y); while(x<x2) { if(p<0) p+=c1; else { p+=c2; y++; } ++x; glVertex2i(x,y); } glEnd(); } void Graphics::InitOpenGL(int argc,char *argv[],char *s,int w,int h) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB); glutInitWindowSize(w,h); glutInitWindowPosition(100,100); glutCreateWindow(s); // thao tac su kien
myInit(); glutDisplayFunc(myDraw);///<---- không nhận ra hàm myDraw , cũng như // OnKeyDown, OnMouse. ... glutReshapeFunc(OnSize); glutKeyboardFunc(OnKeyDown); glutMouseFunc(OnMouse); glutMotionFunc(OnMotion); glutIdleFunc(OnIdle); glutPassiveMotionFunc(OnMotion); glutMainLoop(); } chưa đụng gi hàm main hết nó báo lỗi ở mấy dòng màu đỏ trên
| |
| | | symphonyenigmatic Thành viên bậc 3
Tổng số bài gửi : 61 Points : 104 Reputation : 6 Join date : 26/07/2009 Age : 35 Đến từ : http:://thienthancntt.tk
| Tiêu đề: Re: Lớp Graphics Sat Nov 07, 2009 5:01 am | |
| Báo lỗi chắc luôn. Mình chỉ nói vd 1 hàm thôi, mấy thứ khác bạn tự liên tưởng nha. glutDisplayFunc(myDraw). Đây là hàm mà thầy nói là mình viết code để cho ng ta sài. Tức là bạn viết code, nhưng bạn không sử dụng, mà là chuog trình nó sử dụng. hàm glutDisplayFunc là hàm do opengl định nghĩa, và cấu trúc hàm là: hàm này gọi tới 1 hàm, chứ không phải gọi tới 1 tham số. Vậy mih hỏi bạn nha, nó gọi hàm myDraw. Vậy hàm myDraw của bạn đâu? Hiii..nói vậy thôi, lỗi rất đơn giản, thiếu hàm OnDraw. Nhưng mình nói hơi dài ở trên, vì có 1 điều chưa đúng theo logic, máy k báo, nhưng mà k hay. Đó là mình nghĩ bạn hiểu sai ý của thầy rồi, khi đưa nguyên cả cái cục màu đỏ đỏ đó vào InitOpenGL. Thứ nhất là nó chưa tối ưu lắm. Vì có hàm thì sử dụng những cái trên, nhưng có khi thì sử dụng nhiều hơn, vậy làm như vậy là chưa dc. Thứ 2, là không đúng tính chất Hướng Đối Tượng. Bạn chỉ bỏ phần khởi tạo vô thôi. Chứ mấy hàm đó ng ta định nghĩa rồi, vậy sao ng ta không viết luôn, mà cho phép ban viết hàm onDraw, vì ng ta muốn cho ng dùng tự định nghĩa ngay trong hàm main. Nếu bạn ghi ở đây, vậy khi dùng hàm main, thì phải vào đây định nghĩa lại. Nếu là ng dùng, họ có biết hàm CGraphics của bạn k? Ngoài ra 1 số hàm khác nữa. Đã gọi là thư viện, tức là phải đúng trong mọi trường hơp, gọi là run.. Nên mình thấy bài của bạn hơi kì kì.. Bạn xem kĩ lại nhé! Thân! | |
| | | minhlapb Thành viên bậc 2
Tổng số bài gửi : 32 Points : 90 Reputation : 2 Join date : 22/07/2009
| Tiêu đề: Re: Lớp Graphics Sat Nov 07, 2009 12:35 pm | |
| trả lởi lạc đề nhiều quá.... những cái mà ng ta không muốn biết mà bắt người ta phải đọc thì thật là ác quá.... sai thì nói là sai, sao phe phán nhiu quá, uh mình dở mình tệ lắm.... tôi có khai báo hàm myDraw đàng hoàn nge, không xem ki mà nói cái j nói tóm lại class Graphics như vậy là không đúng phải không thì không dúng, thì chỉ ra chổ sai là dc rồi nói linh tinh | |
| | | symphonyenigmatic Thành viên bậc 3
Tổng số bài gửi : 61 Points : 104 Reputation : 6 Join date : 26/07/2009 Age : 35 Đến từ : http:://thienthancntt.tk
| Tiêu đề: Re: Lớp Graphics Sat Nov 07, 2009 2:36 pm | |
| Mình không thấy hàm myDraw trong file Graphics.cpp của bạn. Nếu bạn viết trong hàm main thì nó báo lỗi là đương nhiên. Nếu có hàm myDraw ở đây, thì bạn phải viết theo kiểu hướng dt thì nó mới hiểu. void Graphics::myDraw(void) { //............ } Cuối cùng: nên đưa myDraw và mấy cái hàm opengl ra file main. Thân! | |
| | | symphonyenigmatic Thành viên bậc 3
Tổng số bài gửi : 61 Points : 104 Reputation : 6 Join date : 26/07/2009 Age : 35 Đến từ : http:://thienthancntt.tk
| Tiêu đề: Re: Lớp Graphics Sat Nov 07, 2009 4:06 pm | |
| Vẽ đường tròn bằng thuật toán MidPoint, thầy đưa vào hàm Get8Pixel void CGraphics::Set8Pixel(int xc, int yc, int x, int y) { SetPixel(xc+x,yc+y); SetPixel(xc+x,yc-y); SetPixel(xc-x,yc+y); SetPixel(xc-x,yc-y); SetPixel(xc+y,yc+x); SetPixel(xc+y,yc-x); SetPixel(xc-y,yc+x); SetPixel(xc-y,yc-x); }
Vậy sao không phải là SetPixel (x, y)..hoặc là(xc, yc) và hàm chỉ đưa vào 2 tham số thôi? Mình không nói đến cách viết, mà là hỏi về ý tưởng, sao lại phải xc + rồi xc-.. Thực tế, mình viết 1 bài không dùng 2 tham số xc+x, xc-x, mà chỉ dùng x, và -x, nó vẫn vẽ dc theo thuật toán Midpoint. Bạn nào biết giải thích cho mình nghe với. | |
| | | Sponsored content
| Tiêu đề: Re: Lớp Graphics | |
| |
| | | | Lớp Graphics | |
|
Trang 1 trong tổng số 1 trang | |
| Permissions in this forum: | Bạn không có quyền trả lời bài viết
| |
| |
| |