多边形面积的计算100分

时间:2021-09-30 10:18:16
现在小弟有个问题,请教各位一下。
现在有个题目计算多边形xy面投影面积,和多边形空间面积。
我的思路
1.是把多边形分解成三角形,通过计算三角形的面积来求得多边形的面积。
2.利用坐标(x,y,z)通过矢量叉乘来计算三角形的面积。这样可以不受凸或者是凹多边形的影响,都能计算。
下面是我的代码.
问题:我计算出xy面的投影面积比计算的空间面积要大,明显是不可能的。但是我检查很久,并没有发现代码或公式的问题,请教一下,发现问题者,我将严重加分,呵呵。
 

struct 
{double x;
double y;
double z;
}POINT3D;

//用向量进行面积计算,可以避免凸和凹多变形的区别
double result =0;
int NumPoint= m_pPtArray.GetSize();//坐标点数组
double sum = 0;
if(NumPoint<3) return 0;
double l1,l2,m1,m2,n1,n2;
for(int m =1;m < NumPoint-1;m++)
{
if(NumPoint < 3)break;
//xy面
if(mianhao ==1)
{
m1 = m_pPtArray.GetAt(m).x;
m2 = m_pPtArray.GetAt(m).y;
l1 = m_pPtArray.GetAt(0).x ;
l2 = m_pPtArray.GetAt(0).y ;
n1 = m_pPtArray.GetAt(m+1).x;
n2 = m_pPtArray.GetAt(m+1).y;
}
}
POINT3D r1;
r1.x = m1 - l1;
r1.y = m2 - l2;
POINT3D r2;

r2.x = n1 - l1;
r2.y = n2 - l2;
sum += (r1.x * r2.y - r2.x * r1.y);
         //xy面投影结果
         result = (sum>0)?(sum/2):(-sum/2);
//////////////////////////////////////////////////////////
//空间面积计算
double m_x,m_y,m_z,l_x,l_y,l_z,n_x,n_y,n_z;

double areasum =0 ;
for(int m =1; m<ptarray->GetSize ()-1;m++)
{
m_x = ptarray->GetAt(m).x;
m_y = ptarray->GetAt(m).y;
m_z = ptarray->GetAt(m).z;

l_x = ptarray->GetAt(0).x ;
l_y = ptarray->GetAt(0).y ;
l_z = ptarray->GetAt(0).z ;

n_x = ptarray->GetAt(m+1).x;
n_y = ptarray->GetAt(m+1).y;
n_z = ptarray->GetAt(m+1).z;

POINT3D r1;
r1.x = m_x - l_x ;
r1.y = m_y - l_y ;
r1.z = m_z - l_z ;
POINT3D r2;
r2.x = n_x - l_x;
r2.y = n_y - l_y;
r2.z = n_z - l_z;

areasum +=r1.y *r2.z -r2.y *r1.z+ r1.z *r2.x+ r1.x *r2.y- r2.z *r1.x - r2.x *r1.y;
}
areasum = (areasum>0)?(areasum/2):(-areasum/2);
return areasum;

14 个解决方案

#1


思路错误,每个小三角形相加 〉=总体

因为小三角形会有重复的区域。

#2


凸的可能正确,凹的显然错误。
有点乱,lz整理一下,需要。

#3


代码很不全哦,问楼主一下,什么叫空间面积?

#4


2维 多边形吧?

#5


楼主,空见面积是不是平面面积?
先把你的数学公式拿出来看看。
还有你的代码不全。

#6


看不懂ing……

#7


楼主的三角形选取算法有问题吧,不是简单的顺序选取。

#8


用多边形扫描算法能计算面积。

#9


用矢量计算面积不会错的啊。每个三角形算的面积有正负之分,两个矢量的叉乘就是两矢量的组成的平行四边形,最后把面积分一半,就可以了。
再问一下楼上,你所说的扫描算法是什么啊?

计算三维多边形面积,给出代码,严重加分啊~~

#10


先分成N个三角形,然后用微积分的思想计算每一个三角形的面积,最后求和

#11


定啊~

#12


我来说一个简单方法,先用 CRgn 创建一个相同的多边形(r),然后对对多边形进行三角形划分,取新增边的中点,然后用 r.PtInRegion() 判断该点是否在多边形区域内,如果不在,则表明该三角形不属于多边形,以此类推,找出所有的三角形,然后用海伦公式计算三角形的面积,最后全部加起来

#13


这个算法不大好。

你试试平行曲线分割,用小块正方形算。

#14


...普天下 面积怎么算啊

#1


思路错误,每个小三角形相加 〉=总体

因为小三角形会有重复的区域。

#2


凸的可能正确,凹的显然错误。
有点乱,lz整理一下,需要。

#3


代码很不全哦,问楼主一下,什么叫空间面积?

#4


2维 多边形吧?

#5


楼主,空见面积是不是平面面积?
先把你的数学公式拿出来看看。
还有你的代码不全。

#6


看不懂ing……

#7


楼主的三角形选取算法有问题吧,不是简单的顺序选取。

#8


用多边形扫描算法能计算面积。

#9


用矢量计算面积不会错的啊。每个三角形算的面积有正负之分,两个矢量的叉乘就是两矢量的组成的平行四边形,最后把面积分一半,就可以了。
再问一下楼上,你所说的扫描算法是什么啊?

计算三维多边形面积,给出代码,严重加分啊~~

#10


先分成N个三角形,然后用微积分的思想计算每一个三角形的面积,最后求和

#11


定啊~

#12


我来说一个简单方法,先用 CRgn 创建一个相同的多边形(r),然后对对多边形进行三角形划分,取新增边的中点,然后用 r.PtInRegion() 判断该点是否在多边形区域内,如果不在,则表明该三角形不属于多边形,以此类推,找出所有的三角形,然后用海伦公式计算三角形的面积,最后全部加起来

#13


这个算法不大好。

你试试平行曲线分割,用小块正方形算。

#14


...普天下 面积怎么算啊