zoukankan      html  css  js  c++  java
  • [12] 扇形体(Fan)图形的生成算法


    顶点数据的生成

     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*                   pVerticesBuffer
    11 )
    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 }


     

  • 相关阅读:
    ubuntu下安装pip
    [算法]获得最短路径的Floyd与Dijkstra算法
    win2003终端服务授权
    Cookie 读取,解决中文乱码
    MOSS自动备份
    MOSS 开发收藏
    Private Protect Partial Internal Public 区别
    怎么设置OUTLOOK接收邮件时,网站邮箱的原始文件也保存着?
    正则表达式实战
    SQL Server 2005 数据库用户和登录帐户设置关链
  • 原文地址:https://www.cnblogs.com/WhyEngine/p/3415252.html
Copyright © 2011-2022 走看看