C++ OpenGL实现围绕参考点旋转的等距门圆环 支持数量自适应缩放
功能需求
- 技术栈:C++ + OpenGL
- 核心功能:在空间参考点周围生成由等间距门形元素构成的圆环
- 扩展要求:每次运行程序时圆环内的元素数量可动态调整,程序自动调整缩放比例适配不同的元素数量
- 效果参考:

现有实现代码
/********** * Includes * **********/ #include <windows.h> #include <gl/gl.h> #include <math.h> /********** * Function Declarations * **********/ LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC); void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC); int DrawAxis() { float i; glClearColor (0 , 1 , 1 , 1); glPointSize(1); glBegin (GL_POINTS); glColor3f(0,0,1); for(i=-1;i<1;i=i+0.001) { glVertex2f(i,0); glVertex2f(0,i); } glEnd (); } int SetPoint(float x , float y, int size) { glPointSize(size); glBegin (GL_POINTS); glColor3f(1,0,1); glVertex2f(x , y); glEnd (); } int MovPoint(float x , float y,float xt , float yt, int size) { glPointSize(size); glBegin (GL_POINTS); glColor3f(1,1,1); glVertex2f(xt+x/10 , yt+y/10); glEnd (); } int RotatePoint(float x , float y , float Teta) { glPointSize(1); glBegin(GL_POINTS); glColor3f(1, 1,1); Teta = Teta * 3.14 / 180; x=x * cos(Teta) - y * sin(Teta); y=x * sin(Teta) + y * cos(Teta); float teta = 0; float i = 0; float r=0.4; float Dtheta = 2 * 3.14 / 360; glColor3f(1,1,1); glPointSize(3); glBegin (GL_POINTS); for (i = 0; i <360; i += 0.01) { teta = i * Dtheta; glVertex2f( x+ r * cos(teta) ,y+ r * sin(teta) ); } glEnd(); } float dayereh (float x, float y) { float teta = 0; float i = 0; float r=0.4; float Dtheta = 2 * 3.14 / 360; glColor3f(1,1,1); glPointSize(3); glBegin (GL_POINTS); for (i = 0; i <360; i += 0.01) { teta = i * Dtheta; glVertex2f( x+ r * cos(teta) ,y+ r * sin(teta) ); } glEnd (); } /********** * WinMain * **********/ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow) { WNDCLASS wc; HWND hWnd; HDC hDC; HGLRC hRC; MSG msg; BOOL bQuit = FALSE; float theta = 0.0f; /* register window class */ wc.style = CS_OWNDC; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon (NULL, IDI_APPLICATION); wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = "GLSample"; RegisterClass (&wc); /* create main window */ hWnd = CreateWindow ( "GLSample", "OpenGL Sample", WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE, 550, 60, 456, 456, NULL, NULL, hInstance, NULL); /* enable OpenGL for the window */ EnableOpenGL (hWnd, &hDC, &hRC); /* program main loop */ while (!bQuit) { /* check for messages */ if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) { /* handle or dispatch messages */ if (msg.message == WM_QUIT) { bQuit = TRUE; } else { TranslateMessage (&msg); DispatchMessage (&msg); } } else { /* OpenGL animation code goes here */ glClearColor (0 , 0 , 0 , 1); glClear (GL_COLOR_BUFFER_BIT); DrawAxis(); // SetPoint(.9,0,5); //MovPoint(0.5,0.5,-0.8,-0.8,5); //RotatePoint(.9,0,45); // dayereh (-0.4,0); // for (float r = 45; r < 360; r ++) // for (float i = -0.4; i < 0; i += .1) for (float j = 0; j < 1; j += .1) { RotatePoint(-0.3, j, 45); // RotatePoint(.6, i, 45); //// RotatePoint(0, i, 45); } //RotatePoint(-0.3,-0.1, 45); // RotatePoint(-0.3,-0.2, 47); // RotatePoint(-0.3,-.3, 55); SwapBuffers (hDC); theta += 0.2f; Sleep (1); } } /* shutdown OpenGL */ DisableOpenGL (hWnd, hDC, hRC); /* destroy the window explicitly */ DestroyWindow (hWnd); return msg.wParam; } /******** * Window Procedure * ********/ LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_CREATE: return 0; case WM_CLOSE: PostQuitMessage (0); return 0; case WM_DESTROY: return 0; case WM_KEYDOWN: switch (wParam) { case VK_ESCAPE: PostQuitMessage(0); return 0; } return 0; default: return DefWindowProc (hWnd, message, wParam, lParam); } } /******* * Enable OpenGL * *******/ void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC) { PIXELFORMATDESCRIPTOR pfd; int iFormat; /* get the device context (DC) */ *hDC = GetDC (hWnd); /* set the pixel format for the DC */ ZeroMemory (&pfd, sizeof (pfd)); pfd.nSize = sizeof (pfd); pfd.nVersion = 1; pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; pfd.iPixelType = PFD_TYPE_RGBA; pfd.cColorBits = 24; pfd.cDepthBits = 16; pfd.iLayerType = PFD_MAIN_PLANE; iFormat = ChoosePixelFormat (*hDC, &pfd); SetPixelFormat (*hDC, iFormat, &pfd); /* create and enable the render context (RC) */ *hRC = wglCreateContext( *hDC ); wglMakeCurrent( *hDC, *hRC ); } /****** * Disable OpenGL * ******/ void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC) { wglMakeCurrent (NULL, NULL); wglDeleteContext (hRC); ReleaseDC (hWnd, hDC); }
内容的提问来源于stack exchange,提问作者MNamazi
相关产品推荐
相关产品推荐

