zoukankan      html  css  js  c++  java
  • [4] 圆锥(Cone)图形的生成算法


    顶点数据的生成

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

    三角形索引数据的生成

     1 bool                        YfBuildConeTriIndices
     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;
    16     Yuint numTriangles = slices * 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 < 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)%slices;
    36 
    37             nOffset += indexStriding;
    38             triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset);
    39             triIndexPtr->index0 = numVertices - 1;
    40             triIndexPtr->index1 = 1 + (i + 1)%slices;
    41             triIndexPtr->index2 = 1 + i;
    42         }
    43     }
    44     else
    45     {
    46         YsTriIndex32* triIndexPtr = NULL;
    47         for (Yuint i= 0; i < 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)%slices;
    54 
    55             nOffset += indexStriding;
    56             triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset);
    57             triIndexPtr->index0 = numVertices - 1;
    58             triIndexPtr->index1 = 1 + (i + 1)%slices;
    59             triIndexPtr->index2 = 1 + i;
    60         }
    61     }
    62 
    63     return true;
    64 }     

    线框索引数据的生成

     1 bool                        YfBuildConeWireIndices
     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;
    16     Yuint numLines    = slices * 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*)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; 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;
    40         }
    41     }
    42     else
    43     {
    44         YsLineIndex32* lineIndexPtr = NULL;
    45         for (Yuint i= 0; i < slices; i++)
    46         {
    47             nOffset = (i * 2) * indexStriding;
    48             lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
    49             lineIndexPtr->index0 = 0;
    50             lineIndexPtr->index1 = 1 + i;
    51 
    52             nOffset += indexStriding;
    53             lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
    54             lineIndexPtr->index0 = 1 + i;
    55             lineIndexPtr->index1 = 1 + (i + 1)%slices;
    56         }
    57     }
    58 
    59     return true;
    60 }  


     

  • 相关阅读:
    BZOJ-1034-[ZJOI2008]泡泡堂BNB(贪心)
    BZOJ-2456-mode(思维题)
    POJ-2528-Mayor's posters(线段树+离散化)
    POJ-2352-Stars(树状数组)
    HDU-2688-Rotate(树状数组)
    POJ-1195-Mobile phones(二维树状数组)
    YYHS-NOIP2017Training0921-逆光
    YYHS-鏖战字符串(斜率优化)
    左偏树
    2-sat模板
  • 原文地址:https://www.cnblogs.com/WhyEngine/p/3415237.html
Copyright © 2011-2022 走看看