博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[12] 扇形体(Fan)图形的生成算法
阅读量:6948 次
发布时间:2019-06-27

本文共 12461 字,大约阅读时间需要 41 分钟。

顶点数据的生成

 

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

 

三角形索引数据的生成

 

1 bool                        YfBuildFunTriIndices  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 + 1) * 2; 16     Yuint numTriangles = slices * 4; 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 < slices - 1; i++) 30         { 31             nOffset = (i * 4) * indexStriding; 32             triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset); 33             triIndexPtr->index0 = 0; 34             triIndexPtr->index1 = 1 + i; 35             triIndexPtr->index2 = 1 + i + 1; 36  37             nOffset += indexStriding; 38             triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset); 39             triIndexPtr->index0 = numVertices - 1; 40             triIndexPtr->index1 = 1 + slices + i + 1; 41             triIndexPtr->index2 = 1 + slices + i; 42  43             nOffset += indexStriding; 44             triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset); 45             triIndexPtr->index0 = 1 + i; 46             triIndexPtr->index1 = 1 + slices + i; 47             triIndexPtr->index2 = 1 + i + 1; 48  49             nOffset += indexStriding; 50             triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset); 51             triIndexPtr->index0 = 1 + i + 1; 52             triIndexPtr->index1 = 1 + slices + i; 53             triIndexPtr->index2 = 1 + slices + i + 1; 54         } 55  56         nOffset = ((slices - 1) * 4) * indexStriding; 57         triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset); 58         triIndexPtr->index0 = 0; 59         triIndexPtr->index1 = numVertices - 1; 60         triIndexPtr->index2 = 1; 61  62         nOffset += indexStriding; 63         triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset); 64         triIndexPtr->index0 = 1; 65         triIndexPtr->index1 = numVertices - 1; 66         triIndexPtr->index2 = 1 + slices; 67  68         nOffset += indexStriding; 69         triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset); 70         triIndexPtr->index0 = 0; 71         triIndexPtr->index1 = slices; 72         triIndexPtr->index2 = numVertices - 1; 73  74         nOffset += indexStriding; 75         triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset); 76         triIndexPtr->index0 = slices; 77         triIndexPtr->index1 = numVertices - 2; 78         triIndexPtr->index2 = numVertices - 1; 79     } 80     else 81     { 82         YsTriIndex32* triIndexPtr = NULL; 83         for (Yuint i = 0; i < slices - 1; i++) 84         { 85             nOffset = (i * 4) * indexStriding; 86             triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset); 87             triIndexPtr->index0 = 0; 88             triIndexPtr->index1 = 1 + i; 89             triIndexPtr->index2 = 1 + i + 1; 90  91             nOffset += indexStriding; 92             triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset); 93             triIndexPtr->index0 = numVertices - 1; 94             triIndexPtr->index1 = 1 + slices + i + 1; 95             triIndexPtr->index2 = 1 + slices + i; 96  97             nOffset += indexStriding; 98             triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset); 99             triIndexPtr->index0 = 1 + i;100             triIndexPtr->index1 = 1 + slices + i;101             triIndexPtr->index2 = 1 + i + 1;102 103             nOffset += indexStriding;104             triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);105             triIndexPtr->index0 = 1 + i + 1;106             triIndexPtr->index1 = 1 + slices + i;107             triIndexPtr->index2 = 1 + slices + i + 1;108         }109 110         nOffset = ((slices - 1) * 4) * indexStriding;111         triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);112         triIndexPtr->index0 = 0;113         triIndexPtr->index1 = numVertices - 1;114         triIndexPtr->index2 = 1;115 116         nOffset += indexStriding;117         triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);118         triIndexPtr->index0 = 1;119         triIndexPtr->index1 = numVertices - 1;120         triIndexPtr->index2 = 1 + slices;121 122         nOffset += indexStriding;123         triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);124         triIndexPtr->index0 = 0;125         triIndexPtr->index1 = slices;126         triIndexPtr->index2 = numVertices - 1;127 128         nOffset += indexStriding;129         triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);130         triIndexPtr->index0 = slices;131         triIndexPtr->index1 = numVertices - 2;132         triIndexPtr->index2 = numVertices - 1;133     }134 135     return true;136 }

 

线框索引数据的生成

