[11] 楔形体(Wedge)图形的生成算法

2023-11-21 04:20

本文主要是介绍[11] 楔形体(Wedge)图形的生成算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


顶点数据的生成

 

 1 bool                        YfBuildWedgeVertices
 2 (
 3     Yreal                   width, 
 4     Yreal                   length, 
 5     Yreal                   height, 
 6     YeOriginPose            originPose,  
 7     Yuint                   vertexStriding, 
 8     Yuint                   vertexPos,
 9     void*                   pVerticesBuffer
10 )
11 {
12     if (!pVerticesBuffer)
13     {
14         return false;
15     }
16 
17     Yuint numVertices  = 6;
18 
19     // 顶点赋值
20     char* vertexPtr = (char*)pVerticesBuffer + vertexPos;
21     YsVector3* curVertexPtr   = NULL;
22     Yuint nOffset = 0;
23 
24     YsVector3 vOriginOffset(-width / 2, -height / 2, -length / 2);
25     if (originPose == YE_ORIGIN_POSE_TOP)
26     {
27         vOriginOffset.y = -height;
28     }
29     else if (originPose == YE_ORIGIN_POSE_BOTTOM)
30     {
31         vOriginOffset.y = 0.0f;
32     }
33 
34     // 底四个顶点
35     for (Yuint j = 0; j < 2; j++)
36     {
37         for (Yuint i = 0; i < 2; i++)
38         {
39             nOffset = (j*2 + i) * vertexStriding;
40             curVertexPtr = (YsVector3*)(vertexPtr + nOffset);
41             curVertexPtr->x = width*i + vOriginOffset.x;
42             curVertexPtr->y = vOriginOffset.y;
43             curVertexPtr->z = length*j + vOriginOffset.z;
44         }
45     }
46 
47     // 上顶点
48     nOffset = 4 * vertexStriding;
49     if (vertexPtr)
50     {
51         curVertexPtr = (YsVector3*)(vertexPtr + nOffset);
52         curVertexPtr->x = vOriginOffset.x + width / 2;
53         curVertexPtr->y = height + vOriginOffset.y;
54         curVertexPtr->z = vOriginOffset.z;
55 
56         curVertexPtr = (YsVector3*)(vertexPtr + nOffset + vertexStriding);
57         curVertexPtr->x = vOriginOffset.x + width / 2;
58         curVertexPtr->y = height + vOriginOffset.y;
59         curVertexPtr->z = length + vOriginOffset.z;
60     }
61 
62     return true;
63 }

 

三角形索引数据的生成

 

 1 bool                        YfBuildWedgeTriIndices
 2 (
 3     YeIndexType             indexType,
 4     Yuint                   indexStriding,  
 5     Yuint                   indexPos,
 6     void*                   pTriIndicesBuffer
 7 )
 8 {
 9     if (!pTriIndicesBuffer)
10     {
11         return false;
12     }
13 
14     char* indexPtr = (char*)pTriIndicesBuffer + indexPos;
15     if (indexType == YE_INDEX_16_BIT)
16     {
17         YsTriIndex16* triIndexPtr = NULL;
18 
19         // bottom
20         triIndexPtr = (YsTriIndex16*)(indexPtr + 0*indexStriding);
21         triIndexPtr->index0 = 0; triIndexPtr->index1 = 1; triIndexPtr->index2 = 3;
22         triIndexPtr = (YsTriIndex16*)(indexPtr + 1*indexStriding);
23         triIndexPtr->index0 = 0; triIndexPtr->index1 = 3; triIndexPtr->index2 = 2;
24 
25         // 4 face
26         triIndexPtr = (YsTriIndex16*)(indexPtr + 2*indexStriding);
27         triIndexPtr->index0 = 0; triIndexPtr->index1 = 2; triIndexPtr->index2 = 5;
28         triIndexPtr = (YsTriIndex16*)(indexPtr + 3*indexStriding);
29         triIndexPtr->index0 = 0; triIndexPtr->index1 = 5; triIndexPtr->index2 = 4;
30         triIndexPtr = (YsTriIndex16*)(indexPtr + 4*indexStriding);
31         triIndexPtr->index0 = 4; triIndexPtr->index1 = 5; triIndexPtr->index2 = 3;
32         triIndexPtr = (YsTriIndex16*)(indexPtr + 5*indexStriding);                                                
33         triIndexPtr->index0 = 4; triIndexPtr->index1 = 3; triIndexPtr->index2 = 1;
34 
35         // 2 face
36         triIndexPtr = (YsTriIndex16*)(indexPtr + 6*indexStriding);
37         triIndexPtr->index0 = 0; triIndexPtr->index1 = 4; triIndexPtr->index2 = 1;
38         triIndexPtr = (YsTriIndex16*)(indexPtr + 7*indexStriding);
39         triIndexPtr->index0 = 2; triIndexPtr->index1 = 3; triIndexPtr->index2 = 5;
40     }
41     else
42     {
43         YsTriIndex32* triIndexPtr = NULL;
44 
45         // bottom
46         triIndexPtr = (YsTriIndex32*)(indexPtr + 0*indexStriding);
47         triIndexPtr->index0 = 0; triIndexPtr->index1 = 1; triIndexPtr->index2 = 3;
48         triIndexPtr = (YsTriIndex32*)(indexPtr + 1*indexStriding);
49         triIndexPtr->index0 = 0; triIndexPtr->index1 = 3; triIndexPtr->index2 = 2;
50 
51         // 4 face
52         triIndexPtr = (YsTriIndex32*)(indexPtr + 2*indexStriding);
53         triIndexPtr->index0 = 0; triIndexPtr->index1 = 2; triIndexPtr->index2 = 5;
54         triIndexPtr = (YsTriIndex32*)(indexPtr + 3*indexStriding);
55         triIndexPtr->index0 = 0; triIndexPtr->index1 = 5; triIndexPtr->index2 = 4;
56         triIndexPtr = (YsTriIndex32*)(indexPtr + 4*indexStriding);
57         triIndexPtr->index0 = 4; triIndexPtr->index1 = 5; triIndexPtr->index2 = 3;
58         triIndexPtr = (YsTriIndex32*)(indexPtr + 5*indexStriding);                                                
59         triIndexPtr->index0 = 4; triIndexPtr->index1 = 3; triIndexPtr->index2 = 1;
60 
61         // 2 face
62         triIndexPtr = (YsTriIndex32*)(indexPtr + 6*indexStriding);
63         triIndexPtr->index0 = 0; triIndexPtr->index1 = 4; triIndexPtr->index2 = 1;
64         triIndexPtr = (YsTriIndex32*)(indexPtr + 7*indexStriding);
65         triIndexPtr->index0 = 2; triIndexPtr->index1 = 3; triIndexPtr->index2 = 5;
66     }
67 
68     return true;
69 }

 

