《图形学》实验二:分形树

实验平台:

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边形):\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\n",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

时间: 2024-11-06 01:08:18

《图形学》实验二:分形树的相关文章

20172328《程序设计与数据结构》实验二:树

20172328<程序设计与数据结构>实验二:树 课程:<软件结构与数据结构> 班级: 1723 姓名: 李馨雨 学号:20172328 实验教师:王志强老师 实验日期:2018年11月5日-2018年11月12日 必修选修: 必修 一.实验要求内容 实验1:实现二叉树 参考教材p212,完成链树LinkedBinaryTree的实现(getRight,contains,toString,preorder,postorder) 用JUnit或自己编写驱动类对自己实现的LinkedB

20172319 实验二《树》实验报告

20172319 2018.11.04-11.12 实验二<树> 实验报告 课程名称:<程序设计与数据结构> 学生班级:1723班 学生姓名:唐才铭 学生学号:20172319 实验教师:王志强老师 课程助教:张师瑜学姐.张之睿学长 实验时间:2018年11月04日--2018年11月12日 必修/选修:必修 目录 实验内容 实验要求 实验步骤 代码实现及解释 测试过程及遇到的问题 分析总结 代码托管 参考资料 实验内容 实验二-1-实现二叉树: 完成链树LinkedBinaryT

20172302 《Java软件结构与数据结构》实验二:树实验报告

课程:<Java软件结构与数据结构> 班级: 1723 姓名: 侯泽洋 学号:20172302 实验教师:王志强老师 实验日期:2018年11月5日 必修/选修: 必修 实验内容 (1)参考教材p212,完成链树LinkedBinaryTree的实现(getRight,contains,toString,preorder,postorder:用JUnit或自己编写驱动类对自己实现的LinkedBinaryTree进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息 (2)基于Linked

CCNA实验二十三 单区域OSPF路由协议 &nbsp;

CCNA实验二十三 单区域OSPF路由协议 环境:Windows XP .GNS3.0.7.2 目的: 认识并学会OSPF的基本配置 说明: OSPF(开放式最短路径优先)是一个内部网关协议而且是链路状态路由协议.OSPF通过路由器之间通告网络接口的状态来建立链路状态数据库,生成最短路径树,每个OSPF路由器使用这些最短路径构造路由表.OSPF路由器向加入到OSPF过程的接口发送Hello数据包,Hello协议的目的: 1.用于发现邻居 2.在成为邻居之前,必须对Hello包里的一些参数进行协商

数据结构实验五:树和二叉树

一.实验目的 巩固树和二叉树的相关知识,特别是二叉树的相关内容.学会运用灵活应用. 1.回树和二叉树的逻辑结构和存储方法,清楚掌握树和二叉树的遍历操作. 2.学习树的相关知识来解决实际问题. 3.进一步巩固程序调试方法. 4.进一步巩固模板程序设计. 二.实验时间 准备时间为第10周到第12前半周,具体集中实验时间为12周周四.2个学时. 三..实验内容 1.自己设计一个二叉树,深度最少为4,请递归算法分别用前序.中序.后序遍历输出树结点. 2.写程序判定出六枚硬币中的一枚假硬币.参照课本P13

TokuDB的索引结构–分形树的实现

分形树简介 原文:http://www.bitstech.net/2015/12/15/tokudb-index-introduction/ 分形树是一种写优化的磁盘索引数据结构. 在一般情况下, 分形树的写操作(Insert/Update/Delete)性能比较好,同时它还能保证读操作近似于B+树的读性能.据Percona公司测试结果显示, TokuDB分形树的写性能优于InnoDB的B+树), 读性能略低于B+树. 类似的索引结构还有LSM-Tree, 但是LSM-Tree的写性能远优于读性

实验二 linux常用命令练习

实验二 四.实验结论 (1)什么是 shell? shell是Unix/linux系统提供给用户的系统程序,用以对用户输入的命令进行解释执行. 它是用户和系统内核之间的接口. (2)常用的 shell 有哪些?如何查看系统默认使用的 shell? ① sh Bourne shell ② csh C shell ③ ksh Korn shell ④ bash Bourne Again shell 使用命令行echo $SHELL 查看系统创建用户使用的shell 使用命令行echo $0 (3)内

20172303 2018-2019-1 《程序设计与数据结构》实验二报告

20172303 2018-2019-1 <程序设计与数据结构>实验二报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 范雯琪 学号:20172303 实验教师:王志强 助教:张师瑜/张之睿 实验日期:2018年11月5日 必修/选修: 必修 实验内容 本次实验主要是关于树的应用, 涉及了二叉树.决策树.表达式树.二叉查找树.红黑树五种树的类型,是对最近学习内容第十章和第十一章的一个总结. 节点一 参考教材P212,完成链树LinkedBinaryTree的实现(get

【二维树状数组】See you~

https://www.bnuoj.com/v3/contest_show.php?cid=9148#problem/F [题意] 给定一个矩阵,每个格子的初始值为1.现在可以对矩阵有四种操作: A x y n1 :给格点(x,y)的值加n1 D x y n1: 给格点(x,y)的值减n1,如果现在格点的值不够n1,把格点置0 M x1 y1 x2 y2:(x1,y1)移动给(x2,y2)n1个 S x1 y1 x2 y2 查询子矩阵的和 [思路] 当然是二维树状数组 但是一定要注意:lowbi

图形学_二维图形的剪裁_Sutherland-Hodgeman_Cohen—Sutherland

一.Cohen-Sutherland剪裁算法 1.基本思想 对于每条线段P1P2分为三种情况处理: (1)若P1P2完全在窗口内,则显示该线段P1P2. (2)若P1P2明显在窗口外,则丢弃该线段. (3)若线段不满足(1)或(2)的条件,则在交点处把线段分为两段.其中一段完全在窗口外,可弃之.然后对另一段重复上述处理. 为快速判断,采用如下编码方法: 将窗口边线两边沿长,得到九个区域,每一个区域都用一个四位二进制数标识,直线的端点都按其所处区域赋予相应的区域码,用来标识出端点相对于裁剪矩形边界