Trang 1 / 4 1234 LastLast
Hiển thị kết quả từ 1 đến 10 / 33

Chủ đề: Đồ họa

  1. #1
    Tham gia
    02-10-2007
    Bài viết
    4
    Like
    0
    Thanked 0 Times in 0 Posts

    Đồ họa

    Môn này mình mới học.Nó thao tác trên visual C với thư viện gl.h voi glu.h.
    BT: Lập trình sao cho kích chuột ở đâu thì vẽ 1 điểm ảnh ở đó.
    Ai làm ơn chỉ giúp mình với!!!!!!Thank nhìu
    Quote Quote

  2. #2
    Tham gia
    12-02-2007
    Location
    HCM - NT
    Bài viết
    218
    Like
    0
    Thanked 1 Time in 1 Post
    Đồ họa sử dụng OGl hả?
    Làm trên môi trường nào?
    - GLUT
    - GLAUX
    - Hay OGL in MFC
    Sao bạn không nói rõ tại mỗi môi trường nó có cách sử dụng chuột và khởi tạo OGL khác nhau.

  3. #3
    Tham gia
    02-10-2007
    Bài viết
    4
    Like
    0
    Thanked 0 Times in 0 Posts
    Làm trên visual C đó bạn.Thư viên glu.h với glut.h.
    project là win 32 application

  4. #4
    Tham gia
    02-02-2005
    Bài viết
    219
    Like
    0
    Thanked 3 Times in 3 Posts
    Vẽ luôn lúc đó hay lưu lệnh vẽ vào OnPain ????
    thé này được không ????
    Code:
    void __fastcall TForm8::FormMouseDown(TObject *Sender, TMouseButton Button,
    	  TShiftState Shift, int X, int Y)
    {
    Canvas->MoveTo(X-5,Y-5);
    Canvas->LineTo(X+5,Y+5);
    Canvas->MoveTo(X-5,Y+5);
    Canvas->LineTo(X+5,Y-5);
    
    }
    Attached Files

  5. #5
    Tham gia
    12-02-2007
    Location
    HCM - NT
    Bài viết
    218
    Like
    0
    Thanked 1 Time in 1 Post
    Không hiểu HuyPhuc gửi cho cái Project gì. Người ta lập trình OGL trên Windows chứ không phải GDI đâu. Mà cái môi trường FORM này có phải là cái RAD của BORLAND ko ta.

    Nói thật cũng lâu lắm rồi mình không xài đến Win32Project nên nếu có lỗi thì bạn coi lại dùm.

    Code:
    #include <windows.h>
    #include <stdio.h>
    
    #include <GL/gl.h>
    #include <GL/glu.h>
    #include <GL/glut.h>
    #pragma comment(lib,"opengl32.lib")
    #pragma comment(lib,"glu32.lib")
    #pragma comment(lib,"glut32.lib")
    
    
    HWND   g_hWnd                = NULL;
    HDC    g_hDC                 = NULL;
    HGLRC  g_hRC                 = NULL;
    
    
    // Số điểm nhắp chuột
    POINT g_aPoint[100];
    int g_nPoint=0;
    
    int WINAPI WinMain( HINSTANCE hInstance,
                        HINSTANCE hPrevInstance,
                        LPSTR     lpCmdLine,
                        int       nCmdShow ) {
    	WNDCLAS*** winClass; 
    	MSG        uMsg;
    	
    	// CAC HAM KHOI TAO CUA SO
    	...
    	...
    	// -----------------------
      
    	InitOGL(); 
    	...
    	while( uMsg.message != WM_QUIT ) {
    		if( PeekMessage( &uMsg, NULL, 0, 0, PM_REMOVE ) ) {
    			TranslateMessage( &uMsg );
    			DispatchMessage( &uMsg );
    		}
    	        else{
    	            OnIdleDraw();  
    	        }
    	}
    
    	DestroyOGL(); 
    }
    
    
    LRESULT CALLBACK WindowProc( HWND   hWnd, 
                                 UINT   msg, 
                                 WPARAM wParam, 
                                 LPARAM lParam ) {
    
    	switch( msg ) {
    		case WM_SIZE:
    			int nWidth  = LOWORD(lParam); 
    			int nHeight = HIWORD(lParam);
    			OnSize(nWidth,nHeight);
    			break;
    		case WM_LBUTTONDOWN:
    			int x = LOWORD (lParam);
    			int y = HIWORD (lParam);
    			OnLClick(x,y);
    			break;
    		...
    		default:
    			...
    			...
    	}
    }
    
    
    // ====================================================
    void InitOGL(){
    	int PixelFormat;
    
    	// DINH DANG PIXEL FORMAT
    	PIXELFORMATDESCRIPTOR pfd;
    	memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));
        
    	pfd.nSize      = sizeof(PIXELFORMATDESCRIPTOR);
    	pfd.nVersion   = 1;
    	pfd.dwFlags    = PFD_DRAW_TO_WINDOW 
                             |PFD_SUPPORT_OPENGL 
                             | PFD_DOUBLEBUFFER;
    	pfd.iPixelType = PFD_TYPE_RGBA;
    	pfd.cColorBits = 16;
    	pfd.cDepthBits = 16;
        
    	// LAY HANDLE GDI
    	g_hDC = GetDC( g_hWnd );
    	PixelFormat = ChoosePixelFormat( g_hDC, &pfd );
    	SetPixelFormat( g_hDC, PixelFormat, &pfd);
    
    	// KHOI TAO OGL
    	g_hRC = wglCreateContext( g_hDC );
    
    	// BAT CHUC NANG OGL
    	wglMakeCurrent( g_hDC, g_hRC );
    }
    
    void DestroyOGL(){
    	if (g_hRC){
    		wglMakeCurrent(0,0);
    		wglDeleteContext( g_hRC );
    	}
    }
    
    // ====================================================
    void OnIdleDraw(){
    	int i;
    	
    	// XOA MAN HINH
    	glClearColor(0.0, 0.0, 0.0, 0.0); 
    	glClear(GL_COLOR_BUFFER_BIT);
    
    	// CHON MAU XANH & SIZE 1 POINT = 5 PIXEL
    	glColor3f(0.0, 1.0, 0.0);
    	glPointSize(5);
    	
    	// VE TAT CA CAC DIEM DA NHAP
    	glBegin(GL_POINTS);
    	for (i = 0;i<g_nPoint;i++)
    		glVertex2D(g_aPoint[i].x , g_aPoint[i].y );
    	glEnd();
    
    	// HOAN DOI VUNG DEM OGL VOI GDI
    	SwapBuffers( g_hDC );
    }
    
    // ====================================================
    void OnSize(int nWidth,int nHeight){
    	glViewport(0, 0, nWidth, nHeight);
    	glMatrixMode( GL_PROJECTION );
            glLoadIdentity();
    }
    
    // ====================================================
    void OnLClick(int x, int y){
    	// DUA POINT VAO MANG
    	if (i>=100)
    		return;
    	POINT p;
    	p.x = x;
    	p.y = y;
    	
    	g_aPoint[i] = p;
    	i++;	
    }

  6. #6
    Tham gia
    02-02-2005
    Bài viết
    219
    Like
    0
    Thanked 3 Times in 3 Posts
    Kinh, vẽ đường thẳng cũng OpenGL

    Đại giáo sư. !!!!!!
    Mấy dòng đó thì C nào cũng vậy thôi.

    Tui chỉ dùng OpenGL và Direct3D khi cần Simulation thôi. Để vẽ đường thẳng thì không cần điều đó. Thua các giáo sư.

  7. #7
    Tham gia
    12-02-2007
    Location
    HCM - NT
    Bài viết
    218
    Like
    0
    Thanked 1 Time in 1 Post
    Hehe Lâu nay topic của tui toàn C++ C++. Ai cũng chán ngấy.
    Tui đổi không khí dùng C không được hả?
    Còn tui thích xài OGL đó? Có sao không.

  8. #8
    Tham gia
    16-07-2004
    Bài viết
    662
    Like
    0
    Thanked 3 Times in 3 Posts
    Anh tạo 1 cài List di ,List này là List các điểm ảnh có dạnh point{float x,y};

    Trong Glut có 1 hàm gọi là cái gì mà Motion đó ,em quên rồi hình như glutMouseFunc (anh lên msdn check ref nhé) ,mỗi lần anh click chuột hàm này sẽ được gọi và sẽ send giá trị con trỏ chuột gồm , vị trí , trạng thái ,nút ấn

    anh check xem nếu nút ấn là nút trái và trạng thái là GLUT_UP thì anh sẽ biến đổi vĩ trí chuột này về tọa độ ViewPort là thứ nhất (nếu như anh sử dụng Viewport cho toàn Client thì khỏi chuyển về Viewport)
    sau đó anh chuyển nó về tọa độ Homogeneous x thuộc -1,1 y thuộc -1,1
    và cái điểm này sẽ phải nhân với lại Inversed Projection Matrix để đưa về tọa độ Eyes ,sau đó anh nhân tiếp cho Inversed ModelView Matrix để đưa về toa độ World ,sau đó Anh Add nó vô Cái List em nói ở trên
    Mỗi lần vẽ anh cứ vẽ nguyên cái list ra

    Cái em nói là trường hợp tỗng quát
    Nhưng mà để tạo cho anh 1 cái gì đó ăn ngay ,đọc hiểu và làm liền thì em provide cho anh 1 cái code như sau ,không cần phải chuyển chiếc gì hết vì em cố tình dàn xếp Projection Matrix và Model View sao cho nó có kiểu "ăn liền" , có nghĩa là nhấn vào là xài được luôn khỏi chuyển

    OK : Bài tập : Click chuột ở đâu vẽ tại đó liền
    Em không dùng List luôn ,vì thiết kế mất thời gian , hơn nữa có thể anh không có học nó (em đoán mò thôi) . nếu anh biết thì anh cứ sài ,còn em là Code cho nó lẹ thôi

    struct Point
    {
    float x,y;
    };
    Point *ArrayPoint;
    int NOP; //Number ò Points
    Hẳn là anh đã biết dùng glut để khởi động OPENGL rồi nên em không viết CODE này đâu
    Theo anh nói thì anh Dùng Win32 Native APP ,không phải là còn Console Program
    Nên trong hàm
    WinMain(hIstance....)
    {
    Anh khởi tạo OpenGL qua glutInit và mọi thứ khác
    ......
    glutMoueFunc(Bat_chuot_cho_em);
    glutDisplayFunc(Ve_len_man_hinh)
    Anh Add 3 dòng sau

    glViewport(0,0,w,h) ; // Anh phải biết w,h vì nó là do anh tạo cửa sổ
    gluLookAt(0,0,50,0,0,0,0,1,0);
    glOthor(0,w,0,h,-1,1);
    NOP=0;
    ArrayPoint=new Point[w*h];
    glutMainLoop()
    }
    Code:
    int Diem_ko_trung(float x,float y)
    {
         int DiemTrung=true;
         for(int i=0;i<NOP;i++)
         {
             if(ArrayPoint[i].x==x||ArrayPoint.y=y)
             {    Diemtrung=false; break;}
         }
        return Diemtrung;
    }
    void Bat_chuot_cho_em(int button,int state,int x,int y)
    {
       if(button==GLUT_LEFT_BUTTON&&state==GLUT_UP)
       {
           if(Diem_ko_Trung(float(x),float(y))
           { 
              ArrayPoint[NOP].x=x;ArrayPoint[NOP].y=y;
               NOP++;
           }
       }
    }
    
    
    void Ve_len_man_hinh()
    {
         .......
        glBegin(GL_POINTS)
        for(int i=0;i<NOP;i++)
         glVertex2f(ArrayPoint[i].x,ArrayPoint[i].y);
        glEnd();
        ....
    }
    PS: nói chuyện nhảm nhí topic này người ta đặt ra để hỏi về openGL mà ,cái gì mà vẽ đường thằng cần dùng hay không cần dùng ở đây . Ờ đây toàn dân ngu thôi , chả có ai giáo sư cả ,không thích thì đi chỗ khác mà post bài

  9. #9
    Tham gia
    02-02-2005
    Bài viết
    219
    Like
    0
    Thanked 3 Times in 3 Posts
    Chán các giáo sư khoe mẽ.
    Người ta có ngay function để add một class vào OnPain. Ở đây các giáo sư chế tạo aray với list.

    Đó gọi là, cầm đèn chạy trước ô tô.

  10. #10
    Tham gia
    16-07-2004
    Bài viết
    662
    Like
    0
    Thanked 3 Times in 3 Posts
    Mêt ông già điên này quá ,
    Array là 1 cách để tui lưu điểm
    người ta hỏi xài OpenGL win32 dạng Native cơ mà lấy đâu ra mà cứ add class với lại OnPaint ở đây

Trang 1 / 4 1234 LastLast

Bookmarks

Quy định

  • Bạn không thể tạo chủ đề mới
  • Bạn không thể trả lời bài viết
  • Bạn không thể gửi file đính kèm
  • Bạn không thể sửa bài viết của mình
  •