P03_非凹四边形面积计算、截断式四棱柱体积计算

非凹四边形面积计算,可分成两个三角形,三角形计算面积可以用两向量叉乘的模一半来表示(规则四边形两边的叉乘的模就是其面积)。

二截断式四棱柱可以分为两个截断式三菱柱计算,每个截断式三菱柱可以分为一个三菱柱+两个三菱锥(或者一个三菱柱+一个四凌锥)

计算案例区域是由一系列节点网格组成的,文本信息由节点信息( N(x y z) ) 和面元素信息( E(1 2 3 4) )组成,计算蓝色网格的面积,及其对应的体积,求z的平均值。


%S_mesh_quad是每个四边形的面积,S_sum_quad是总网格的面积
%V_mesh_quad是每个类四棱柱的体积,V_sum_quad是总体积

clc,clear

%写入节点信息
N = importdata('Note.dat');
E = importdata('Element.dat');
%写入完毕

S_mesh_quad = zeros(size(E, 1), 1);
V_mesh_quad = zeros(size(E, 1), 1);

for i_sv = 1:size(E, 1)
    N_quad = N(E(i_sv, :), :);
    %拆分为两个三角形tri1(241)和tri2(243)来计算XOY平面的四边形网格面积,tecplot四边形云图是以2、4节点连接的
    N_quadxy=N_quad;
    N_quadxy(:,3)=0;
    L24_tri = N_quadxy(4, :) - N_quadxy(2, :);
    L21_tri = N_quadxy(1, :) - N_quadxy(2, :);
    L23_tri = N_quadxy(3, :) - N_quadxy(2, :);
    S_tri1 = 0.5 * norm(cross(L24_tri, L21_tri));
    S_tri2 = 0.5 * norm(cross(L24_tri, L23_tri));
    S_quad=S_tri1+S_tri2;

    %计算第一个三角形的投影体积,拆分为一个三菱柱column和两个三菱锥cone1、cone2
    N_tri1=N_quad;
    N_tri1(3,:)=[];     %第一个三角形去掉第三点数据
    N_tri1=sortrows(N_tri1,3);  %按z值对点数据排列,利于计算体积,最小z值确定三菱柱体积,2、3、4z值确定两个三菱锥的底面

    tri1_cone2=[N_tri1;N_tri1(3,:)];
    tri1_cone2(4,3)=N_tri1(1,3);       %顶部三菱锥点位信息,第四点要把z值设置到最小值

    tri1_cone2_L12=tri1_cone2(2,:)-tri1_cone2(1,:);
    tri1_cone2_L13=tri1_cone2(3,:)-tri1_cone2(1,:);
    tri1_cone2_L14=tri1_cone2(4,:)-tri1_cone2(1,:);  %最底部三菱锥的三条边,便可求此三菱锥面积

    V_tri1_cone1=S_tri1*(N_tri1(2,3)-N_tri1(1,3))/3;
    V_tri1_cone2=abs(dot(tri1_cone2_L14,cross(tri1_cone2_L12,tri1_cone2_L13))/6);  %底面积的法向量点积另外一条向量再/2/3
    V_tri1=S_tri1*N_tri1(1,3)+V_tri1_cone1+V_tri1_cone2;  %第一部分类三菱柱总体积为V_column+V_tri1_cone1+V_tri1_cone2

    N_tri2=N_quad;
    N_tri2(1,:)=[];     %第二个三角形去掉第一点数据
    N_tri2=sortrows(N_tri2,3);  %按z值对点数据排列,利于计算体积

    tri2_cone2=[N_tri2;N_tri2(3,:)];
    tri2_cone2(4,3)=N_tri2(1,3);       %顶部三菱锥点位信息,第四点要把z值降到最小值

    tri2_cone2_L12=tri2_cone2(2,:)-tri2_cone2(1,:);
    tri2_cone2_L13=tri2_cone2(3,:)-tri2_cone2(1,:);
    tri2_cone2_L14=tri2_cone2(4,:)-tri2_cone2(1,:);  %最底部三菱锥的三条边,便可求此三菱锥面积

    V_tri2_cone1=S_tri2*(N_tri2(2,3)-N_tri2(1,3))/3;
    V_tri2_cone2=abs(dot(tri2_cone2_L14,cross(tri2_cone2_L12,tri2_cone2_L13))/6);  %底面积的法向量点积另外一条向量再/2/3
    V_tri2=S_tri2*N_tri2(1,3)+V_tri2_cone1+V_tri2_cone2;  %第一部分类三菱柱总体积为V_column+V_tri2_cone1+V_tri2_cone2
    V_quad=V_tri1+V_tri2;

    %写入单个网格的面积及投影体积
    S_mesh_quad(i_sv,1)=S_quad;
    V_mesh_quad(i_sv,1)=V_quad;

end

%计算总面积、总体积
S_sum_quad=sum(S_mesh_quad(:,1));
V_sum_quad=sum(V_mesh_quad(:,1));
A_average=V_sum_quad/S_sum_quad;
%计算完毕

%写入总面积、总体积


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值