声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 5121|回复: 16

[综合讨论] 如何用matlab计算体积

[复制链接]
发表于 2007-9-3 16:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
知道了平面上一系列点的坐标和高程,用什么洋的算法可以算出由这些点形成的空间体的坐标(就是形成不规则棱形拼接成的空间棱形).
回复
分享到:

使用道具 举报

发表于 2007-9-3 20:18 | 显示全部楼层
既然是平面上的一系列的点,那么底面积就比较好求了。采用分割法,求出每一个三棱体的高,再相加,不就是总的体积了吗?
 楼主| 发表于 2007-9-4 22:33 | 显示全部楼层
但是是不规则的棱体啊,怎么找出其中最小的三棱体组合?
或者说是有一个点,怎么得到离它最近的2个点?
另外算的时候怎么控制运算的顺序?如果是方格的话可以按行优先或者列优先的顺序来,可是这个没有办法找到规律啊
发表于 2007-9-5 20:17 | 显示全部楼层

回复 #3 spano 的帖子

我也不会。一点不成熟的想法,希望对你能有帮助。
给步长设置一个比较合理的范围,以该步长向外搜索,不在范围之内的点舍弃,如果范围之内有多个点,只取最近的两个。计算以起点和两个新点为顶点的三角形的面积。再以新点为起点,继续下一轮。用过的点不再用。

评分

1

查看全部评分

 楼主| 发表于 2007-9-5 21:50 | 显示全部楼层
恩,可以按照你的思路写下,谢谢
 楼主| 发表于 2007-11-10 20:05 | 显示全部楼层
换的是插值的算法,按照符合要求的间隔密化点。
然后按照点的位置对点的高程H值求权P,最后求H*P的总和就可以了

因为不是用来算标准几何体的体积,这种精度够用了,谢谢上面的指导。
发表于 2007-11-11 19:32 | 显示全部楼层
能把你写的程序帖出来供大家学习吗?!
 楼主| 发表于 2007-11-12 14:34 | 显示全部楼层

clear;
[filename,pathname] = uigetfile('*.xyz','Select a file for read...');
InitialData = load(strcat(pathname,filename));
X=InitialData(:,1);
Y=InitialData(:,2);
Z=InitialData(:,3);
minX=min(X);
maxX=max(X);
minY=min(Y);
maxY=max(Y);
step=1;%设置单元格大小
Xi=minX:step:maxX;
Yi=minY:step:maxY;
[X2,Y2]=meshgrid(Xi,Yi);
Z2=griddata(X,Y,Z,X2,Y2,'cubic');
[m,n]=size(Z2);
top_bottom = ones(1,n)*NaN;
left_right = ones(1,m+2)'*NaN;
Z2 =[top_bottom;Z2;top_bottom];
Z2 =[left_right,Z2,left_right];
volume = 0;
for i =2:m+1
    for j=2:n+1
        if ~isnan(Z2(i,j))%为中间的每个点分配权
           counter = 0;
           if ~isnan(Z2(i-1,j-1))
               counter = counter+1;
           end
           if ~isnan(Z2(i-1,j))
               counter = counter+1;
           end
           if ~isnan(Z2(i-1,j+1))
               counter =counter+1;
           end
           if ~isnan(Z2(i,j-1))
               counter =counter+1;
           end
           if ~isnan(Z2(i,j+1))
               counter =counter+1;
           end
           if ~isnan(Z2(i+1,j-1))
               counter =counter+1;
           end
           if ~isnan(Z2(i+1,j))
               counter =counter+1;
           end
           if ~isnan(Z2(i+1,j+1))
               counter =counter+1;
           end
           cell_volume = counter/8*Z2(i,j)*step^2;
           volume = cell_volume+volume;
        end
    end
end



以上计算的都很基础,现在我想设定计算的范围又不知道怎么弄了。只能知道多边形定点的坐标,怎么判断点是否在多边形范围内呢?

