顶点数据的生成

 1 bool                        YfBuildStarVertices
 2 (
 3     Yreal                   radius,
 4     Yreal                   assistRadius,
 5     Yreal                   height,
 6     Yuint                   slices,
 7     YeOriginPose            originPose,
 8     Yuint                   vertexStriding,
 9     Yuint                   vertexPos,
10     void*                   pVerticesBuffer
11 )
12 {
13     if (slices < 2 || !pVerticesBuffer)
14     {
15         return false;
16     }
17
18     Yuint numVertices  = (slices*2) + 2;
19
20     // 顶点赋值
21     char* vertexPtr = (char*)pVerticesBuffer + vertexPos;
22     YsVector3* curVertexPtr   = NULL;
23     Yuint nOffset = 0;
24
25     Yreal originOffsetY = 0.0f;
26     if (originPose == YE_ORIGIN_POSE_TOP)
27     {
28         originOffsetY = -height;
29     }
30     else if (originPose == YE_ORIGIN_POSE_CENTER)
31     {
32         originOffsetY = -height * 0.5f;
33     }
34
35     // 顶赋值
36     {
37         nOffset = 0;
38         curVertexPtr = (YsVector3*)(vertexPtr + nOffset);
39         curVertexPtr->x = 0.0f;
40         curVertexPtr->y = height + originOffsetY;
41         curVertexPtr->z = 0.0f;
42     }
43
44     // 底赋值
45     {
46         nOffset = (numVertices - 1) * vertexStriding;
47         curVertexPtr = (YsVector3*)(vertexPtr + nOffset);
48         curVertexPtr->x = 0.0f;
49         curVertexPtr->y = originOffsetY;
50         curVertexPtr->z = 0.0f;
51     }
52
53     Yreal angleXZ;
54     Yreal posX, posZ;
55     Yreal fRadius;
56     for (Yuint i = 0; i < 2*slices; i++)
57     {
58         angleXZ = YD_REAL_TWAIN_PI * i / (slices*2);
59         posX = yf_sin(angleXZ);
60         posZ = yf_cos(angleXZ);
61         fRadius = (i%2 == 0) ? radius : assistRadius;
62
63         nOffset = (1 + i) * vertexStriding;
64         curVertexPtr = (YsVector3*)(vertexPtr + nOffset);
65         curVertexPtr->x = fRadius * posX;
66         curVertexPtr->y = originOffsetY;
67         curVertexPtr->z = fRadius * posZ;
68     }
69
70     return true;
71 }

三角形索引数据的生成

 1 bool                        YfBuildStarTriIndices
 2 (
 3     Yuint                   slices,
 4     YeIndexType             indexType,
 5     Yuint                   indexStriding,
 6     Yuint                   indexPos,
 7     void*                   pTriIndicesBuffer
 8 )
 9 {
10     if (slices < 2 || !pTriIndicesBuffer)
11     {
12         return false;
13     }
14
15     Yuint numVertices  = slices*2 + 2;
16     if (indexType == YE_INDEX_16_BIT &&
17         numVertices > YD_MAX_UNSIGNED_INT16)
18     {
19         return false;
20     }
21     Yuint numTriangles = slices * 4;
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 < 2 * slices; i++)
30         {
31             nOffset = (i * 2) * indexStriding;
32             triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset);
33             triIndexPtr->index0 = 0;
34             triIndexPtr->index1 = 1 + i;
35             triIndexPtr->index2 = 1 + (i + 1) % (2*slices);
36
37             nOffset += indexStriding;
38             triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset);
39             triIndexPtr->index0 = numVertices - 1;
40             triIndexPtr->index1 = 1 + (i + 1) % (2*slices);
41             triIndexPtr->index2 = 1 + i;
42         }
43     }
44     else
45     {
46         YsTriIndex32* triIndexPtr = NULL;
47         for (Yuint i = 0; i < 2 * slices; i++)
48         {
49             nOffset = (i * 2) * indexStriding;
50             triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);
51             triIndexPtr->index0 = 0;
52             triIndexPtr->index1 = 1 + i;
53             triIndexPtr->index2 = 1 + (i + 1) % (2*slices);
54
55             nOffset += indexStriding;
56             triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);
57             triIndexPtr->index0 = numVertices - 1;
58             triIndexPtr->index1 = 1 + (i + 1) % (2*slices);
59             triIndexPtr->index2 = 1 + i;
60         }
61     }
62
63     return true;
64 } 

