[16] 螺旋面(Spire)图形的生成算法
顶点数据的生成
1 bool YfBuildSpireVertices 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 (stacks < 1 || slices < 3 || !pVerticesBuffer) 15 { 16 return false; 17 } 18 19 Yuint numVertices = 2 + stacks * 2; 20 //Yuint numTriangles = stacks * 2; 21 22 char* vertexPtr = (char*)pVerticesBuffer + vertexPos; 23 YsVector3* curVertexPtr = NULL; 24 Yuint nOffset = 0; 25 26 Yreal originOffsetY = 0.0f; 27 if (originPose == YE_ORIGIN_POSE_TOP) 28 { 29 originOffsetY = -height; 30 } 31 else if (originPose == YE_ORIGIN_POSE_CENTER) 32 { 33 originOffsetY = -height * 0.5f; 34 } 35 36 Yreal fAngle = YD_REAL_TWAIN_PI / slices; 37 38 Yreal angleXZ; 39 Yreal posX, posZ; 40 for (Yuint i = 0; i <= stacks; i++) 41 { 42 angleXZ = i * fAngle; 43 posX = yf_sin(angleXZ); 44 posZ = yf_cos(angleXZ); 45 nOffset = i * 2 * vertexStriding; 46 47 curVertexPtr = (YsVector3*)(vertexPtr + nOffset); 48 curVertexPtr->x = assistRadius * posX; 49 curVertexPtr->y = height * i * 1.0f / stacks + originOffsetY; 50 curVertexPtr->z = assistRadius * posZ; 51 52 nOffset += vertexStriding; 53 54 curVertexPtr = (YsVector3*)(vertexPtr + nOffset); 55 curVertexPtr->x = radius * posX; 56 curVertexPtr->y = height * i * 1.0f / stacks + originOffsetY; 57 curVertexPtr->z = radius * posZ; 58 } 59 60 return true; 61 }
三角形索引数据的生成
1 bool YfBuildSpireTriIndices 2 ( 3 Yuint stacks, 4 YeIndexType indexType, 5 Yuint indexStriding, 6 Yuint indexPos, 7 void* pTriIndicesBuffer 8 ) 9 { 10 if (stacks < 3 || !pTriIndicesBuffer) 11 { 12 return false; 13 } 14 15 Yuint numVertices = 2 + stacks * 2; 16 Yuint numTriangles = stacks * 2; 17 if (indexType == YE_INDEX_16_BIT && 18 numVertices > YD_MAX_UNSIGNED_INT16) 19 { 20 return false; 21 } 22 23 // 索引赋值 24 char* indexPtr = (char*)pTriIndicesBuffer + indexPos; 25 Yuint nOffset = 0; 26 if (indexType == YE_INDEX_16_BIT) 27 { 28 YsTriIndex16* triIndexPtr = NULL; 29 for (Yuint i = 0; i < stacks; i++) 30 { 31 nOffset = 2 * i * indexStriding; 32 triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset); 33 triIndexPtr->index0 = i*2; 34 triIndexPtr->index1 = i*2 + 1; 35 triIndexPtr->index2 = i*2 + 3; 36 37 nOffset += indexStriding; 38 triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset); 39 triIndexPtr->index0 = i*2; 40 triIndexPtr->index1 = i*2 + 3; 41 triIndexPtr->index2 = i*2 + 2; 42 } 43 } 44 else 45 { 46 YsTriIndex32* triIndexPtr = NULL; 47 for (Yuint i = 0; i < stacks; i++) 48 { 49 nOffset = 2 * i * indexStriding; 50 triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset); 51 triIndexPtr->index0 = i*2; 52 triIndexPtr->index1 = i*2 + 1; 53 triIndexPtr->index2 = i*2 + 3; 54 55 nOffset += indexStriding; 56 triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset); 57 triIndexPtr->index0 = i*2; 58 triIndexPtr->index1 = i*2 + 3; 59 triIndexPtr->index2 = i*2 + 2; 60 } 61 } 62 63 return true; 64 }
线框索引数据的生成
1 bool YfBuildSpireWireIndices 2 ( 3 Yuint stacks, 4 YeIndexType indexType, 5 Yuint indexStriding, 6 Yuint indexPos, 7 void* pWireIndicesBuffer 8 ) 9 { 10 if (stacks < 3 || !pWireIndicesBuffer) 11 { 12 return false; 13 } 14 15 Yuint numVertices = 2 + stacks * 2; 16 Yuint numLines = 1 + stacks * 3; 17 if (indexType == YE_INDEX_16_BIT && 18 numVertices > YD_MAX_UNSIGNED_INT16) 19 { 20 return false; 21 } 22 23 // 索引赋值 24 char* indexPtr = (char*)pWireIndicesBuffer + indexPos; 25 Yuint nOffset = 0; 26 if (indexType == YE_INDEX_16_BIT) 27 { 28 YsLineIndex16* lineIndexPtr = NULL; 29 for (Yuint i = 0; i < stacks; i++) 30 { 31 nOffset = (i * 3) * indexStriding; 32 lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset); 33 lineIndexPtr->index0 = i * 2; 34 lineIndexPtr->index1 = i * 2 + 1; 35 36 nOffset += indexStriding; 37 lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset); 38 lineIndexPtr->index0 = i * 2 + 2; 39 lineIndexPtr->index1 = i * 2; 40 41 nOffset += indexStriding; 42 lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset); 43 lineIndexPtr->index0 = i * 2 + 3; 44 lineIndexPtr->index1 = i * 2 + 1; 45 } 46 47 nOffset = (stacks * 3) * indexStriding; 48 lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset); 49 lineIndexPtr->index0 = stacks * 2; 50 lineIndexPtr->index1 = stacks * 2 + 1; 51 } 52 else 53 { 54 YsLineIndex32* lineIndexPtr = NULL; 55 for (Yuint i = 0; i < stacks; i++) 56 { 57 nOffset = (i * 3) * indexStriding; 58 lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset); 59 lineIndexPtr->index0 = i * 2; 60 lineIndexPtr->index1 = i * 2 + 1; 61 62 nOffset += indexStriding; 63 lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset); 64 lineIndexPtr->index0 = i * 2 + 2; 65 lineIndexPtr->index1 = i * 2; 66 67 nOffset += indexStriding; 68 lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset); 69 lineIndexPtr->index0 = i * 2 + 3; 70 lineIndexPtr->index1 = i * 2 + 1; 71 } 72 73 nOffset = (stacks * 3) * indexStriding; 74 lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset); 75 lineIndexPtr->index0 = stacks * 2; 76 lineIndexPtr->index1 = stacks * 2 + 1; 77 } 78 79 return true; 80 }
转载于:https://www.cnblogs.com/WhyEngine/p/3415258.html
[16] 螺旋面(Spire)图形的生成算法相关推荐
- [20] 鼓状物(Drum)图形的生成算法
顶点数据的生成 1 bool YfBuildDrumVertices 2 ( 3 Yreal radius, 4 Yreal assistRadius, 5 Yuint slices, 6 Yuint ...
- [17] 楼梯(Stairs)图形的生成算法
感觉这图形怎么看怎么像搓衣板. 顶点数据的生成 bool YfBuildStairsVertices (Yreal width, Yreal length, Yreal height, Yuint s ...
- [15] 星星(Star)图形的生成算法
顶点数据的生成 1 bool YfBuildStarVertices 2 ( 3 Yreal radius, 4 Yreal assistRadius, 5 Yreal height, 6 Yuint ...
- [13] 弧面(Arc)图形的生成算法
顶点数据的生成 1 bool YfBuildArcVertices 2 ( 3 Yreal radius, 4 Yreal degree, 5 Yreal height, 6 Yuint slices ...
- [18] 螺旋楼梯(Spiral Stairs)图形的生成算法
顶点数据的生成 1 bool YfBuildSpiralStairsVertices 2 ( 3 Yreal radius, 4 Yreal assistRadius, 5 Yreal height, ...
- 3D几何图形的生成算法
在之前的博客上,发布了一个我写的3D几何图形生成的DEMO: http://www.cnblogs.com/WhyEngine/p/3415040.html DEMO下载地址: http://file ...
- 计算机地图制图原理与算法,计算机地图制图原理与方法-基本图形生成算法.ppt...
<计算机地图制图原理与方法-基本图形生成算法.ppt>由会员分享,可在线阅读,更多相关<计算机地图制图原理与方法-基本图形生成算法.ppt(35页珍藏版)>请在人人文库网上搜索 ...
- 图形算法:圆形生成算法
图形算法:圆形生成算法 标签(空格分隔): 算法 版本:2 作者:陈小默 声明:禁止商用,禁止转载 发布于:作业部落.CSDN博客 圆的定义为所有距离中心位置 (xc,yc) 为定值 r 的点的集合1 ...
- 计算机图形生成的基本单位是,第五章 基本图形生成算法
如何在指定的输出设备上根据坐标描述构造基本二维几何图形(点.直线.圆.椭圆.多边形域.字符串及其相关属性等). 图形生成的概念 图形的生成:是在指定的输出设备上,根据坐标描述构造二维几何图形. 图形的 ...
最新文章
- chrome dev debug network 的timeline说明
- 使用 openssl反弹加密 shell
- Spring使用Quartz配置调度事务
- ubuntu: Authentication failure的解决办法
- 【笔记】 感受野与权值共享 摄像头标定 相机坐标与世界坐标
- mysql innodb_undo_directory默认_MySQL innodb_undo_tablespaces相关参数
- Linq表达式、Lambda表达式你更喜欢哪个?
- 使用OpenSSL加密,使用Java解密,使​​用OpenSSL RSA公钥
- 图像处理之积分图应用三(基于NCC快速相似度匹配算法)
- 数据结构与算法-黑盒与白盒测试法
- python sql注入脚本_python辅助sql手工注入猜解数据库案例分析
- Java教程:Java String字符串和整型int的相互转换
- Ice-E(Embedded Internet Communications Engine)移植到s3c2440A(arm9)linux(2.6.12)上的 -转
- 10 个最佳地理空间数据分析 GIS 软件
- 使用js打印网页局部图片(内容)
- 抖音小程序开发所遇到的问题
- 拯救者15isk加装固态硬盘
- 怎么去除WORD的背景颜色
- Java:BigDecimal的学习与使用
- 解决eclipse: Resource is out of sync with the file system 报错问题
热门文章
- 数字货币EOS半年时间暴跌90%多,还可追捧吗?
- javascript晚绑定_JavaScript的应用,调用和绑定通过托管野餐来解释
- 数据结构中等号表示什么_通过分析2016年最重要的252个中等故事我学到了什么...
- python描述器做权限控制_Python装饰器14-描述器
- 泛型java博客园,Java深度历险之Java泛型
- powerdesigner类图在子类中显示从父类继承来的方法
- TCP/IP:IP选项处理
- C++ Primer(第4版)(评注版)
- 【踩坑记录】记一次MySQL主从复制延迟的坑
- 在 Android 应用程序中使用 SQLite 数据库以及怎么用