[ 本帖最后由 spano 于 2007-11-12 14:38 编辑 ]

评分

1

查看全部评分

发表于 2007-11-16 17:12 | 显示全部楼层
只能知道多边形定点的坐标,怎么判断点是否在多边形范围内呢?


help inpolygon

这个问题我已经回答过多次,下次请先搜索一下
 楼主| 发表于 2007-11-16 18:56 | 显示全部楼层
原帖由 eight 于 2007-11-16 17:12 发表


help inpolygon

这个问题我已经回答过多次,下次请先搜索一下

...
没有找到,我后来自己写了个判断的函数.
 楼主| 发表于 2007-11-18 10:52 | 显示全部楼层
原帖由 spano 于 2007-11-16 18:56 发表

...
没有找到,我后来自己写了个判断的函数.

function mark=determine(polygon,point)
%令PI为a,a=8
a=8;
polypoint_num= size(polygon,1);
polygon =[polygon;polygon(1,:)];
t=zeros(size(polygon,1));
sum = 0;
x=polygon(:,1)-point(i,1);
y=polygon(:,2)-point(i,2);
for j=1:polypoint_num+1
    if x(j)>=0&y(j)>=0%判断象限
        t(j)=1;
    elseif x(j)<0&y(j)>=0
        t(j)=2;
    elseif x(j)<0&y(j)<0
        t(j)=3;
    elseif x(j)>=0&y(j)<0
        t(j)=4;
    end
end
for j =1:polypoint_num
    if x(j)==0&y(j)==0 %点为端点
        sum=16;
        break;
    end
    if x(j)*y(j+1)-x(j+1)*y(j)==0&x(j)*x(j+1)<=0&y(j)*y(j+1)<=0 %点在边上
        sum =16;
        break;
    end
    if mod(t(j+1),4)==mod(t(j)+1,4)
        sum=sum+4;
    elseif mod(t(j+1),4)==mod(t(j)+3,4)
        sum =sum -4;
    elseif mod(t(j+1),4)==mod(t(j)+2,4)
        if x(j)*y(j+1)-x(j+1)*y(j)>0
            sum =sum + 8;
        else
            sum = sum-8;
        end
    end
end
if sum==0
    mark=0;
else
    mark=1;
end
 楼主| 发表于 2007-11-20 10:32 | 显示全部楼层
当将土质分为多层,然后算每层的量的时候发现计算量很大。比如10*10的范围,分为6层,然后格网大小设置为0.1,计算时间大约要10分钟。当用1的时候计算很快。但是我想精度优先,尽量得到准确的结果。
有什么办法缩短计算时间没有?

[ 本帖最后由 spano 于 2007-11-20 10:37 编辑 ]

determine.m

1.17 KB, 下载次数: 10

发表于 2007-11-20 15:58 | 显示全部楼层
原帖由 spano 于 2007-11-20 10:32 发表
当将土质分为多层,然后算每层的量的时候发现计算量很大。比如10*10的范围,分为6层,然后格网大小设置为0.1,计算时间大约要10分钟。当用1的时候计算很快。但是我想精度优先,尽量得到准确的结果。
有什么办法 ...

你的文件那么多循环,当然慢啦。用 inpolygon 命令不行吗?
 楼主| 发表于 2007-11-20 16:21 | 显示全部楼层
原帖由 eight 于 2007-11-20 15:58 发表

你的文件那么多循环,当然慢啦。用 inpolygon 命令不行吗?

用到了inpolygon函数,不过时间上并没有缩短多少。后来想可能是网格太密了,回去把程序发上来,各位帮忙分析下
发表于 2007-11-20 16:22 | 显示全部楼层
原帖由 spano 于 2007-11-20 16:21 发表

用到了inpolygon函数,不过时间上并没有缩短多少。后来想可能是网格太密了,回去把程序发上来,各位帮忙分析下

自己 profile 一下吧
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-16 12:04 , Processed in 0.084958 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表