spano 发表于 2007-9-3 16:40

如何用matlab计算体积

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

huright 发表于 2007-9-3 20:18

既然是平面上的一系列的点,那么底面积就比较好求了。采用分割法,求出每一个三棱体的高,再相加,不就是总的体积了吗?

spano 发表于 2007-9-4 22:33

但是是不规则的棱体啊,怎么找出其中最小的三棱体组合?
或者说是有一个点,怎么得到离它最近的2个点?
另外算的时候怎么控制运算的顺序?如果是方格的话可以按行优先或者列优先的顺序来,可是这个没有办法找到规律啊

twomao 发表于 2007-9-5 20:17

回复 #3 spano 的帖子

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

spano 发表于 2007-9-5 21:50

恩,可以按照你的思路写下,谢谢

spano 发表于 2007-11-10 20:05

换的是插值的算法,按照符合要求的间隔密化点。
然后按照点的位置对点的高程H值求权P,最后求H*P的总和就可以了

因为不是用来算标准几何体的体积,这种精度够用了,谢谢上面的指导。

kangtj 发表于 2007-11-11 19:32

能把你写的程序帖出来供大家学习吗?!

spano 发表于 2007-11-12 14:34

原帖由 kangtj 于 2007-11-11 19:32 发表 http://www.chinavib.com/forum/images/common/back.gif
能把你写的程序帖出来供大家学习吗?!
clear;
= 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;
=meshgrid(Xi,Yi);
Z2=griddata(X,Y,Z,X2,Y2,'cubic');
=size(Z2);
top_bottom = ones(1,n)*NaN;
left_right = ones(1,m+2)'*NaN;
Z2 =;
Z2 =;
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 编辑 ]

eight 发表于 2007-11-16 17:12

只能知道多边形定点的坐标,怎么判断点是否在多边形范围内呢?

help inpolygon

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

spano 发表于 2007-11-16 18:56

原帖由 eight 于 2007-11-16 17:12 发表 http://www.chinavib.com/forum/images/common/back.gif


help inpolygon

这个问题我已经回答过多次,下次请先搜索一下
...
没有找到,我后来自己写了个判断的函数.

spano 发表于 2007-11-18 10:52

原帖由 spano 于 2007-11-16 18:56 发表 http://www.chinavib.com/forum/images/common/back.gif

...
没有找到,我后来自己写了个判断的函数.
function mark=determine(polygon,point)
%令PI为a,a=8
a=8;
polypoint_num= size(polygon,1);
polygon =;
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

spano 发表于 2007-11-20 10:32

当将土质分为多层,然后算每层的量的时候发现计算量很大。比如10*10的范围,分为6层,然后格网大小设置为0.1,计算时间大约要10分钟。当用1的时候计算很快。但是我想精度优先,尽量得到准确的结果。
有什么办法缩短计算时间没有?

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

eight 发表于 2007-11-20 15:58

原帖由 spano 于 2007-11-20 10:32 发表 http://www.chinavib.com/forum/images/common/back.gif
当将土质分为多层,然后算每层的量的时候发现计算量很大。比如10*10的范围,分为6层,然后格网大小设置为0.1,计算时间大约要10分钟。当用1的时候计算很快。但是我想精度优先,尽量得到准确的结果。
有什么办法 ...
你的文件那么多循环,当然慢啦。用 inpolygon 命令不行吗?

spano 发表于 2007-11-20 16:21

原帖由 eight 于 2007-11-20 15:58 发表 http://www.chinavib.com/forum/images/common/back.gif

你的文件那么多循环,当然慢啦。用 inpolygon 命令不行吗?
用到了inpolygon函数,不过时间上并没有缩短多少。后来想可能是网格太密了,回去把程序发上来,各位帮忙分析下

eight 发表于 2007-11-20 16:22

原帖由 spano 于 2007-11-20 16:21 发表 http://www.chinavib.com/forum/images/common/back.gif

用到了inpolygon函数,不过时间上并没有缩短多少。后来想可能是网格太密了,回去把程序发上来,各位帮忙分析下
自己 profile 一下吧
页: [1] 2
查看完整版本: 如何用matlab计算体积