[7] 金字塔(Pyramid)图形的生成算法

本文介绍了一种生成金字塔三维模型的方法,包括顶点数据、三角形索引及线框索引的创建过程。根据不同的参数设置,可以调整金字塔的位置和尺寸。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


顶点数据的生成

 1 bool                        YfBuildPyramidVertices
 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  = 5;
18 
19     char* vertexPtr   = (char*)pVerticesBuffer + vertexPos;
20     YsVector3* curVertexPtr   = NULL;
21     Yuint nOffset = 0;
22 
23     YsVector3 vOriginOffset(-width / 2, -height / 2, -length / 2);
24     if (originPose == YE_ORIGIN_POSE_TOP)
25     {
26         vOriginOffset.y = -height;
27     }
28     else if (originPose == YE_ORIGIN_POSE_BOTTOM)
29     {
30         vOriginOffset.y = 0.0f;
31     }
32 
33     // 底四个顶点
34     for (Yuint j = 0; j < 2; j++)
35     {
36         for (Yuint i = 0; i < 2; i++)
37         {
38             nOffset = (j*2 + i) * vertexStriding;
39             curVertexPtr = (YsVector3*)(vertexPtr + nOffset);
40             curVertexPtr->x = width*i + vOriginOffset.x;
41             curVertexPtr->y = vOriginOffset.y;
42             curVertexPtr->z = length*j + vOriginOffset.z;
43         }
44     }
45 
46     // 顶尖顶点
47     nOffset = 4 * vertexStriding;
48     curVertexPtr = (YsVector3*)(vertexPtr + nOffset);
49     curVertexPtr->x = 0.0f;
50     curVertexPtr->y = height + vOriginOffset.y;
51     curVertexPtr->z = 0.0f;
52  
53     return true;
54 }     

 

三角形索引数据的生成

 

 1 bool                        YfBuildPyramidTriIndices
 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 = 4; triIndexPtr->index1 = 1; triIndexPtr->index2 = 0;
28         triIndexPtr = (YsTriIndex16*)(indexPtr + 3*indexStriding);
29         triIndexPtr->index0 = 4; triIndexPtr->index1 = 3; triIndexPtr->index2 = 1;
30         triIndexPtr = (YsTriIndex16*)(indexPtr + 4*indexStriding);
31         triIndexPtr->index0 = 4; triIndexPtr->index1 = 2; triIndexPtr->index2 = 3;
32         triIndexPtr = (YsTriIndex16*)(indexPtr + 5*indexStriding);                                                
33         triIndexPtr->index0 = 4; triIndexPtr->index1 = 0; triIndexPtr->index2 = 2;
34     }
35     else
36     {
37         YsTriIndex32* triIndexPtr = NULL;
38 
39         // bottom
40         triIndexPtr = (YsTriIndex32*)(indexPtr + 0*indexStriding);
41         triIndexPtr->index0 = 0; triIndexPtr->index1 = 1; triIndexPtr->index2 = 3;
42         triIndexPtr = (YsTriIndex32*)(indexPtr + 1*indexStriding);
43         triIndexPtr->index0 = 0; triIndexPtr->index1 = 3; triIndexPtr->index2 = 2;
44 
45         // 4 face
46         triIndexPtr = (YsTriIndex32*)(indexPtr + 2*indexStriding);
47         triIndexPtr->index0 = 4; triIndexPtr->index1 = 1; triIndexPtr->index2 = 0;
48         triIndexPtr = (YsTriIndex32*)(indexPtr + 3*indexStriding);
49         triIndexPtr->index0 = 4; triIndexPtr->index1 = 3; triIndexPtr->index2 = 1;
50         triIndexPtr = (YsTriIndex32*)(indexPtr + 4*indexStriding);
51         triIndexPtr->index0 = 4; triIndexPtr->index1 = 2; triIndexPtr->index2 = 3;
52         triIndexPtr = (YsTriIndex32*)(indexPtr + 5*indexStriding);                                                
53         triIndexPtr->index0 = 4; triIndexPtr->index1 = 0; triIndexPtr->index2 = 2;
54     }
55 
56     return true;
57 }     

 

线框索引数据的生成

 1 bool                        YfBuildPyramidWireIndices
 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 = 5;
