[17] 楼梯(Stairs)图形的生成算法
感觉这图形怎么看怎么像搓衣板.
顶点数据的生成
- bool YfBuildStairsVertices
- (
- Yreal width,
- Yreal length,
- Yreal height,
- Yuint stacks,
- YeOriginPose originPose,
- Yuint vertexStriding,
- Yuint vertexPos,
- void* pVerticesBuffer
- )
- {
- if (stacks < || !pVerticesBuffer)
- {
- return false;
- }
- Yuint numVertices = + stacks * ;
- //Yuint numTriangles = stacks * 8;
- char* vertexPtr = (char*)pVerticesBuffer + vertexPos;
- YsVector3* curVertexPtr = NULL;
- Yuint nOffset = ;
- YsVector3 vOriginOffset(-width / , -height / , -length / );
- if (originPose == YE_ORIGIN_POSE_TOP)
- {
- vOriginOffset.y = -height;
- }
- else if (originPose == YE_ORIGIN_POSE_BOTTOM)
- {
- vOriginOffset.y = 0.0f;
- }
- Yreal fStepLength = length / stacks;
- Yreal fStepHeight = height / stacks;
- for (Yuint i = ; i <= stacks; i++)
- {
- nOffset = i * * vertexStriding;
- curVertexPtr = (YsVector3*)(vertexPtr + nOffset);
- curVertexPtr->x = vOriginOffset.x;
- curVertexPtr->y = i * fStepHeight + vOriginOffset.y;
- curVertexPtr->z = i * fStepLength + vOriginOffset.z;
- nOffset += vertexStriding;
- curVertexPtr = (YsVector3*)(vertexPtr + nOffset);
- curVertexPtr->x = width + vOriginOffset.x;
- curVertexPtr->y = i * fStepHeight + vOriginOffset.y;
- curVertexPtr->z = i * fStepLength + vOriginOffset.z;
- if (i == stacks)
- {
- continue;
- }
- nOffset += vertexStriding;
- curVertexPtr = (YsVector3*)(vertexPtr + nOffset);
- curVertexPtr->x = vOriginOffset.x;
- curVertexPtr->y = (i+) * fStepHeight + vOriginOffset.y;
- curVertexPtr->z = i * fStepLength + vOriginOffset.z;
- nOffset += vertexStriding;
- curVertexPtr = (YsVector3*)(vertexPtr + nOffset);
- curVertexPtr->x = width + vOriginOffset.x;
- curVertexPtr->y = (i+) * fStepHeight + vOriginOffset.y;
- curVertexPtr->z = i * fStepLength + vOriginOffset.z;
- }
- return true;
- }
三角形索引数据的生成
- bool YfBuildStairsTriIndices
- (
- Yuint stacks,
- YeIndexType indexType,
- Yuint indexStriding,
- Yuint indexPos,
- void* pTriIndicesBuffer
- )
- {
- if (stacks < || !pTriIndicesBuffer)
- {
- return false;
- }
- Yuint numVertices = + stacks * ;
- Yuint numTriangles = stacks * ;
- if (indexType == YE_INDEX_16_BIT &&
- numVertices > YD_MAX_UNSIGNED_INT16)
- {
- return false;
- }
- // 索引赋值
- char* indexPtr = (char*)pTriIndicesBuffer + indexPos;
- Yuint nOffset = ;
- if (indexType == YE_INDEX_16_BIT)
- {
- YsTriIndex16* triIndexPtr = NULL;
- for (Yuint i = ; i < stacks; i++)
- {
- nOffset = * i * indexStriding;
- triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset);
- triIndexPtr->index0 = i* + ;
- triIndexPtr->index1 = i* + ;
- triIndexPtr->index2 = i* + ;
- nOffset += indexStriding;
- triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset);
- triIndexPtr->index0 = i* + ;
- triIndexPtr->index1 = i* + ;
- triIndexPtr->index2 = i* + ;
- nOffset += indexStriding;
- triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset);
- triIndexPtr->index0 = i* + ;
- triIndexPtr->index1 = i* + ;
- triIndexPtr->index2 = i* + ;
- nOffset += indexStriding;
- triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset);
- triIndexPtr->index0 = i* + ;
- triIndexPtr->index1 = i* + ;
- triIndexPtr->index2 = i* + ;
- nOffset += indexStriding;
- triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset);
- triIndexPtr->index0 = i* + ;
- triIndexPtr->index1 = i* + ;
- triIndexPtr->index2 = i* + ;
- nOffset += indexStriding;
- triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset);
- triIndexPtr->index0 = i* + ;
- triIndexPtr->index1 = i* + ;
- triIndexPtr->index2 = i* + ;
- nOffset += indexStriding;
- triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset);
- triIndexPtr->index0 = i* + ;
- triIndexPtr->index1 = i* + ;
- triIndexPtr->index2 = i* + ;
- nOffset += indexStriding;
- triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset);
- triIndexPtr->index0 = i* + ;
- triIndexPtr->index1 = i* + ;
- triIndexPtr->index2 = i* + ;
- }
- }
- else
- {
- YsTriIndex32* triIndexPtr = NULL;
- for (Yuint i = ; i < stacks; i++)
- {
- nOffset = * i * indexStriding;
- triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);
- triIndexPtr->index0 = i* + ;
- triIndexPtr->index1 = i* + ;
- triIndexPtr->index2 = i* + ;
- nOffset += indexStriding;
- triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);
- triIndexPtr->index0 = i* + ;
- triIndexPtr->index1 = i* + ;
- triIndexPtr->index2 = i* + ;
- nOffset += indexStriding;
- triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);
- triIndexPtr->index0 = i* + ;
- triIndexPtr->index1 = i* + ;
- triIndexPtr->index2 = i* + ;
- nOffset += indexStriding;
- triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);
- triIndexPtr->index0 = i* + ;
- triIndexPtr->index1 = i* + ;
- triIndexPtr->index2 = i* + ;
- nOffset += indexStriding;
- triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);
- triIndexPtr->index0 = i* + ;
- triIndexPtr->index1 = i* + ;
- triIndexPtr->index2 = i* + ;
- nOffset += indexStriding;
- triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);
- triIndexPtr->index0 = i* + ;
- triIndexPtr->index1 = i* + ;
- triIndexPtr->index2 = i* + ;
- nOffset += indexStriding;
- triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);
- triIndexPtr->index0 = i* + ;
- triIndexPtr->index1 = i* + ;
- triIndexPtr->index2 = i* + ;
- nOffset += indexStriding;
- triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);
- triIndexPtr->index0 = i* + ;
- triIndexPtr->index1 = i* + ;
- triIndexPtr->index2 = i* + ;
- }
- }
- return true;
- }
线框索引数据的生成
- bool YfBuildStairsWireIndices
- (
- Yuint stacks,
- YeIndexType indexType,
- Yuint indexStriding,
- Yuint indexPos,
- void* pWireIndicesBuffer
- )
- {
- if (stacks < || !pWireIndicesBuffer)
- {
- return false;
- }
- Yuint numVertices = + stacks * ;
- Yuint numLines = + stacks * ;
- if (indexType == YE_INDEX_16_BIT &&
- numVertices > YD_MAX_UNSIGNED_INT16)
- {
- return false;
- }
- // 索引赋值
- char* indexPtr = (char*)pWireIndicesBuffer + indexPos;
- Yuint nOffset = ;
- if (indexType == YE_INDEX_16_BIT)
- {
- YsLineIndex16* lineIndexPtr = NULL;
- for (Yuint i = ; i < stacks; i++)
- {
- nOffset = (i * ) * indexStriding;
- lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
- lineIndexPtr->index0 = i * + ;
- lineIndexPtr->index1 = i * + ;
- nOffset += indexStriding;
- lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
- lineIndexPtr->index0 = i * + ;
- lineIndexPtr->index1 = i * + ;
- nOffset += indexStriding;
- lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
- lineIndexPtr->index0 = i * + ;
- lineIndexPtr->index1 = i * + ;
- nOffset += indexStriding;
- lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
- lineIndexPtr->index0 = i * + ;
- lineIndexPtr->index1 = i * + ;
- nOffset += indexStriding;
- lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
- lineIndexPtr->index0 = i * + ;
- lineIndexPtr->index1 = i * + ;
- nOffset += indexStriding;
- lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
- lineIndexPtr->index0 = i * + ;
- lineIndexPtr->index1 = i * + ;
- nOffset += indexStriding;
- lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
- lineIndexPtr->index0 = i * + ;
- lineIndexPtr->index1 = i * + ;
- nOffset += indexStriding;
- lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
- lineIndexPtr->index0 = i * + ;
- lineIndexPtr->index1 = i * + ;
- }
- nOffset = (stacks * ) * indexStriding;
- lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
- lineIndexPtr->index0 = stacks * ;
- lineIndexPtr->index1 = stacks * + ;
- }
- else
- {
- YsLineIndex32* lineIndexPtr = NULL;
- for (Yuint i = ; i < stacks; i++)
- {
- nOffset = (i * ) * indexStriding;
- lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
- lineIndexPtr->index0 = i * + ;
- lineIndexPtr->index1 = i * + ;
- nOffset += indexStriding;
- lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
- lineIndexPtr->index0 = i * + ;
- lineIndexPtr->index1 = i * + ;
- nOffset += indexStriding;
- lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
- lineIndexPtr->index0 = i * + ;
- lineIndexPtr->index1 = i * + ;
- nOffset += indexStriding;
- lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
- lineIndexPtr->index0 = i * + ;
- lineIndexPtr->index1 = i * + ;
- nOffset += indexStriding;
- lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
- lineIndexPtr->index0 = i * + ;
- lineIndexPtr->index1 = i * + ;
- nOffset += indexStriding;
- lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
- lineIndexPtr->index0 = i * + ;
- lineIndexPtr->index1 = i * + ;
- nOffset += indexStriding;
- lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
- lineIndexPtr->index0 = i * + ;
- lineIndexPtr->index1 = i * + ;
- nOffset += indexStriding;
- lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
- lineIndexPtr->index0 = i * + ;
- lineIndexPtr->index1 = i * + ;
- }
- nOffset = (stacks * ) * indexStriding;
- lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
- lineIndexPtr->index0 = stacks * ;
- lineIndexPtr->index1 = stacks * + ;
- }
- return true;
- }
[17] 楼梯(Stairs)图形的生成算法的更多相关文章
- [18] 螺旋楼梯(Spiral Stairs)图形的生成算法
顶点数据的生成 bool YfBuildSpiralStairsVertices ( Yreal radius, Yreal assistRadius, Yreal height, Yuint sli ...
- [20] 鼓状物(Drum)图形的生成算法
顶点数据的生成 bool YfBuildDrumVertices ( Yreal radius, Yreal assistRadius, Yuint slices, Yuint stacks, YeO ...
- [19] 半球形(Hemisphere)图形的生成算法
顶点数据的生成 bool YfBuildHemisphereVertices ( Yreal radius, Yuint slices, Yuint stacks, YeOriginPose orig ...
- [16] 螺旋面(Spire)图形的生成算法
顶点数据的生成 bool YfBuildSpireVertices ( Yreal radius, Yreal assistRadius, Yreal height, Yuint slices, Yu ...
- [15] 星星(Star)图形的生成算法
顶点数据的生成 bool YfBuildStarVertices ( Yreal radius, Yreal assistRadius, Yreal height, Yuint slices, YeO ...
- [14] 齿轮(Gear Wheel)图形的生成算法
顶点数据的生成 bool YfBuildGearwheelVertices ( Yreal radius, Yreal assistRadius, Yreal height, Yuint slices ...
- [13] 弧面(Arc)图形的生成算法
顶点数据的生成 bool YfBuildArcVertices ( Yreal radius, Yreal degree, Yreal height, Yuint slices, Yuint stac ...
- [12] 扇形体(Fan)图形的生成算法
顶点数据的生成 bool YfBuildFunVertices ( Yreal radius, Yreal degree, Yreal height, Yuint slices, YeOriginPo ...
- [11] 楔形体(Wedge)图形的生成算法
顶点数据的生成 bool YfBuildWedgeVertices ( Yreal width, Yreal length, Yreal height, YeOriginPose originPose ...
随机推荐
- mysql分布式集群实现原理
做MySQL集群,例如:利用mysql cluster ,mysql proxy,mysql replication,drdb等等 有人会问mysql集群,根分表有什么关系吗?虽然它不是实际意义上的分 ...
- 使用 Python 读取火狐的 cookies
这事本来是有个 browsercookie 库可以做的,但是初看它就有不少问题: 不能指定要使用的火狐 profile(后来发现可以指定数据库文件). 找不到 sessionstore.js 文件时会 ...
- [ 原创 ] Java基础8--什么叫做重载
重载是在同一个类中,有多个方法名相同,参数列表不同(参数个数不同,参数类型不同),与方法的返回值无关,与权限修饰符无关,B中的参数列表和题目的方法完全一样了.
- flask使用flask_sqlalchemy连接数据库(python2.7)
1.出现编码问题 解决方法: #连接数据库时出现编码问题,需要pip install mysql-connector-python,并且数据库配置修改为 import mysql.connector ...
- C# 集合类-接口
所谓,程序=数据结构+算法. 我目前的日常工作就是繁琐的业务流程和增删改查之类的. 其实繁琐的业务流程也不过是改变一下数据的状态.怪不得叫,面向数据库编程.哈哈. 所以呢,了解一下各种 .net内置的 ...
- Navicat Premium 激活码 序列号。破解版。
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha Navicat Premium 激活码 序列号.破解版.
- luoguP4466 [国际集训队]和与积 莫比乌斯反演
自然想到枚举\(gcd(a, b)\),不妨设其为\(d\),并且\(a = di, b = dj(a > b)\) 那么\(\frac{ab}{a + b} = \frac{dij}{i + ...
- Atcoder681 Typical DP Contest E.数 数位dp
写什么递归....非递归多好写 令$f[i][j]$表示前$i$位的和在模$d$意义下为$j$的方案数,然后转移即可 复杂度$O(10000 * 100 * 10)$ 注意非递归建议高位摆第$n$位. ...
- mysql长连接
长连接是干嘛的: 它是做连接复用的: 在openresty中的lua-resty-mysql 里 connect方法去连接mysql时会去ngx_lua cosocket连接池中寻找是否有可用连接 ...
- HDU 5698 瞬间移动 数学
瞬间移动 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5698 Description 有一个无限大的矩形,初始时你在左上角(即第一行第一列),每次 ...