线框索引数据的生成

 1 bool                        YfBuildStarWireIndices
 2 (
 3     Yuint                   slices,
 4     YeIndexType             indexType,
 5     Yuint                   indexStriding,
 6     Yuint                   indexPos,
 7     void*                   pWireIndicesBuffer
 8 )
 9 {
10     if (slices < 2 || !pWireIndicesBuffer)
11     {
12         return false;
13     }
14
15     Yuint numVertices = slices*2 + 2;
16     Yuint numLines    = slices * 5;
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 < 2 * slices; i++)
30         {
31             nOffset = (i * 2) * indexStriding;
32             lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
33             lineIndexPtr->index0 = 0;
34             lineIndexPtr->index1 = 1 + i;
35
36             nOffset += indexStriding;
37             lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
38             lineIndexPtr->index0 = 1 + i;
39             lineIndexPtr->index1 = 1 + (i + 1)%(slices*2);
40         }
41
42         Yuint half = 4 * slices * indexStriding;
43         for (Yuint i = 0; i < slices; i++)
44         {
45             nOffset = half + i * indexStriding;
46             lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
47             lineIndexPtr->index0 = numVertices - 1;
48             lineIndexPtr->index1 = 1 + i*2 + 1;
49         }
50     }
51     else
52     {
53         YsLineIndex32* lineIndexPtr = NULL;
54         for (Yuint i = 0; i < 2 * slices; i++)
55         {
56             nOffset = (i * 2) * indexStriding;
57             lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
58             lineIndexPtr->index0 = 0;
59             lineIndexPtr->index1 = 1 + i;
60
61             nOffset += indexStriding;
62             lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
63             lineIndexPtr->index0 = 1 + i;
64             lineIndexPtr->index1 = 1 + (i + 1)%(slices*2);
65         }
66
67         Yuint half = 4 * slices * indexStriding;
68         for (Yuint i = 0; i < slices; i++)
69         {
70             nOffset = half + i * indexStriding;
71             lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
72             lineIndexPtr->index0 = numVertices - 1;
73             lineIndexPtr->index1 = 1 + i*2 + 1;
74         }
75     }
76
77     return true;
78 }

转载于:https://www.cnblogs.com/WhyEngine/p/3415257.html

[15] 星星(Star)图形的生成算法相关推荐

  1. [20] 鼓状物(Drum)图形的生成算法

    顶点数据的生成 1 bool YfBuildDrumVertices 2 ( 3 Yreal radius, 4 Yreal assistRadius, 5 Yuint slices, 6 Yuint ...

  2. [17] 楼梯(Stairs)图形的生成算法

    感觉这图形怎么看怎么像搓衣板. 顶点数据的生成 bool YfBuildStairsVertices (Yreal width, Yreal length, Yreal height, Yuint s ...

  3. [16] 螺旋面(Spire)图形的生成算法

    顶点数据的生成 1 bool YfBuildSpireVertices 2 ( 3 Yreal radius, 4 Yreal assistRadius, 5 Yreal height, 6 Yuin ...

  4. [13] 弧面(Arc)图形的生成算法

    顶点数据的生成 1 bool YfBuildArcVertices 2 ( 3 Yreal radius, 4 Yreal degree, 5 Yreal height, 6 Yuint slices ...

  5. [18] 螺旋楼梯(Spiral Stairs)图形的生成算法

    顶点数据的生成 1 bool YfBuildSpiralStairsVertices 2 ( 3 Yreal radius, 4 Yreal assistRadius, 5 Yreal height, ...

  6. 3D几何图形的生成算法

    在之前的博客上,发布了一个我写的3D几何图形生成的DEMO: http://www.cnblogs.com/WhyEngine/p/3415040.html DEMO下载地址: http://file ...

  7. 计算机地图制图原理与算法,计算机地图制图原理与方法-基本图形生成算法.ppt...

    <计算机地图制图原理与方法-基本图形生成算法.ppt>由会员分享,可在线阅读,更多相关<计算机地图制图原理与方法-基本图形生成算法.ppt(35页珍藏版)>请在人人文库网上搜索 ...

  8. 图形算法:圆形生成算法

    图形算法:圆形生成算法 标签(空格分隔): 算法 版本:2 作者:陈小默 声明:禁止商用,禁止转载 发布于:作业部落.CSDN博客 圆的定义为所有距离中心位置 (xc,yc) 为定值 r 的点的集合1 ...

  9. 计算机图形生成的基本单位是,第五章 基本图形生成算法

    如何在指定的输出设备上根据坐标描述构造基本二维几何图形(点.直线.圆.椭圆.多边形域.字符串及其相关属性等). 图形生成的概念 图形的生成:是在指定的输出设备上,根据坐标描述构造二维几何图形. 图形的 ...

最新文章

  1. Android UI设计与开发】第03期:引导界面(三)仿微信引导界面以及动画效果
  2. 用lisp编写串口助手源代码_实战用python来写个串口助手--界面篇
  3. .NET全栈开发工程师学习路径
  4. 网络:窗口控制下的重发机制、流量控制
  5. 【Java每日一题】20170309
  6. sharding-jdbc整合mybatis
  7. java json删除节点_指定json的某个节点进行增、删、改
  8. 前端学习(1339):mongodb更新数据文档
  9. 又是一年毕业高峰期,分享下我的2年工作经验
  10. 小米组织架构再调整:手机部成立参谋部 朱磊出任参谋长
  11. Linux pid_t 类型的定义
  12. android jni示例_Android动画示例
  13. spark 连接mysql读取数据
  14. 我的U盘,在某台机器上所有文件大小为0
  15. 人力资源管理系统HRMS 天下三分 煮酒论英雄
  16. PHP实现微信网页登陆授权开发
  17. php 格林尼治标准时间,PHP函数第18款:返回格林威治标准时间MyDate
  18. python爬虫学习-scrapy爬取链家房源信息并存储
  19. DDD的创新思想:开发即设计思想
  20. 数字货币智能合约的概念与演变

热门文章

  1. MCU实战经验:多种的按键处理
  2. matplotlib subplot画子图
  3. 从源码分析DEARGUI之异步调用函数对比
  4. Web报表工具FineReport中JavaScript的使用
  5. 学习笔记:vsphere6 迁移物理机,指定被迁移的IP报错
  6. 大唐联仪推出下一代移动通信测试解决方案
  7. 第二课unit2 控制对文件的访问
  8. UVa 11624,两次BFS
  9. CSS,点击去除虚线边框代码
  10. 文件压缩和文件打包命令