15     Yuint numLines    = 8;
16     if (indexType == YE_INDEX_16_BIT && 
17         numVertices > YD_MAX_UNSIGNED_INT16)
18     {
19         return false;
20     }
21 
22     // 索引赋值
23     char* indexPtr = (char*)pWireIndicesBuffer + indexPos;
24     Yuint nOffset = 0;
25     if (indexType == YE_INDEX_16_BIT)
26     {
27         YsLineIndex16* lineIndexPtr = NULL;
28         
29         // bottom
30         lineIndexPtr = (YsLineIndex16*)(indexPtr + 0*indexStriding);
31         lineIndexPtr->index0 = 0; lineIndexPtr->index1 = 1; 
32         lineIndexPtr = (YsLineIndex16*)(indexPtr + 1*indexStriding);
33         lineIndexPtr->index0 = 1; lineIndexPtr->index1 = 3; 
34         lineIndexPtr = (YsLineIndex16*)(indexPtr + 2*indexStriding);
35         lineIndexPtr->index0 = 3; lineIndexPtr->index1 = 2; 
36         lineIndexPtr = (YsLineIndex16*)(indexPtr + 3*indexStriding);
37         lineIndexPtr->index0 = 2; lineIndexPtr->index1 = 0; 
38 
39         // 4 lines
40         lineIndexPtr = (YsLineIndex16*)(indexPtr + 4*indexStriding);
41         lineIndexPtr->index0 = 4; lineIndexPtr->index1 = 0; 
42         lineIndexPtr = (YsLineIndex16*)(indexPtr + 5*indexStriding);
43         lineIndexPtr->index0 = 4; lineIndexPtr->index1 = 1; 
44         lineIndexPtr = (YsLineIndex16*)(indexPtr + 6*indexStriding);
45         lineIndexPtr->index0 = 4; lineIndexPtr->index1 = 2; 
46         lineIndexPtr = (YsLineIndex16*)(indexPtr + 7*indexStriding);
47         lineIndexPtr->index0 = 4; lineIndexPtr->index1 = 3; 
48     }
49     else
50     {
51         YsLineIndex32* lineIndexPtr = NULL;
52 
53         // bottom
54         lineIndexPtr = (YsLineIndex32*)(indexPtr + 0*indexStriding);
55         lineIndexPtr->index0 = 0; lineIndexPtr->index1 = 1; 
56         lineIndexPtr = (YsLineIndex32*)(indexPtr + 1*indexStriding);
57         lineIndexPtr->index0 = 1; lineIndexPtr->index1 = 3; 
58         lineIndexPtr = (YsLineIndex32*)(indexPtr + 2*indexStriding);
59         lineIndexPtr->index0 = 3; lineIndexPtr->index1 = 2; 
60         lineIndexPtr = (YsLineIndex32*)(indexPtr + 3*indexStriding);
61         lineIndexPtr->index0 = 2; lineIndexPtr->index1 = 0; 
62 
63         // 4 lines
64         lineIndexPtr = (YsLineIndex32*)(indexPtr + 4*indexStriding);
65         lineIndexPtr->index0 = 4; lineIndexPtr->index1 = 0; 
66         lineIndexPtr = (YsLineIndex32*)(indexPtr + 5*indexStriding);
67         lineIndexPtr->index0 = 4; lineIndexPtr->index1 = 1; 
68         lineIndexPtr = (YsLineIndex32*)(indexPtr + 6*indexStriding);
69         lineIndexPtr->index0 = 4; lineIndexPtr->index1 = 2; 
70         lineIndexPtr = (YsLineIndex32*)(indexPtr + 7*indexStriding);
71         lineIndexPtr->index0 = 4; lineIndexPtr->index1 = 3; 
72     }
73 
74     return true;
75 }

 


 

function Y = fuse_fsd(M1, M2, zt, ap, mp) %Y = fuse_fsd(M1, M2, zt, ap, mp) image fusion with fsd pyramid % % M1 - input image A % M2 - input image B % zt - maximum decomposition level % ap - coefficient selection highpass (see selc.m) % mp - coefficient selection base image (see selb.m) % % Y - fused image % (Oliver Rockinger 16.08.99) % check inputs [z1 s1] = size(M1); [z2 s2] = size(M2); if (z1 ~= z2) | (s1 ~= s2) error('Input images are not of same size'); end; % define filter w = [1 4 6 4 1] / 16; % cells for selected images E = cell(1,zt); % loop over decomposition depth -> analysis for i1 = 1:zt % calculate and store actual image size [z s] = size(M1); zl(i1) = z; sl(i1) = s; % check if image expansion necessary if (floor(z/2) ~= z/2), ew(1) = 1; else, ew(1) = 0; end; if (floor(s/2) ~= s/2), ew(2) = 1; else, ew(2) = 0; end; % perform expansion if necessary if (any(ew)) M1 = adb(M1,ew); M2 = adb(M2,ew); end; % perform filtering G1 = conv2(conv2(es2(M1,2), w, 'valid'),w', 'valid'); G2 = conv2(conv2(es2(M2,2), w, 'valid'),w', 'valid'); % select coefficients and store them E(i1) = {selc(M1-G1, M2-G2, ap)}; % decimate M1 = dec2(G1); M2 = dec2(G2); end; % select base coefficients of last decompostion stage M1 = selb(M1,M2,mp); % loop over decomposition depth -> synthesis for i1 = zt:-1:1 % undecimate and interpolate M1T = conv2(conv2(es2(undec2(M1), 2), 2*w, 'valid'), 2*w', 'valid'); % add coefficients M1 = M1T + E{i1}; % select valid image region M1 = M1(1:zl(i1),1:sl(i1)); end; % copy image Y = M1;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值