现在有个题目计算多边形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整理一下,需要。
有点乱,lz整理一下,需要。
#3
代码很不全哦,问楼主一下,什么叫空间面积?
#4
2维 多边形吧?
#5
楼主,空见面积是不是平面面积?
先把你的数学公式拿出来看看。
还有你的代码不全。
先把你的数学公式拿出来看看。
还有你的代码不全。
#6
看不懂ing……
#7
楼主的三角形选取算法有问题吧,不是简单的顺序选取。
#8
用多边形扫描算法能计算面积。
#9
用矢量计算面积不会错的啊。每个三角形算的面积有正负之分,两个矢量的叉乘就是两矢量的组成的平行四边形,最后把面积分一半,就可以了。
再问一下楼上,你所说的扫描算法是什么啊?
计算三维多边形面积,给出代码,严重加分啊~~
再问一下楼上,你所说的扫描算法是什么啊?
计算三维多边形面积,给出代码,严重加分啊~~
#10
先分成N个三角形,然后用微积分的思想计算每一个三角形的面积,最后求和
#11
定啊~
#12
我来说一个简单方法,先用 CRgn 创建一个相同的多边形(r),然后对对多边形进行三角形划分,取新增边的中点,然后用 r.PtInRegion() 判断该点是否在多边形区域内,如果不在,则表明该三角形不属于多边形,以此类推,找出所有的三角形,然后用海伦公式计算三角形的面积,最后全部加起来
#13
这个算法不大好。
你试试平行曲线分割,用小块正方形算。
你试试平行曲线分割,用小块正方形算。
#14
...普天下 面积怎么算啊
#1
思路错误,每个小三角形相加 〉=总体
因为小三角形会有重复的区域。
因为小三角形会有重复的区域。
#2
凸的可能正确,凹的显然错误。
有点乱,lz整理一下,需要。
有点乱,lz整理一下,需要。
#3
代码很不全哦,问楼主一下,什么叫空间面积?
#4
2维 多边形吧?
#5
楼主,空见面积是不是平面面积?
先把你的数学公式拿出来看看。
还有你的代码不全。
先把你的数学公式拿出来看看。
还有你的代码不全。
#6
看不懂ing……
#7
楼主的三角形选取算法有问题吧,不是简单的顺序选取。
#8
用多边形扫描算法能计算面积。
#9
用矢量计算面积不会错的啊。每个三角形算的面积有正负之分,两个矢量的叉乘就是两矢量的组成的平行四边形,最后把面积分一半,就可以了。
再问一下楼上,你所说的扫描算法是什么啊?
计算三维多边形面积,给出代码,严重加分啊~~
再问一下楼上,你所说的扫描算法是什么啊?
计算三维多边形面积,给出代码,严重加分啊~~
#10
先分成N个三角形,然后用微积分的思想计算每一个三角形的面积,最后求和
#11
定啊~
#12
我来说一个简单方法,先用 CRgn 创建一个相同的多边形(r),然后对对多边形进行三角形划分,取新增边的中点,然后用 r.PtInRegion() 判断该点是否在多边形区域内,如果不在,则表明该三角形不属于多边形,以此类推,找出所有的三角形,然后用海伦公式计算三角形的面积,最后全部加起来
#13
这个算法不大好。
你试试平行曲线分割,用小块正方形算。
你试试平行曲线分割,用小块正方形算。
#14
...普天下 面积怎么算啊