热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

[9]圆环(Ring)图形的生成算法

顶点数据的生成1boolYfBuildRingVertices2(3Yrealradi


顶点数据的生成

 1 bool                        YfBuildRingVertices
2 (
3 Yreal radius,
4 Yreal assistRadius,
5 Yreal height,
6 Yuint slices,
7 Yuint stacks,
8 YeOriginPose originPose,
9 Yuint vertexStriding,
10 Yuint vertexPos,
11 void* pVerticesBuffer
12 )
13 {
14 if (slices <2 || stacks <3 || !pVerticesBuffer)
15 {
16 return false;
17 }
18
19 Yuint numVertices = slices * stacks;
20 Yuint numTriangles = slices * stacks * 2;
21
22 char* vertexPtr = (char*)pVerticesBuffer + vertexPos;
23 YsVector3* curVertexPtr = NULL;
24 Yuint nOffset = 0;
25
26 Yreal halfHeight = height * 0.5f;
27 Yreal originOffsetY = 0.0f;
28 if (originPose == YE_ORIGIN_POSE_TOP)
29 {
30 originOffsetY = -halfHeight;
31 }
32 else if (originPose == YE_ORIGIN_POSE_BOTTOM)
33 {
34 originOffsetY = halfHeight;
35 }
36
37 Yreal angle, s, c;
38 YsVector3* initVerticesPtr = new YsVector3[slices + 1];
39 for (Yuint j = 0; j )
40 {
41 angle = YD_REAL_TWAIN_PI * j / slices;
42 s = yf_sin(angle);
43 c = yf_cos(angle);
44 initVerticesPtr[j].x = radius + assistRadius*s;
45 initVerticesPtr[j].y = halfHeight*c + originOffsetY;
46 initVerticesPtr[j].z = 0.0f;
47 }
48
49 for (Yuint i = 0; i )
50 {
51 angle = YD_REAL_TWAIN_PI * i / stacks;
52 s = yf_sin(angle);
53 c = yf_cos(angle);
54
55 for (Yuint j = 0; j )
56 {
57 nOffset = (i * slices + j) * vertexStriding;
58 curVertexPtr = (YsVector3*)(vertexPtr + nOffset);
59 curVertexPtr->x = initVerticesPtr[j].x * s;
60 curVertexPtr->y = initVerticesPtr[j].y;
61 curVertexPtr->z = initVerticesPtr[j].x * c;
62 }
63 }
64
65 YD_SAFE_DELETE_ARRAY(initVerticesPtr);
66
67 return true;
68 }

 

三角形索引数据的生成

 

 1 bool                        YfBuildRingTriIndices
2 (
3 Yuint slices,
4 Yuint stacks,
5 YeIndexType indexType,
6 Yuint indexStriding,
7 Yuint indexPos,
8 void* pTriIndicesBuffer
9 )
10 {
11 if (slices <2 || stacks <3 || !pTriIndicesBuffer)
12 {
13 return false;
14 }
15
16 Yuint numVertices = slices * stacks;
17 Yuint numTriangles = slices * stacks * 2;
18 if (indexType == YE_INDEX_16_BIT &&
19 numVertices > YD_MAX_UNSIGNED_INT16)
20 {
21 return false;
22 }
23
24 // 索引赋值
25 char* indexPtr = (char*)pTriIndicesBuffer + indexPos;
26 Yuint nOffset = 0;
27 if (indexType == YE_INDEX_16_BIT)
28 {
29 YsTriIndex16* triIndexPtr = NULL;
30 for (Yuint i = 0; i )
31 {
32 for (Yuint j = 0; j )
33 {
34 nOffset = (i*slices + j)*2 * indexStriding;
35 triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset);
36 triIndexPtr->index0 = slices * i + j;
37 triIndexPtr->index1 = slices * i + (j + 1)%slices;
38 triIndexPtr->index2 = slices * ((i + 1) % stacks) + j;
39
40 nOffset += indexStriding;
41 triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset);
42 triIndexPtr->index0 = slices * i + (j + 1)%slices;
43 triIndexPtr->index1 = slices * ((i + 1) % stacks) + (j + 1)%slices;
44 triIndexPtr->index2 = slices * ((i + 1) % stacks) + j;
45 }
46 }
47 }
48 else
49 {
50 YsTriIndex32* triIndexPtr = NULL;
51 for (Yuint i = 0; i )
52 {
53 for (Yuint j = 0; j )
54 {
55 nOffset = (i*slices + j)*2 * indexStriding;
56 triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);
57 triIndexPtr->index0 = slices * i + j;
58 triIndexPtr->index1 = slices * i + (j + 1)%slices;
59 triIndexPtr->index2 = slices * ((i + 1) % stacks) + j;
60
61 nOffset += indexStriding;
62 triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);
63 triIndexPtr->index0 = slices * i + (j + 1)%slices;
64 triIndexPtr->index1 = slices * ((i + 1) % stacks) + (j + 1)%slices;
65 triIndexPtr->index2 = slices * ((i + 1) % stacks) + j;
66 }
67 }
68 }
69
70 return true;
71 }

 