1 bool                        YfBuildFunWireIndices  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 + 1) * 2; 16     Yuint numLines    = slices + (slices-1) * 2 + 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 < slices - 1; i++) 30         { 31             nOffset = (i * 3) * indexStriding; 32             lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset); 33             lineIndexPtr->index0 = 1 + i; 34             lineIndexPtr->index1 = 1 + slices + i; 35         36             nOffset += indexStriding; 37             lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset); 38             lineIndexPtr->index0 = 1 + i; 39             lineIndexPtr->index1 = 1 + i + 1; 40  41             nOffset += indexStriding; 42             lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset); 43             lineIndexPtr->index0 = 1 + slices + i; 44             lineIndexPtr->index1 = 1 + slices + i + 1; 45         } 46  47         nOffset += indexStriding; 48         lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset); 49         lineIndexPtr->index0 = slices; 50         lineIndexPtr->index1 = 2*slices; 51  52         nOffset += indexStriding; 53         lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset); 54         lineIndexPtr->index0 = 0; 55         lineIndexPtr->index1 = 2*slices + 1; 56  57         nOffset += indexStriding; 58         lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset); 59         lineIndexPtr->index0 = 0; 60         lineIndexPtr->index1 = 1; 61  62         nOffset += indexStriding; 63         lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset); 64         lineIndexPtr->index0 = 0; 65         lineIndexPtr->index1 = slices; 66  67         nOffset += indexStriding; 68         lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset); 69         lineIndexPtr->index0 = 2*slices + 1; 70         lineIndexPtr->index1 = slices + 1; 71  72         nOffset += indexStriding; 73         lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset); 74         lineIndexPtr->index0 = 2*slices + 1; 75         lineIndexPtr->index1 = 2*slices; 76     } 77     else 78     { 79         YsLineIndex32* lineIndexPtr = NULL; 80         for (Yuint i= 0; i < slices; i++) 81         { 82             YsLineIndex32* lineIndexPtr = NULL; 83             for (Yuint i = 0; i < slices - 1; i++) 84             { 85                 nOffset = (i * 3) * indexStriding; 86                 lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset); 87                 lineIndexPtr->index0 = 1 + i; 88                 lineIndexPtr->index1 = 1 + slices + i; 89  90                 nOffset += indexStriding; 91                 lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset); 92                 lineIndexPtr->index0 = 1 + i; 93                 lineIndexPtr->index1 = 1 + i + 1; 94  95                 nOffset += indexStriding; 96                 lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset); 97                 lineIndexPtr->index0 = 1 + slices + i; 98                 lineIndexPtr->index1 = 1 + slices + i + 1; 99             }100 101             nOffset += indexStriding;102             lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);103             lineIndexPtr->index0 = slices;104             lineIndexPtr->index1 = 2*slices;105 106             nOffset += indexStriding;107             lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);108             lineIndexPtr->index0 = 0;109             lineIndexPtr->index1 = 2*slices + 1;110 111             nOffset += indexStriding;112             lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);113             lineIndexPtr->index0 = 0;114             lineIndexPtr->index1 = 1;115 116             nOffset += indexStriding;117             lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);118             lineIndexPtr->index0 = 0;119             lineIndexPtr->index1 = slices;120 121             nOffset += indexStriding;122             lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);123             lineIndexPtr->index0 = 2*slices + 1;124             lineIndexPtr->index1 = slices + 1;125 126             nOffset += indexStriding;127             lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);128             lineIndexPtr->index0 = 2*slices + 1;129             lineIndexPtr->index1 = 2*slices;130         }131     }132 133     return true;134 }

 

 

转载地址:http://avhnl.baihongyu.com/

你可能感兴趣的文章
Atitit.eclipse git使用
查看>>
JAVA逆向&反混淆-追查Burpsuite的破解原理(转)
查看>>
cocos2dx 3.1从零学习(一)——入门篇(一天学会打飞机)
查看>>
文档批量格式化之word技能
查看>>
C#~异步编程再续~await与async引起的w3wp.exe崩溃
查看>>
c3p0数据库连接池死锁问题
查看>>
SVN版本冲突解决
查看>>
java多线程知识点汇总(四)多线程知识点脉络图
查看>>
nginx的upstream目前支持5种方式的分配
查看>>
android图像处理(3) 底片效果
查看>>
stl 之set图解
查看>>
HDU 3569 Imaginary Date 简单期望
查看>>
怎么清除火狐浏览器的cookie?
查看>>
连麦介绍
查看>>
MQTT 客户端源码分析
查看>>
IT思想类智力题
查看>>
php设计模式-单例模式
查看>>
php扩展php-redis安装与使用
查看>>
python一天一题(2)
查看>>
Win10下安装Ubuntu16.04虚拟机并搭建TensorFlow1.3环境
查看>>