线框索引数据的生成

  1 bool                        YfBuildWedgeWireIndices
  2 (
  3     YeIndexType             indexType,
  4     Yuint                   indexStriding,  
  5     Yuint                   indexPos,
  6     void*                   pWireIndicesBuffer
  7 )
  8 {
  9     if (!pWireIndicesBuffer)
 10     {
 11         return false;
 12     }
 13 
 14     Yuint numVertices = 6;
 15     Yuint numLines    = 9;
 16 
 17     // 索引赋值
 18     char* indexPtr = (char*)pWireIndicesBuffer + indexPos;
 19     Yuint nOffset = 0;
 20     if (indexType == YE_INDEX_16_BIT)
 21     {
 22         YsLineIndex16* lineIndexPtr = NULL;
 23 
 24         nOffset = 0 * indexStriding;
 25         lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
 26         lineIndexPtr->index0 = 0;
 27         lineIndexPtr->index1 = 1;
 28 
 29         nOffset = 1 * indexStriding;
 30         lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
 31         lineIndexPtr->index0 = 0;
 32         lineIndexPtr->index1 = 4;
 33 
 34         nOffset = 2 * indexStriding;
 35         lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
 36         lineIndexPtr->index0 = 4;
 37         lineIndexPtr->index1 = 1;
 38 
 39         nOffset = 3 * indexStriding;
 40         lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
 41         lineIndexPtr->index0 = 2;
 42         lineIndexPtr->index1 = 3;
 43 
 44         nOffset = 4 * indexStriding;
 45         lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
 46         lineIndexPtr->index0 = 2;
 47         lineIndexPtr->index1 = 5;
 48 
 49         nOffset = 5 * indexStriding;
 50         lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
 51         lineIndexPtr->index0 = 5;
 52         lineIndexPtr->index1 = 3;
 53 
 54         nOffset = 6 * indexStriding;
 55         lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
 56         lineIndexPtr->index0 = 0;
 57         lineIndexPtr->index1 = 2;
 58 
 59         nOffset = 7 * indexStriding;
 60         lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
 61         lineIndexPtr->index0 = 4;
 62         lineIndexPtr->index1 = 5;
 63 
 64         nOffset = 8 * indexStriding;
 65         lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset);
 66         lineIndexPtr->index0 = 1;
 67         lineIndexPtr->index1 = 3;
 68     }
 69     else
 70     {
 71         YsLineIndex32* lineIndexPtr = NULL;
 72 
 73         nOffset = 0 * indexStriding;
 74         lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
 75         lineIndexPtr->index0 = 0;
 76         lineIndexPtr->index1 = 1;
 77 
 78         nOffset = 1 * indexStriding;
 79         lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
 80         lineIndexPtr->index0 = 0;
 81         lineIndexPtr->index1 = 4;
 82 
 83         nOffset = 2 * indexStriding;
 84         lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
 85         lineIndexPtr->index0 = 4;
 86         lineIndexPtr->index1 = 1;
 87 
 88         nOffset = 3 * indexStriding;
 89         lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
 90         lineIndexPtr->index0 = 2;
 91         lineIndexPtr->index1 = 3;
 92 
 93         nOffset = 4 * indexStriding;
 94         lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
 95         lineIndexPtr->index0 = 2;
 96         lineIndexPtr->index1 = 5;
 97 
 98         nOffset = 5 * indexStriding;
 99         lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
100         lineIndexPtr->index0 = 5;
101         lineIndexPtr->index1 = 3;
102 
103         nOffset = 6 * indexStriding;
104         lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
105         lineIndexPtr->index0 = 0;
106         lineIndexPtr->index1 = 2;
107 
108         nOffset = 7 * indexStriding;
109         lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
110         lineIndexPtr->index0 = 4;
111         lineIndexPtr->index1 = 5;
112 
113         nOffset = 8 * indexStriding;
114         lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset);
115         lineIndexPtr->index0 = 1;
116         lineIndexPtr->index1 = 3;
117     }
118 
119     return true;
120 }

 


 

