[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

相关文章

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

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

python如何生成指定文件大小

《python如何生成指定文件大小》:本文主要介绍python如何生成指定文件大小的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python生成指定文件大小方法一(速度最快)方法二(中等速度)方法三(生成可读文本文件–较慢)方法四(使用内存映射高效生成

使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)

《使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)》字体设计和矢量图形处理是编程中一个有趣且实用的领域,通过Python的matplotlib库,我们可以轻松将字体轮廓... 目录背景知识字体轮廓的表示实现步骤1. 安装依赖库2. 准备数据3. 解析路径指令4. 绘制图形关键

Maven项目中集成数据库文档生成工具的操作步骤

《Maven项目中集成数据库文档生成工具的操作步骤》在Maven项目中,可以通过集成数据库文档生成工具来自动生成数据库文档,本文为大家整理了使用screw-maven-plugin(推荐)的完... 目录1. 添加插件配置到 pom.XML2. 配置数据库信息3. 执行生成命令4. 高级配置选项5. 注意事

MybatisX快速生成增删改查的方法示例

《MybatisX快速生成增删改查的方法示例》MybatisX是基于IDEA的MyBatis/MyBatis-Plus开发插件,本文主要介绍了MybatisX快速生成增删改查的方法示例,文中通过示例代... 目录1 安装2 基本功能2.1 XML跳转2.2 代码生成2.2.1 生成.xml中的sql语句头2

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

使用Python自动化生成PPT并结合LLM生成内容的代码解析

《使用Python自动化生成PPT并结合LLM生成内容的代码解析》PowerPoint是常用的文档工具,但手动设计和排版耗时耗力,本文将展示如何通过Python自动化提取PPT样式并生成新PPT,同时... 目录核心代码解析1. 提取 PPT 样式到 jsON关键步骤:代码片段:2. 应用 JSON 样式到

SpringBoot实现二维码生成的详细步骤与完整代码

《SpringBoot实现二维码生成的详细步骤与完整代码》如今,二维码的应用场景非常广泛,从支付到信息分享,二维码都扮演着重要角色,SpringBoot是一个非常流行的Java基于Spring框架的微... 目录一、环境搭建二、创建 Spring Boot 项目三、引入二维码生成依赖四、编写二维码生成代码五

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