zoukankan      html  css  js  c++  java
  • [22] 计算几何图形包围盒与包围球的算法

    计算几何图形包围盒的算法

      1 bool                        YfCalculateSurroundBoxSize
      2 (
      3     const YsGraphDesc&      graphDesc,
      4     YsVector&               vMin,
      5     YsVector&               vMax
      6 )
      7 {
      8     switch (graphDesc.graphType)
      9     {
     10     case YE_GRAPH_PLANE:
     11         {
     12             if (graphDesc.slices < 2 || graphDesc.stacks < 2)
     13             {
     14                 return false;
     15             }   
     16             vMin = YsVector(0.0f, graphDesc.height - 0.5f, 0.0f);
     17             vMax = YsVector(graphDesc.width, graphDesc.height + 0.5f, graphDesc.length);
     18             if (graphDesc.originPose == YE_ORIGIN_POSE_CENTER)
     19             {
     20                 vMin.x -= graphDesc.width * 0.5f;
     21                 vMin.z -= graphDesc.length * 0.5f;
     22                 vMax.x -= graphDesc.width * 0.5f;
     23                 vMax.z -= graphDesc.length * 0.5f;
     24             }
     25         }
     26         break;
     27 
     28     case YE_GRAPH_BOX:
     29         {
     30             vMin = YsVector(0.0f, 0.0f, 0.0f);
     31             vMax = YsVector(graphDesc.extentX, graphDesc.extentY, graphDesc.extentZ);
     32 
     33             YsVector3 vOriginOffset = -vMax * 0.5f;
     34             if (graphDesc.originPose == YE_ORIGIN_POSE_TOP)
     35             {
     36                 vOriginOffset.y = -graphDesc.extentY;
     37             }
     38             else if (graphDesc.originPose == YE_ORIGIN_POSE_BOTTOM)
     39             {
     40                 vOriginOffset.y = 0.0f;
     41             }
     42             vMin += vOriginOffset;
     43             vMax += vOriginOffset;
     44         }
     45         break;
     46 
     47     case YE_GRAPH_SPHERE:
     48         {
     49             if (graphDesc.slices < 2 || graphDesc.stacks < 3)
     50             {
     51                 return false;
     52             }
     53             vMin = YsVector(-graphDesc.radius);
     54             vMax = YsVector(graphDesc.radius);
     55             if (graphDesc.originPose == YE_ORIGIN_POSE_TOP)
     56             {
     57                 vMin.y -= graphDesc.radius;
     58                 vMax.y -= graphDesc.radius;
     59             }
     60             else if (graphDesc.originPose == YE_ORIGIN_POSE_BOTTOM)
     61             {
     62                 vMin.y += graphDesc.radius;
     63                 vMax.y += graphDesc.radius;
     64             }
     65         }
     66         break;
     67 
     68     case YE_GRAPH_DRUM:
     69         {
     70             if (graphDesc.slices < 2 || graphDesc.stacks < 3)
     71             {
     72                 return false;
     73             }
     74             vMin = YsVector(-graphDesc.radius);
     75             vMax = YsVector(graphDesc.radius);
     76 
     77             vMin.x -= graphDesc.assistRadius;
     78             vMin.z -= graphDesc.assistRadius;
     79             vMax.x += graphDesc.assistRadius;
     80             vMax.z += graphDesc.assistRadius;
     81 
     82             if (graphDesc.originPose == YE_ORIGIN_POSE_TOP)
     83             {
     84                 vMin.y -= graphDesc.radius;
     85                 vMax.y -= graphDesc.radius;
     86             }
     87             else if (graphDesc.originPose == YE_ORIGIN_POSE_BOTTOM)
     88             {
     89                 vMin.y += graphDesc.radius;
     90                 vMax.y += graphDesc.radius;
     91             }
     92         }
     93         break;    
     94     
     95     case YE_GRAPH_HEMISPHERE:
     96         {
     97             if (graphDesc.slices < 2 || graphDesc.stacks < 3)
     98             {
     99                 return false;
    100             }
    101             vMin = YsVector(-graphDesc.radius, 0.0f, -graphDesc.radius);
    102             vMax = YsVector(graphDesc.radius);
    103             if (graphDesc.originPose == YE_ORIGIN_POSE_TOP)
    104             {
    105                 vMin.y -= graphDesc.radius;
    106                 vMax.y -= graphDesc.radius;
    107             }
    108             else if (graphDesc.originPose == YE_ORIGIN_POSE_BOTTOM)
    109             {
    110                 vMin.y += graphDesc.radius;
    111                 vMax.y += graphDesc.radius;
    112             }
    113         }
    114         break;
    115 
    116     case YE_GRAPH_CONE:
    117         {
    118             if (graphDesc.slices < 2)
    119             {
    120                 return false;
    121             }
    122             vMin = YsVector(-graphDesc.radius, 0.0f, -graphDesc.radius);
    123             vMax = YsVector(graphDesc.radius, graphDesc.height, graphDesc.radius);
    124             if (graphDesc.originPose == YE_ORIGIN_POSE_TOP)
    125             {
    126                 vMin.y -= graphDesc.height;
    127                 vMax.y -= graphDesc.height;
    128             }
    129             else if (graphDesc.originPose == YE_ORIGIN_POSE_CENTER)
    130             {
    131                 vMin.y -= graphDesc.height * 0.5f;
    132                 vMax.y -= graphDesc.height * 0.5f;
    133             }
    134         }
    135         break;
    136 
    137     case YE_GRAPH_CYLINDER:
    138         { 
    139             if (graphDesc.slices < 2)
    140             {
    141                 return false;
    142             }
    143 
    144             Yreal radius = (graphDesc.radius > graphDesc.assistRadius) ? graphDesc.radius : graphDesc.assistRadius;
    145             vMin = YsVector(-radius, 0.0f, -radius);
    146             vMax = YsVector(radius, graphDesc.height, radius);
    147             if (graphDesc.originPose == YE_ORIGIN_POSE_TOP)
    148             {
    149                 vMin.y -= graphDesc.height;
    150                 vMax.y -= graphDesc.height;
    151             }
    152             else if (graphDesc.originPose == YE_ORIGIN_POSE_CENTER)
    153             {
    154                 vMin.y -= graphDesc.height * 0.5f;
    155                 vMax.y -= graphDesc.height * 0.5f;
    156             }
    157         }
    158         break;
    159 
    160     case YE_GRAPH_CAPSULE:
    161         {
    162             Yuint halfStacks = graphDesc.stacks / 2;
    163             if (graphDesc.slices < 2 || halfStacks < 2)
    164             {
    165                 return false;
    166             }
    167             vMin = YsVector(-graphDesc.radius, -graphDesc.radius - graphDesc.height*0.5f, -graphDesc.radius);
    168             vMax = YsVector(graphDesc.radius,  graphDesc.radius  + graphDesc.height*0.5f, graphDesc.radius);
    169             if (graphDesc.originPose == YE_ORIGIN_POSE_TOP)
    170             {
    171                 vMin.y -= graphDesc.radius + graphDesc.height;
    172                 vMax.y -= graphDesc.radius + graphDesc.height;
    173             }
    174             else if (graphDesc.originPose == YE_ORIGIN_POSE_BOTTOM)
    175             {
    176                 vMin.y += graphDesc.radius + graphDesc.height;
    177                 vMax.y += graphDesc.radius + graphDesc.height;
    178             }
    179         }
    180         break;
    181 
    182     case YE_GRAPH_PYRAMID:
    183         {
    184             vMin = YsVector(0.0f, 0.0f, 0.0f);
    185             vMax = YsVector(graphDesc.width, graphDesc.height, graphDesc.length);
    186 
    187             YsVector3 vOriginOffset(-graphDesc.width / 2, -graphDesc.height / 2, -graphDesc.length / 2);
    188             if (graphDesc.originPose == YE_ORIGIN_POSE_TOP)
    189             {
    190                 vOriginOffset.y = -graphDesc.height;
    191             }
    192             else if (graphDesc.originPose == YE_ORIGIN_POSE_BOTTOM)
    193             {
    194                 vOriginOffset.y = 0.0f;
    195             }
    196             vMin += vOriginOffset;
    197             vMax += vOriginOffset;
    198         }
    199         break;
    200 
    201     case YE_GRAPH_ROUND:
    202         {
    203             if (graphDesc.slices < 3)
    204             {
    205                 return false;
    206             }
    207             vMin = YsVector(-graphDesc.radius, graphDesc.height - 0.5f, -graphDesc.radius);
    208             vMax = YsVector(graphDesc.radius,  graphDesc.height + 0.5f, graphDesc.radius);
    209         }
    210         break;
    211 
    212     case YE_GRAPH_RING:
    213         {
    214             if (graphDesc.slices < 2 || graphDesc.stacks < 3)
    215             {
    216                 return false;
    217             }
    218 
    219             Yreal halfHeight = graphDesc.height * 0.5f;
    220             vMin = YsVector(-graphDesc.radius - graphDesc.assistRadius, 
    221                             -halfHeight, 
    222                             -graphDesc.radius - graphDesc.assistRadius);
    223             vMax = YsVector(graphDesc.radius + graphDesc.assistRadius, 
    224                             halfHeight, 
    225                             graphDesc.radius + graphDesc.assistRadius);
    226 
    227             if (graphDesc.originPose == YE_ORIGIN_POSE_TOP)
    228             {
    229                 vMin.y -= halfHeight;
    230                 vMax.y -= halfHeight;
    231             }
    232             else if (graphDesc.originPose == YE_ORIGIN_POSE_BOTTOM)
    233             {
    234                 vMin.y += halfHeight;
    235                 vMax.y += halfHeight;
    236             }
    237         }
    238         break;
    239 
    240     case YE_GRAPH_PIPE:
    241         {
    242             if (graphDesc.slices < 2)
    243             {
    244                 return false;
    245             }
    246             vMin = YsVector(-graphDesc.radius, 0.0f, -graphDesc.radius);
    247             vMax = YsVector(graphDesc.radius, graphDesc.height, graphDesc.radius);
    248             if (graphDesc.originPose == YE_ORIGIN_POSE_TOP)
    249             {
    250                 vMin.y -= graphDesc.height;
    251                 vMax.y -= graphDesc.height;
    252             }
    253             else if (graphDesc.originPose == YE_ORIGIN_POSE_CENTER)
    254             {
    255                 vMin.y -= graphDesc.height * 0.5f;
    256                 vMax.y -= graphDesc.height * 0.5f;
    257             }
    258         }
    259         break;
    260 
    261     case YE_GRAPH_WEDGE:
    262         {
    263             vMin = YsVector(0.0f, 0.0f, 0.0f);
    264             vMax = YsVector(graphDesc.width, graphDesc.height, graphDesc.length);
    265 
    266             YsVector3 vOriginOffset(-graphDesc.width / 2, -graphDesc.height / 2, -graphDesc.length / 2);
    267             if (graphDesc.originPose == YE_ORIGIN_POSE_TOP)
    268             {
    269                 vOriginOffset.y = -graphDesc.height;
    270             }
    271             else if (graphDesc.originPose == YE_ORIGIN_POSE_BOTTOM)
    272             {
    273                 vOriginOffset.y = 0.0f;
    274             }
    275             vMin += vOriginOffset;
    276             vMax += vOriginOffset;
    277         }
    278         break;
    279 
    280     case YE_GRAPH_FAN:
    281         {
    282             if (graphDesc.degree < 0 || graphDesc.degree > 360)
    283             {
    284                 return false;
    285             }
    286             if (graphDesc.slices < 2)
    287             {
    288                 return false;
    289             }
    290             vMin = YsVector(-graphDesc.radius, 0.0f, -graphDesc.radius);
    291             vMax = YsVector(graphDesc.radius, graphDesc.height, graphDesc.radius);
    292             if (graphDesc.originPose == YE_ORIGIN_POSE_TOP)
    293             {
    294                 vMin.y -= graphDesc.height;
    295                 vMax.y -= graphDesc.height;
    296             }
    297             else if (graphDesc.originPose == YE_ORIGIN_POSE_CENTER)
    298             {
    299                 vMin.y -= graphDesc.height * 0.5f;
    300                 vMax.y -= graphDesc.height * 0.5f;
    301             }
    302 
    303             Yreal radian = YD_DEGREE_TO_RADIAN(graphDesc.degree);
    304             if (graphDesc.degree < 90)
    305             {
    306                 vMin.x = 0.0f;
    307                 vMax.x = graphDesc.radius * yf_sin(radian);
    308                 vMin.z = 0.0f;
    309             }
    310             else if (graphDesc.degree < 180)
    311             {
    312                 vMin.x = 0.0f;
    313                 vMin.z = graphDesc.radius * yf_cos(radian);
    314             }
    315             else if (graphDesc.degree < 270)
    316             {
    317                 vMin.x = graphDesc.radius * yf_sin(radian);
    318             }
    319         }
    320         break;
    321 
    322     case YE_GRAPH_ARC:
    323         {
    324             if (graphDesc.degree < 0 || graphDesc.degree > 180)
    325             {
    326                 return false;
    327             }
    328             if (graphDesc.slices < 2 || graphDesc.stacks < 3)
    329             {
    330                 return false;
    331             }
    332 
    333             Yreal radian = YD_DEGREE_TO_RADIAN(graphDesc.degree);
    334             Yreal radius;
    335             if (graphDesc.degree > 90)
    336             {
    337                 radius = graphDesc.radius;
    338             }
    339             else
    340             {
    341                 radius = graphDesc.radius * yf_sin(radian);
    342             }
    343 
    344             vMin = YsVector(-radius, -graphDesc.radius, -radius);
    345             vMax = YsVector(radius,  graphDesc.radius,  radius);
    346             if (graphDesc.originPose == YE_ORIGIN_POSE_TOP)
    347             {
    348                 vMin.y -= graphDesc.radius;
    349                 vMax.y -= graphDesc.radius;
    350             }
    351             else if (graphDesc.originPose == YE_ORIGIN_POSE_BOTTOM)
    352             {
    353                 vMin.y += graphDesc.radius;
    354                 vMax.y += graphDesc.radius;
    355             }
    356 
    357             Yreal arcHeight = graphDesc.radius * (1 - yf_cos(radian));
    358             vMin.y += graphDesc.radius * 2 - arcHeight;
    359         }
    360         break;
    361 
    362     case YE_GRAPH_GEARWHEEL:
    363         {
    364             if (graphDesc.slices < 3)
    365             {
    366                 return false;
    367             }
    368             vMin = YsVector(-graphDesc.radius, 0.0f, -graphDesc.radius);
    369             vMax = YsVector(graphDesc.radius, graphDesc.height, graphDesc.radius);
    370             if (graphDesc.originPose == YE_ORIGIN_POSE_TOP)
    371             {
    372                 vMin.y -= graphDesc.height;
    373                 vMax.y -= graphDesc.height;
    374             }
    375             else if (graphDesc.originPose == YE_ORIGIN_POSE_CENTER)
    376             {
    377                 vMin.y -= graphDesc.height * 0.5f;
    378                 vMax.y -= graphDesc.height * 0.5f;
    379             }
    380         }
    381         break;
    382 
    383     case YE_GRAPH_STAR:
    384         {
    385             if (graphDesc.slices < 3)
    386             {
    387                 return false;
    388             }
    389             vMin = YsVector(-graphDesc.radius, 0.0f, -graphDesc.radius);
    390             vMax = YsVector(graphDesc.radius, graphDesc.height, graphDesc.radius);
    391             if (graphDesc.originPose == YE_ORIGIN_POSE_TOP)
    392             {
    393                 vMin.y -= graphDesc.height;
    394                 vMax.y -= graphDesc.height;
    395             }
    396             else if (graphDesc.originPose == YE_ORIGIN_POSE_CENTER)
    397             {
    398                 vMin.y -= graphDesc.height * 0.5f;
    399                 vMax.y -= graphDesc.height * 0.5f;
    400             }
    401         }
    402         break;
    403 
    404     case YE_GRAPH_SPIRE:
    405         {
    406             if (graphDesc.stacks < 1 || graphDesc.slices < 3)
    407             {
    408                 return false;
    409             }
    410 
    411             Yreal radius = (graphDesc.radius > graphDesc.assistRadius) ? graphDesc.radius : graphDesc.assistRadius;
    412             vMin = YsVector(-radius, 0.0f, -radius);
    413             vMax = YsVector(radius, graphDesc.height, radius);
    414             if (graphDesc.originPose == YE_ORIGIN_POSE_TOP)
    415             {
    416                 vMin.y -= graphDesc.height;
    417                 vMax.y -= graphDesc.height;
    418             }
    419             else if (graphDesc.originPose == YE_ORIGIN_POSE_CENTER)
    420             {
    421                 vMin.y -= graphDesc.height * 0.5f;
    422                 vMax.y -= graphDesc.height * 0.5f;
    423             }
    424         }
    425         break;
    426 
    427     case YE_GRAPH_STAIRS:
    428         {
    429             if (graphDesc.stacks < 1)
    430             {
    431                 return false;
    432             }
    433             vMin = YsVector(0.0f, 0.0f, 0.0f);
    434             vMax = YsVector(graphDesc.extentX, graphDesc.extentY, graphDesc.extentZ);
    435 
    436             YsVector3 vOriginOffset = -vMax * 0.5f;
    437             if (graphDesc.originPose == YE_ORIGIN_POSE_TOP)
    438             {
    439                 vOriginOffset.y = -graphDesc.extentY;
    440             }
    441             else if (graphDesc.originPose == YE_ORIGIN_POSE_BOTTOM)
    442             {
    443                 vOriginOffset.y = 0.0f;
    444             }
    445             vMin += vOriginOffset;
    446             vMax += vOriginOffset;
    447         }
    448         break;
    449 
    450     case YE_GRAPH_SPIRAL_STAIRS:
    451         {
    452             if (graphDesc.stacks < 1 || graphDesc.slices < 3)
    453             {
    454                 return false;
    455             }
    456 
    457             Yreal radius = (graphDesc.radius > graphDesc.assistRadius) ? graphDesc.radius : graphDesc.assistRadius;
    458             vMin = YsVector(-radius, 0.0f, -radius);
    459             vMax = YsVector(radius, graphDesc.height, radius);
    460             if (graphDesc.originPose == YE_ORIGIN_POSE_TOP)
    461             {
    462                 vMin.y -= graphDesc.height;
    463                 vMax.y -= graphDesc.height;
    464             }
    465             else if (graphDesc.originPose == YE_ORIGIN_POSE_CENTER)
    466             {
    467                 vMin.y -= graphDesc.height * 0.5f;
    468                 vMax.y -= graphDesc.height * 0.5f;
    469             }
    470         }
    471         break;
    472 
    473     default:
    474         {
    475             return false;
    476         }
    477         break;
    478     }
    479 
    480     return true;
    481 }

    计算几何图形包围球的算法

      1 // 计算一个规则图形的包围球大小
      2 bool                        YfCalculateSurroundSphereSize
      3 (
      4     const YsGraphDesc&      graphDesc,
      5     OUT YsVector&           vCenter,
      6     OUT Yreal&              fRadius
      7 )
      8 {
      9     switch (graphDesc.graphType)
     10     {
     11     case YE_GRAPH_PLANE:
     12         {
     13             if (graphDesc.slices < 2 || graphDesc.stacks < 2)
     14             {
     15                 return false;
     16             }   
     17 
     18             fRadius = yf_sqrt(graphDesc.width * graphDesc.width + 
     19                 graphDesc.length * graphDesc.length) / 2;
     20 
     21             if (graphDesc.originPose == YE_ORIGIN_POSE_CENTER)
     22             {
     23                 vCenter = YsVector(0.0f, graphDesc.height, 0.0f);
     24             }
     25             else
     26             {
     27                 vCenter = YsVector(graphDesc.width / 2, graphDesc.height, graphDesc.length / 2);
     28             }
     29         }
     30         break;
     31 
     32     case YE_GRAPH_BOX:
     33         {
     34             fRadius = yf_sqrt(graphDesc.extentX * graphDesc.extentX + 
     35                 graphDesc.extentY * graphDesc.extentY + 
     36                 graphDesc.extentZ * graphDesc.extentZ ) / 2;
     37 
     38             vCenter = YsVector(0.0f, 0.0f, 0.0f);
     39             if (graphDesc.originPose == YE_ORIGIN_POSE_TOP)
     40             {
     41                 vCenter.y = -graphDesc.extentY / 2;
     42             }
     43             else if (graphDesc.originPose == YE_ORIGIN_POSE_BOTTOM)
     44             {
     45                 vCenter.y = graphDesc.extentY / 2;
     46             }
     47         }
     48         break;
     49 
     50     case YE_GRAPH_SPHERE:
     51         {
     52             if (graphDesc.slices < 2 || graphDesc.stacks < 3)
     53             {
     54                 return false;
     55             }
     56             fRadius = graphDesc.radius;
     57 
     58             vCenter = YsVector(0.0f, 0.0f, 0.0f);
     59             if (graphDesc.originPose == YE_ORIGIN_POSE_TOP)
     60             {
     61                 vCenter.y -= graphDesc.radius;
     62             }
     63             else if (graphDesc.originPose == YE_ORIGIN_POSE_BOTTOM)
     64             {
     65                 vCenter.y += graphDesc.radius;
     66             }
     67         }
     68         break;
     69 
     70     case YE_GRAPH_HEMISPHERE:
     71         {
     72             if (graphDesc.slices < 2 || graphDesc.stacks < 3)
     73             {
     74                 return false;
     75             }
     76             fRadius = graphDesc.radius;
     77 
     78             vCenter = YsVector(0.0f, 0.0f, 0.0f);
     79             if (graphDesc.originPose == YE_ORIGIN_POSE_TOP)
     80             {
     81                 vCenter.y -= graphDesc.radius;
     82             }
     83             else if (graphDesc.originPose == YE_ORIGIN_POSE_BOTTOM)
     84             {
     85                 vCenter.y += graphDesc.radius;
     86             }
     87         }
     88         break;
     89 
     90     case YE_GRAPH_DRUM:
     91         {
     92             if (graphDesc.slices < 2 || graphDesc.stacks < 3)
     93             {
     94                 return false;
     95             }
     96             fRadius = graphDesc.radius + graphDesc.assistRadius;
     97 
     98             vCenter = YsVector(0.0f, 0.0f, 0.0f);
     99             if (graphDesc.originPose == YE_ORIGIN_POSE_TOP)
    100             {
    101                 vCenter.y -= graphDesc.radius;
    102             }
    103             else if (graphDesc.originPose == YE_ORIGIN_POSE_BOTTOM)
    104             {
    105                 vCenter.y += graphDesc.radius;
    106             }
    107         }
    108         break;
    109 
    110     case YE_GRAPH_CONE:
    111         {
    112             if (graphDesc.slices < 2)
    113             {
    114                 return false;
    115             }
    116 
    117             if (graphDesc.height < graphDesc.radius)
    118             {
    119                 fRadius = graphDesc.radius;
    120                 vCenter = YsVector(0.0f, 0.0f, 0.0f);
    121             }
    122             else
    123             {
    124                 Yreal h = (graphDesc.height*graphDesc.height - graphDesc.radius*graphDesc.radius) / 
    125                     2 / graphDesc.height;
    126                 fRadius = graphDesc.height - h;
    127                 vCenter = YsVector(0.0f, h, 0.0f);
    128             }
    129 
    130             if (graphDesc.originPose == YE_ORIGIN_POSE_TOP)
    131             {
    132                 vCenter.y -= graphDesc.height;
    133             }
    134             else if (graphDesc.originPose == YE_ORIGIN_POSE_CENTER)
    135             {
    136                 vCenter.y -= graphDesc.height * 0.5f;
    137             }
    138         }
    139         break;
    140 
    141     case YE_GRAPH_CYLINDER:
    142         { 
    143             if (graphDesc.slices < 2)
    144             {
    145                 return false;
    146             }
    147 
    148             Yreal radius = (graphDesc.radius > graphDesc.assistRadius) ? graphDesc.radius : graphDesc.assistRadius;
    149 
    150             fRadius = yf_sqrt(radius*radius + graphDesc.height*graphDesc.height/4);
    151 
    152             vCenter = YsVector(0.0f, 0.0f, 0.0f);
    153             if (graphDesc.originPose == YE_ORIGIN_POSE_TOP)
    154             {
    155                 vCenter.y -= graphDesc.height / 2;
    156             }
    157             else if (graphDesc.originPose == YE_ORIGIN_POSE_BOTTOM)
    158             {
    159                 vCenter.y += graphDesc.height / 2;
    160             }
    161         }
    162         break;
    163 
    164     case YE_GRAPH_CAPSULE:
    165         {
    166             Yuint halfStacks = graphDesc.stacks / 2;
    167             if (graphDesc.slices < 2 || halfStacks < 2)
    168             {
    169                 return false;
    170             }
    171 
    172             fRadius = graphDesc.radius + graphDesc.height/2;
    173 
    174             vCenter = YsVector(0.0f, 0.0f, 0.0f);
    175             if (graphDesc.originPose == YE_ORIGIN_POSE_TOP)
    176             {
    177                 vCenter.y -= fRadius;
    178             }
    179             else if (graphDesc.originPose == YE_ORIGIN_POSE_BOTTOM)
    180             {
    181                 vCenter.y += fRadius;
    182             }
    183         }
    184         break;
    185 
    186     case YE_GRAPH_PYRAMID:
    187         {
    188             Yreal radius = yf_sqrt(graphDesc.width*graphDesc.width + graphDesc.length*graphDesc.length) / 2;
    189             if (graphDesc.height < radius)
    190             {
    191                 fRadius = radius;
    192                 vCenter = YsVector(0.0f, 0.0f, 0.0f);
    193             }
    194             else
    195             {
    196                 Yreal h = (graphDesc.height*graphDesc.height - radius*radius) / 
    197                     2 / graphDesc.height;
    198                 fRadius = graphDesc.height - h;
    199                 vCenter = YsVector(0.0f, h, 0.0f);
    200             }
    201 
    202             if (graphDesc.originPose == YE_ORIGIN_POSE_TOP)
    203             {
    204                 vCenter.y -= graphDesc.height;
    205             }
    206             else if (graphDesc.originPose == YE_ORIGIN_POSE_CENTER)
    207             {
    208                 vCenter.y -= graphDesc.height * 0.5f;
    209             }
    210         }
    211         break;
    212 
    213     case YE_GRAPH_ROUND:
    214         {
    215             if (graphDesc.slices < 3)
    216             {
    217                 return false;
    218             }
    219             fRadius = graphDesc.radius;
    220             vCenter = YsVector(0, graphDesc.height, 0);
    221         }
    222         break;
    223 
    224     case YE_GRAPH_RING:
    225         {
    226             if (graphDesc.slices < 2 || graphDesc.stacks < 3)
    227             {
    228                 return false;
    229             }
    230 
    231             fRadius = graphDesc.radius + graphDesc.assistRadius;
    232 
    233             vCenter = YsVector(0.0f, 0.0f, 0.0f);
    234             if (graphDesc.originPose == YE_ORIGIN_POSE_TOP)
    235             {
    236                 vCenter.y -= graphDesc.height / 2;
    237             }
    238             else if (graphDesc.originPose == YE_ORIGIN_POSE_BOTTOM)
    239             {
    240                 vCenter.y += graphDesc.height / 2;
    241             }
    242         }
    243         break;
    244 
    245     case YE_GRAPH_PIPE:
    246         {
    247             if (graphDesc.slices < 2)
    248             {
    249                 return false;
    250             }
    251 
    252             fRadius = yf_sqrt(graphDesc.radius*graphDesc.radius + graphDesc.height*graphDesc.height/4);
    253 
    254             vCenter = YsVector(0.0f, 0.0f, 0.0f);
    255             if (graphDesc.originPose == YE_ORIGIN_POSE_TOP)
    256             {
    257                 vCenter.y -= graphDesc.height / 2;
    258             }
    259             else if (graphDesc.originPose == YE_ORIGIN_POSE_BOTTOM)
    260             {
    261                 vCenter.y += graphDesc.height / 2;
    262             }
    263         }
    264         break;
    265 
    266     case YE_GRAPH_GEARWHEEL:
    267         {
    268             if (graphDesc.slices < 3)
    269             {
    270                 return false;
    271             }
    272             fRadius = yf_sqrt(graphDesc.radius*graphDesc.radius + graphDesc.height*graphDesc.height/4);
    273 
    274             vCenter = YsVector(0.0f, 0.0f, 0.0f);
    275             if (graphDesc.originPose == YE_ORIGIN_POSE_TOP)
    276             {
    277                 vCenter.y -= graphDesc.height / 2;
    278             }
    279             else if (graphDesc.originPose == YE_ORIGIN_POSE_BOTTOM)
    280             {
    281                 vCenter.y += graphDesc.height / 2;
    282             }
    283         }
    284         break;
    285 
    286     case YE_GRAPH_STAR:
    287         {
    288             if (graphDesc.slices < 3)
    289             {
    290                 return false;
    291             }
    292 
    293             if (graphDesc.height < graphDesc.radius)
    294             {
    295                 fRadius = graphDesc.radius;
    296                 vCenter = YsVector(0.0f, 0.0f, 0.0f);
    297             }
    298             else
    299             {
    300                 Yreal h = (graphDesc.height*graphDesc.height - graphDesc.radius*graphDesc.radius) / 
    301                     2 / graphDesc.height;
    302                 fRadius = graphDesc.height - h;
    303                 vCenter = YsVector(0.0f, h, 0.0f);
    304             }
    305 
    306             if (graphDesc.originPose == YE_ORIGIN_POSE_TOP)
    307             {
    308                 vCenter.y -= graphDesc.height;
    309             }
    310             else if (graphDesc.originPose == YE_ORIGIN_POSE_CENTER)
    311             {
    312                 vCenter.y -= graphDesc.height * 0.5f;
    313             }
    314         }
    315         break;
    316 
    317     case YE_GRAPH_SPIRE:
    318         {
    319             if (graphDesc.stacks < 1 || graphDesc.slices < 3)
    320             {
    321                 return false;
    322             }
    323 
    324             Yreal radius = (graphDesc.radius > graphDesc.assistRadius) ? graphDesc.radius : graphDesc.assistRadius;
    325 
    326             fRadius = yf_sqrt(radius*radius + graphDesc.height*graphDesc.height/4);
    327 
    328             vCenter = YsVector(0.0f, 0.0f, 0.0f);
    329             if (graphDesc.originPose == YE_ORIGIN_POSE_TOP)
    330             {
    331                 vCenter.y -= graphDesc.height / 2;
    332             }
    333             else if (graphDesc.originPose == YE_ORIGIN_POSE_BOTTOM)
    334             {
    335                 vCenter.y += graphDesc.height / 2;
    336             }
    337         }
    338         break;
    339 
    340     case YE_GRAPH_STAIRS:
    341         {
    342             if (graphDesc.stacks < 1)
    343             {
    344                 return false;
    345             }
    346 
    347             fRadius = yf_sqrt(graphDesc.extentX * graphDesc.extentX + 
    348                 graphDesc.extentY * graphDesc.extentY + 
    349                 graphDesc.extentZ * graphDesc.extentZ ) / 2;
    350 
    351             vCenter = YsVector(0.0f, 0.0f, 0.0f);
    352             if (graphDesc.originPose == YE_ORIGIN_POSE_TOP)
    353             {
    354                 vCenter.y = -graphDesc.extentY / 2;
    355             }
    356             else if (graphDesc.originPose == YE_ORIGIN_POSE_BOTTOM)
    357             {
    358                 vCenter.y = graphDesc.extentY / 2;
    359             }
    360         }
    361         break;
    362 
    363     case YE_GRAPH_SPIRAL_STAIRS:
    364         {
    365             if (graphDesc.stacks < 1 || graphDesc.slices < 3)
    366             {
    367                 return false;
    368             }
    369 
    370             Yreal radius = (graphDesc.radius > graphDesc.assistRadius) ? graphDesc.radius : graphDesc.assistRadius;
    371 
    372             fRadius = yf_sqrt(radius*radius + graphDesc.height*graphDesc.height/4);
    373 
    374             vCenter = YsVector(0.0f, 0.0f, 0.0f);
    375             if (graphDesc.originPose == YE_ORIGIN_POSE_TOP)
    376             {
    377                 vCenter.y -= graphDesc.height / 2;
    378             }
    379             else if (graphDesc.originPose == YE_ORIGIN_POSE_BOTTOM)
    380             {
    381                 vCenter.y += graphDesc.height / 2;
    382             }
    383         }
    384         break;
    385 
    386     case YE_GRAPH_WEDGE:
    387         {
    388             fRadius = yf_sqrt(graphDesc.extentX * graphDesc.extentX + 
    389                 graphDesc.extentY * graphDesc.extentY + 
    390                 graphDesc.extentZ * graphDesc.extentZ ) / 2;
    391 
    392             vCenter = YsVector(0.0f, 0.0f, 0.0f);
    393             if (graphDesc.originPose == YE_ORIGIN_POSE_TOP)
    394             {
    395                 vCenter.y = -graphDesc.extentY / 2;
    396             }
    397             else if (graphDesc.originPose == YE_ORIGIN_POSE_BOTTOM)
    398             {
    399                 vCenter.y = graphDesc.extentY / 2;
    400             }
    401         }
    402         break;
    403 
    404     case YE_GRAPH_FAN:
    405         {
    406             if (graphDesc.degree < 0 || graphDesc.degree > 360)
    407             {
    408                 return false;
    409             }
    410             if (graphDesc.slices < 2)
    411             {
    412                 return false;
    413             }
    414             YsVector vMin, vMax;
    415             vMin = YsVector(-graphDesc.radius, 0.0f, -graphDesc.radius);
    416             vMax = YsVector(graphDesc.radius, graphDesc.height, graphDesc.radius);
    417             if (graphDesc.originPose == YE_ORIGIN_POSE_TOP)
    418             {
    419                 vMin.y -= graphDesc.height;
    420                 vMax.y -= graphDesc.height;
    421             }
    422             else if (graphDesc.originPose == YE_ORIGIN_POSE_CENTER)
    423             {
    424                 vMin.y -= graphDesc.height * 0.5f;
    425                 vMax.y -= graphDesc.height * 0.5f;
    426             }
    427 
    428             Yreal radian = YD_DEGREE_TO_RADIAN(graphDesc.degree);
    429             if (graphDesc.degree < 90)
    430             {
    431                 vMin.x = 0.0f;
    432                 vMax.x = graphDesc.radius * yf_sin(radian);
    433                 vMin.z = 0.0f;
    434             }
    435             else if (graphDesc.degree < 180)
    436             {
    437                 vMin.x = 0.0f;
    438                 vMin.z = graphDesc.radius * yf_cos(radian);
    439             }
    440             else if (graphDesc.degree < 270)
    441             {
    442                 vMin.x = graphDesc.radius * yf_sin(radian);
    443             }
    444             vCenter = (vMax + vMin) / 2;
    445             YsVector vDis = vMax - vMin;
    446             fRadius = vDis.Magnitude() / 2;
    447         }
    448         break;
    449 
    450     case YE_GRAPH_ARC:
    451         {
    452             if (graphDesc.degree < 0 || graphDesc.degree > 180)
    453             {
    454                 return false;
    455             }
    456             if (graphDesc.slices < 2 || graphDesc.stacks < 3)
    457             {
    458                 return false;
    459             }
    460 
    461             Yreal radian = YD_DEGREE_TO_RADIAN(graphDesc.degree);
    462 
    463             if (graphDesc.degree > 90)
    464             {
    465                 fRadius = graphDesc.radius;
    466                 vCenter = YsVector(0.0f, 0.0f, 0.0f);
    467             }
    468             else
    469             {
    470                 fRadius = graphDesc.radius * yf_sin(radian);
    471                 vCenter = YsVector(0.0f, graphDesc.radius * yf_cos(radian), 0.0f);
    472             }
    473 
    474             if (graphDesc.originPose == YE_ORIGIN_POSE_TOP)
    475             {
    476                 vCenter.y -= graphDesc.radius;
    477             }
    478             else if (graphDesc.originPose == YE_ORIGIN_POSE_BOTTOM)
    479             {
    480                 vCenter.y += graphDesc.radius;
    481             }
    482         }
    483         break;
    484 
    485     default:
    486         {
    487             return false;
    488         }
    489         break;
    490     }
    491 
    492     return true;
    493 }
  • 相关阅读:
    IDEA安装和JDK的配置
    IDEA里面创建maven项目,依赖
    JSON的简单书写(初学),使用Java语言反序列化
    Spring中的转换器:Converter
    关于Spring MVC中的表单标签库的使用
    解决Spring框架下中文乱码的问题
    SpringMVC中使用DispatcherServlet
    八大排序算法:冒泡排序
    总线与南桥和北桥
    设备驱动与控制器 I/O
  • 原文地址:https://www.cnblogs.com/WhyEngine/p/3415278.html
Copyright © 2011-2022 走看看