转载于:https://my.oschina.net/abcijkxyz/blog/722682

这篇关于[11] 楔形体(Wedge)图形的生成算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/399792

相关文章

C#使用Spire.XLS快速生成多表格Excel文件

《C#使用Spire.XLS快速生成多表格Excel文件》在日常开发中,我们经常需要将业务数据导出为结构清晰的Excel文件,本文将手把手教你使用Spire.XLS这个强大的.NET组件,只需几行C#... 目录一、Spire.XLS核心优势清单1.1 性能碾压:从3秒到0.5秒的质变1.2 批量操作的优雅

Python使用python-pptx自动化操作和生成PPT

《Python使用python-pptx自动化操作和生成PPT》这篇文章主要为大家详细介绍了如何使用python-pptx库实现PPT自动化,并提供实用的代码示例和应用场景,感兴趣的小伙伴可以跟随小编... 目录使用python-pptx操作PPT文档安装python-pptx基础概念创建新的PPT文档查看

在ASP.NET项目中如何使用C#生成二维码

《在ASP.NET项目中如何使用C#生成二维码》二维码(QRCode)已广泛应用于网址分享,支付链接等场景,本文将以ASP.NET为示例,演示如何实现输入文本/URL,生成二维码,在线显示与下载的完整... 目录创建前端页面(Index.cshtml)后端二维码生成逻辑(Index.cshtml.cs)总结

Python实现数据可视化图表生成(适合新手入门)

《Python实现数据可视化图表生成(适合新手入门)》在数据科学和数据分析的新时代,高效、直观的数据可视化工具显得尤为重要,下面:本文主要介绍Python实现数据可视化图表生成的相关资料,文中通过... 目录前言为什么需要数据可视化准备工作基本图表绘制折线图柱状图散点图使用Seaborn创建高级图表箱线图热

SQLServer中生成雪花ID(Snowflake ID)的实现方法

《SQLServer中生成雪花ID(SnowflakeID)的实现方法》:本文主要介绍在SQLServer中生成雪花ID(SnowflakeID)的实现方法,文中通过示例代码介绍的非常详细,... 目录前言认识雪花ID雪花ID的核心特点雪花ID的结构(64位)雪花ID的优势雪花ID的局限性雪花ID的应用场景

Django HTTPResponse响应体中返回openpyxl生成的文件过程

《DjangoHTTPResponse响应体中返回openpyxl生成的文件过程》Django返回文件流时需通过Content-Disposition头指定编码后的文件名,使用openpyxl的sa... 目录Django返回文件流时使用指定文件名Django HTTPResponse响应体中返回openp

python生成随机唯一id的几种实现方法

《python生成随机唯一id的几种实现方法》在Python中生成随机唯一ID有多种方法,根据不同的需求场景可以选择最适合的方案,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习... 目录方法 1:使用 UUID 模块(推荐)方法 2:使用 Secrets 模块(安全敏感场景)方法

Ubuntu 24.04启用root图形登录的操作流程

《Ubuntu24.04启用root图形登录的操作流程》Ubuntu默认禁用root账户的图形与SSH登录,这是为了安全,但在某些场景你可能需要直接用root登录GNOME桌面,本文以Ubuntu2... 目录一、前言二、准备工作三、设置 root 密码四、启用图形界面 root 登录1. 修改 GDM 配

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

Python实现自动化Word文档样式复制与内容生成

《Python实现自动化Word文档样式复制与内容生成》在办公自动化领域,高效处理Word文档的样式和内容复制是一个常见需求,本文将展示如何利用Python的python-docx库实现... 目录一、为什么需要自动化 Word 文档处理二、核心功能实现:样式与表格的深度复制1. 表格复制(含样式与内容)2