线框索引数据的生成

 1 bool                        YfBuildRingWireIndices
2 (
3 Yuint slices,
4 Yuint stacks,
5 YeIndexType indexType,
6 Yuint indexStriding,
7 Yuint indexPos,
8 void* pWireIndicesBuffer
9 )
10 {
11 if (slices <2 || !pWireIndicesBuffer)
12 {
13 return false;
14 }
15
16 Yuint numVertices = slices * stacks;
17 Yuint numLines = slices * stacks * 2;
18 if (indexType == YE_INDEX_16_BIT &&
19 numVertices > YD_MAX_UNSIGNED_INT16)
20 {
21 return false;
22 }
23
24 // 索引赋值
25 char* indexPtr = (char*)pWireIndicesBuffer + indexPos;
26 Yuint nOffset = 0;
27 if (indexType == YE_INDEX_16_BIT)
28 {
29 YsLineIndex16* lineIndexPtr = NULL;
30 for (Yuint i = 0; i )
31 {
32 for (Yuint j = 0; j )
33 {
34 nOffset = (i*slices + j) * 2 * indexStriding;
35 lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
36 lineIndexPtr->index0 = slices * i + j;
37 lineIndexPtr->index1 = slices * i + (j + 1)%slices;
38
39 nOffset += indexStriding;
40 lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
41 lineIndexPtr->index0 = slices * i + j;
42 lineIndexPtr->index1 = slices * ((i + 1) % stacks) + j;
43 }
44 }
45 }
46 else
47 {
48 YsLineIndex32* lineIndexPtr = NULL;
49 for (Yuint i = 0; i )
50 {
51 for (Yuint j = 0; j )
52 {
53 nOffset = (i*slices + j) * 2 * indexStriding;
54 lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
55 lineIndexPtr->index0 = slices * i + j;
56 lineIndexPtr->index1 = slices * i + (j + 1)%slices;
57
58 nOffset += indexStriding;
59 lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
60 lineIndexPtr->index0 = slices * i + j;
61 lineIndexPtr->index1 = slices * ((i + 1) % stacks) + j;
62 }
63 }
64 }
65
66 return true;
67 }

 


推荐阅读
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • Java 11相对于Java 8,OptaPlanner性能提升有多大?
    本文通过基准测试比较了Java 11和Java 8对OptaPlanner的性能提升。测试结果表明,在相同的硬件环境下,Java 11相对于Java 8在垃圾回收方面表现更好,从而提升了OptaPlanner的性能。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文介绍了汉诺塔问题的迭代算法实现,通过递归的方式将盘子从一个地方搬到另一个地方,并打印出移动的顺序。详细介绍了算法的思路和步骤,以及示例代码的运行结果。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 本文讲述了CodeForces1016C题目的解法。文章首先介绍了一种错误的理解,然后给出了正确的解法。其中,当位于一个角上时,有两种选择,一种是先一直走一行再返回来走,另一种是走到这一列的另一行上然后再往右走一列。作者给出了两种解法,一种是直接计算,一种是动态规划。最后,取两种解法的最优解作为答案。文章附上了源代码。 ... [详细]
author-avatar
小桃爱学PHP
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有