zoukankan      html  css  js  c++  java
  • 《图形学》实验二:分形树

    实验平台:

    VC++6.0,OpenGL

    实验内容:

    先按某一方向画一条直线,然后在此线段上找到一系列节点,在每一节点处向左右偏转60各画一条分枝。节点位置和节点处所画分枝的长度的比值各按0.618分割。
    编程要点:
        1.递归调用
                grow(x,y,length,fai)
        2.结束条件:最短树枝
        3.树枝数<10

    实验结果:

    代码:

      1 #include <windows.h>
      2 #include <gl/gl.h>
      3 #include <stdio.h>
      4 
      5 #define PI acos(-1.0)
      6 
      7 //存储n边形的n个点坐标
      8 float px[1000] = {0};
      9 float py[1000] = {0};
     10 int n;  //n边形
     11 
     12 void GetAllPoint(int n)   //得到n边形n个点的坐标
     13 {
     14     float x,y;
     15     float r = 0.8;      //半径
     16     float si = 2*PI/n;  //360°/n
     17     float angle = si/2; //开始度数
     18     int pnum = 0;
     19     while(angle<=2*PI){
     20         x = r*cos(angle);
     21         y = r*sin(angle);
     22         px[pnum] = x;
     23         py[pnum++] = y;
     24         angle = angle+si;
     25     }
     26 }
     27 
     28 void ShowPic1(int n)    //画出n边形的外边框
     29 {
     30     int i;
     31     float x,y;
     32     for(i=0;i<n;i++){
     33         x = px[i];
     34         y = py[i];
     35         glVertex2f(x,y);
     36     }
     37 }
     38 
     39 void ShowPic2(int n)    //画出n边形的中间连线
     40 {
     41     int i,j;
     42     float x0,y0,x,y;
     43     for(i=0;i<n;i++){
     44         x0 = px[i];
     45         y0 = py[i];
     46         for(j=0;j<n;j++){
     47             if(i==j)
     48                 continue;
     49             glVertex2f(x0,y0);
     50             x = px[j];
     51             y = py[j];
     52             glVertex2f(x,y);
     53         }
     54     }
     55 }
     56 
     57 LRESULT CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM);
     58 void EnableOpenGL(HWND hwnd, HDC*, HGLRC*);
     59 void DisableOpenGL(HWND, HDC, HGLRC);
     60 
     61 int WINAPI WinMain(HINSTANCE hInstance,
     62                    HINSTANCE hPrevInstance,
     63                    LPSTR lpCmdLine,
     64                    int nCmdShow)
     65 {
     66     WNDCLASSEX wcex;
     67     HWND hwnd;
     68     HDC hDC;
     69     HGLRC hRC;
     70     MSG msg;
     71     BOOL bQuit = FALSE;
     72     float theta = 0.0f;
     73 
     74     printf("请输入n (n边形):
    ");
     75     scanf("%d",&n);
     76 
     77     GetAllPoint(n); //获取多边形全部的点
     78 
     79     /* register window class */
     80     wcex.cbSize = sizeof(WNDCLASSEX);
     81     wcex.style = CS_OWNDC;
     82     wcex.lpfnWndProc = WindowProc;
     83     wcex.cbClsExtra = 0;
     84     wcex.cbWndExtra = 0;
     85     wcex.hInstance = hInstance;
     86     wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
     87     wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
     88     wcex.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
     89     wcex.lpszMenuName = NULL;
     90     wcex.lpszClassName = "GLSample";
     91     wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION);;
     92 
     93 
     94     if (!RegisterClassEx(&wcex))
     95         return 0;
     96 
     97     /* create main window */
     98     hwnd = CreateWindowEx(0,
     99                           "GLSample",
    100                           "钻石图案",
    101                           WS_OVERLAPPEDWINDOW,
    102                           CW_USEDEFAULT,
    103                           CW_USEDEFAULT,
    104                           700,
    105                           700,
    106                           NULL,
    107                           NULL,
    108                           hInstance,
    109                           NULL);
    110 
    111     ShowWindow(hwnd, nCmdShow);
    112 
    113     /* enable OpenGL for the window */
    114     EnableOpenGL(hwnd, &hDC, &hRC);
    115 
    116     /* program main loop */
    117     while (!bQuit)
    118     {
    119         /* check for messages */
    120         if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    121         {
    122             /* handle or dispatch messages */
    123             if (msg.message == WM_QUIT)
    124             {
    125                 bQuit = TRUE;
    126             }
    127             else
    128             {
    129                 TranslateMessage(&msg);
    130                 DispatchMessage(&msg);
    131             }
    132         }
    133         else
    134         {
    135             /* OpenGL animation code goes here */
    136 
    137             glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    138             glClear(GL_COLOR_BUFFER_BIT);
    139 
    140             //glPushMatrix();
    141             //glRotatef(theta, 0.0f, 0.0f, 1.0f);
    142 
    143             glBegin(GL_LINE_STRIP);
    144                 glColor3f(1.0f, 0.0f, 0.0f);    //设置画笔颜色
    145                 ShowPic1(n);    //输出n边形的外边框
    146             glEnd();
    147 
    148             //printf("%d
    ",pnum);
    149 
    150             glBegin(GL_LINES);
    151                 ShowPic2(n);    //画出n边形的中间连线
    152             glEnd();
    153 
    154             glPopMatrix();
    155 
    156             SwapBuffers(hDC);
    157 
    158             theta += 1.0f;
    159             Sleep (1);
    160         }
    161     }
    162 
    163     /* shutdown OpenGL */
    164     DisableOpenGL(hwnd, hDC, hRC);
    165 
    166     /* destroy the window explicitly */
    167     DestroyWindow(hwnd);
    168 
    169     return msg.wParam;
    170 }
    171 
    172 LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    173 {
    174     switch (uMsg)
    175     {
    176         case WM_CLOSE:
    177             PostQuitMessage(0);
    178         break;
    179 
    180         case WM_DESTROY:
    181             return 0;
    182 
    183         case WM_KEYDOWN:
    184         {
    185             switch (wParam)
    186             {
    187                 case VK_ESCAPE:
    188                     PostQuitMessage(0);
    189                 break;
    190             }
    191         }
    192         break;
    193 
    194         default:
    195             return DefWindowProc(hwnd, uMsg, wParam, lParam);
    196     }
    197 
    198     return 0;
    199 }
    200 
    201 void EnableOpenGL(HWND hwnd, HDC* hDC, HGLRC* hRC)
    202 {
    203     PIXELFORMATDESCRIPTOR pfd;
    204 
    205     int iFormat;
    206 
    207     /* get the device context (DC) */
    208     *hDC = GetDC(hwnd);
    209 
    210     /* set the pixel format for the DC */
    211     ZeroMemory(&pfd, sizeof(pfd));
    212 
    213     pfd.nSize = sizeof(pfd);
    214     pfd.nVersion = 1;
    215     pfd.dwFlags = PFD_DRAW_TO_WINDOW |
    216                   PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
    217     pfd.iPixelType = PFD_TYPE_RGBA;
    218     pfd.cColorBits = 24;
    219     pfd.cDepthBits = 16;
    220     pfd.iLayerType = PFD_MAIN_PLANE;
    221 
    222     iFormat = ChoosePixelFormat(*hDC, &pfd);
    223 
    224     SetPixelFormat(*hDC, iFormat, &pfd);
    225 
    226     /* create and enable the render context (RC) */
    227     *hRC = wglCreateContext(*hDC);
    228 
    229     wglMakeCurrent(*hDC, *hRC);
    230 }
    231 
    232 void DisableOpenGL (HWND hwnd, HDC hDC, HGLRC hRC)
    233 {
    234     wglMakeCurrent(NULL, NULL);
    235     wglDeleteContext(hRC);
    236     ReleaseDC(hwnd, hDC);
    237 }

     
    Freecode : www.cnblogs.com/yym2013

  • 相关阅读:
    h5 input调起摄像头、摄像机、录音机
    基数排序
    快速排序 && 希尔排序 && 插入排序
    堆排序
    归并排序(Merge sort)
    动态规划:背包问题
    Chap5: question: 29
    排列 && 组合
    Chap4: question: 19
    Chap3: question: 11
  • 原文地址:https://www.cnblogs.com/yym2013/p/4619113.html
Copyright © 2011-2022 走看看