怎样求多边形的面积???

时间:2023-01-08 11:16:41
在平面上给出任意个点
怎样用算法求出由这几个点构成的多边形的面积?

25 个解决方案

#1


面积不是固定的.

#2


不是的
多边形的点是任意给出的

#3


切割成 nodesize-2 个三角形,在用三角面积公式计算,求和

area=0;
for(i=1;i < nodesize-2; i++)
{
    area+= compute_area_size(node[0],node[i],node[i+1]);
}

#4



用 compute_triangel_size,呵呵,就是这个意思

#5


compute_triangel_size这个是C++自带的函数吗?

#6


不知道有没有记错:
点的顺序不确定的话,面积不是固定的.
如果是顺序的(顺时针/逆时针),设N边形第k点的坐标为(x[k],y[k])可以求 x[i]*y[i+1]-x[i+1]*y[i]的和,其中i从1到N,当i=N+1时,i取1.这个和绝对值的一半就是面积吧

#7


应该是切割成三角形吧

#8


首先要生成多边形
  从给定的多个点上是有可能生成不同的多边形的
不确定多边形的生成方法,是无法确定多边形的形状的,更无法确定面积

除非你的多边形特殊只有3个点,否则多边形就存在多种可能,有多种不同的面积。

#9


生成多边形,其实就是指定这些顶点的顺序
在确定了顺序后, 假定是p0, p2, ...., pn-1
那么多边形的面积可以简单的按照如下公式计算

float area = 0;
for (int i=0, j=1; i<n; i++, j++)
{
   j = j % n;
   area += p[i].x*p[j].y - p[i].y*p[j].x;
}
area = fabs( area * 0.5);

#10


帮顶!

#11


顶下

#12


是啊 顶点的顺序 应该是确定的吧?
也就是只要能够确定多边形就能够求出它的面积

#13


怎样用算法求出由这几个点构成的多边形的面积?
===============================================
用扫描多边形的方法,可以得到面积。

#14


对于凸对边形,可以切分成n-2个三角形,每个三角形的面积用如下公式求得:

求三角形面积:给出三角形的三个边长为a,b,c,求三角形的面积。
根据海伦公式来计算三角形的面积:  S= ;Area= 
    1.输入的三角形三边长a,b,c要满足“任意两边长的和大于第三边长”。 
    2.按海伦公式计算:s=(a+b+c)/2;x=s*(s-a)*(s-b)*(s-c) 这时若x>=0,则求面积:area= ,并输出area的值。

#15


对于凹对边形,甚至会出现边与边相交的情况,即使顶点顺序确定,也不好切分成三角形。

#16


我的思路:
1、使用循环链表存储一个多边形的各顶点;
2、找出所有钝角,将凹多边形补成凸多边形;
3、计算该凸多边形的面积(切割成若干三角形),减去补上的那些多边形的面积即可。

#17


//下面我写了个计算三角形面积的片段,不知道有没有用。初编程序,错误肯定很多。^_^

#include <algorithm>
#include <string>
#include <vector>
#include <utility>
#include <iostream>
#include <fstream>
#include <stddef.h>
#include <math.h>

using namespace std;
typedef pair< double, double> coordinate;

double distance( coordinate dot1, coordinate dot2)
{
double midval = (dot1.first - dot2.first)*(dot1.first - dot2.first) + (dot1.second - dot2.second)*(dot1.second - dot2.second);
return sqrt( midval );
}

double triangle_area( double a, double b, double c )
{
double s = ( a + b + c ) / 2.0;
double tmp = s * ( s - a ) * ( s - b ) * ( s - c );
return sqrt( tmp );
}

int main() 
{

coordinate dot1, dot2, dot3;
dot1.first = 3.1;
dot1.second = 2.5;

dot2.first = 10.5;
dot2.second = 6.4;

dot3.first = 0;
dot3.second = -3.2;

double a = distance( dot1, dot2 );
double b = distance( dot1, dot3 );
double c = distance( dot2, dot3 );

cout << triangle_area( a, b, c ) << endl;

return 0;
}

#18


#include <iostream.h>
#include <math.h>

void main()
{
const int N=5;
float ps[N][2]={  //按顺时针排列的顶点坐标列表
{0,0},
{1,0},
{1,1},
{0.5,0.5},
{0,1}
};

double total=0.;

for(int i=1;i<=N-2;i++)
{
float a,b,c;
float dx,dy;
float s,area;

dx=ps[0][0]-ps[i][0];
dy=ps[0][1]-ps[i][1];
a=sqrt(dx*dx+dy*dy);

dx=ps[0][0]-ps[i+1][0];
dy=ps[0][1]-ps[i+1][1];
b=sqrt(dx*dx+dy*dy);

dx=ps[i+1][0]-ps[i][0];
dy=ps[i+1][1]-ps[i][1];
c=sqrt(dx*dx+dy*dy);

s=(a+b+c)/2;
area=sqrt(s*(s-a)*(s-b)*(s-c));

float k1,k2;
k1=(ps[i][1]-ps[0][1])/(ps[i][0]-ps[0][0]);
k2=(ps[i+1][1]-ps[0][1])/(ps[i+1][0]-ps[0][0]);
if (k2 < k1)
{
area = -area;
}

total += area;
}

cout<<total<<endl;
}

#19


同意分割成三角片的方式

#20


不好意思,有点错误
float k1,k2;
k1=(ps[i][1]-ps[0][1])/(ps[i][0]-ps[0][0]);
k2=(ps[i+1][1]-ps[0][1])/(ps[i+1][0]-ps[0][0]);
if (k2 < k1)
这段代码有时并不能判断0,i,i+1三个点是否为逆时针方向

#21


修正了三角形时针方向的判断
#include <iostream.h>
#include <math.h>

void main()
{
const int N=3;
float ps[N][2]={ //按顺时针的顶点坐标列表
{100,100},{147,154},{215,46}
};

double total=0.;

for(int i=1;i<=N-2;i++)
{
float a,b,c;
float dx,dy;
float s,area;

dx=ps[0][0]-ps[i][0];
dy=ps[0][1]-ps[i][1];
a=sqrt(dx*dx+dy*dy);

dx=ps[0][0]-ps[i+1][0];
dy=ps[0][1]-ps[i+1][1];
b=sqrt(dx*dx+dy*dy);

dx=ps[i+1][0]-ps[i][0];
dy=ps[i+1][1]-ps[i][1];
c=sqrt(dx*dx+dy*dy);

s=(a+b+c)/2;
area=sqrt(s*(s-a)*(s-b)*(s-c));

if ((ps[i][1]-ps[0][1])*(ps[i+1][0]-ps[0][0])-(ps[i+1][1]-ps[0][1])*(ps[i][0]-ps[0][0])<0)
{
area = -area;
}

total += area;
}

cout<<total<<endl;
}

#22


别费劲了

对于三角形来说,已知边长度的时候用海伦公式
在已知顶点坐标的时候看前面的yliang(风之悄语) 的说明

对于多边形更是如此

这里计算量上的差距是天壤之别的

#23


double area = 0;
for ( i = 0; i < N; i++ )
area += p[i].x * p[(i+1)%N].y - p[(i+1)%N].x * p[i].y;
area /= 2;
cout<<area<<endl;

#24


这些算法只对不自相交的多边形有效,如果多边形自相交,则必须拆分成不自相交的多边形再计算。

#25


对多边行进行切割,从水平方向或垂直方向上进行切割。切割为三角形,然后求面积。

#1


面积不是固定的.

#2


不是的
多边形的点是任意给出的

#3


切割成 nodesize-2 个三角形,在用三角面积公式计算,求和

area=0;
for(i=1;i < nodesize-2; i++)
{
    area+= compute_area_size(node[0],node[i],node[i+1]);
}

#4



用 compute_triangel_size,呵呵,就是这个意思

#5


compute_triangel_size这个是C++自带的函数吗?

#6


不知道有没有记错:
点的顺序不确定的话,面积不是固定的.
如果是顺序的(顺时针/逆时针),设N边形第k点的坐标为(x[k],y[k])可以求 x[i]*y[i+1]-x[i+1]*y[i]的和,其中i从1到N,当i=N+1时,i取1.这个和绝对值的一半就是面积吧

#7


应该是切割成三角形吧

#8


首先要生成多边形
  从给定的多个点上是有可能生成不同的多边形的
不确定多边形的生成方法,是无法确定多边形的形状的,更无法确定面积

除非你的多边形特殊只有3个点,否则多边形就存在多种可能,有多种不同的面积。

#9


生成多边形,其实就是指定这些顶点的顺序
在确定了顺序后, 假定是p0, p2, ...., pn-1
那么多边形的面积可以简单的按照如下公式计算

float area = 0;
for (int i=0, j=1; i<n; i++, j++)
{
   j = j % n;
   area += p[i].x*p[j].y - p[i].y*p[j].x;
}
area = fabs( area * 0.5);

#10


帮顶!

#11


顶下

#12


是啊 顶点的顺序 应该是确定的吧?
也就是只要能够确定多边形就能够求出它的面积

#13


怎样用算法求出由这几个点构成的多边形的面积?
===============================================
用扫描多边形的方法,可以得到面积。

#14


对于凸对边形,可以切分成n-2个三角形,每个三角形的面积用如下公式求得:

求三角形面积:给出三角形的三个边长为a,b,c,求三角形的面积。
根据海伦公式来计算三角形的面积:  S= ;Area= 
    1.输入的三角形三边长a,b,c要满足“任意两边长的和大于第三边长”。 
    2.按海伦公式计算:s=(a+b+c)/2;x=s*(s-a)*(s-b)*(s-c) 这时若x>=0,则求面积:area= ,并输出area的值。

#15


对于凹对边形,甚至会出现边与边相交的情况,即使顶点顺序确定,也不好切分成三角形。

#16


我的思路:
1、使用循环链表存储一个多边形的各顶点;
2、找出所有钝角,将凹多边形补成凸多边形;
3、计算该凸多边形的面积(切割成若干三角形),减去补上的那些多边形的面积即可。

#17


//下面我写了个计算三角形面积的片段,不知道有没有用。初编程序,错误肯定很多。^_^

#include <algorithm>
#include <string>
#include <vector>
#include <utility>
#include <iostream>
#include <fstream>
#include <stddef.h>
#include <math.h>

using namespace std;
typedef pair< double, double> coordinate;

double distance( coordinate dot1, coordinate dot2)
{
double midval = (dot1.first - dot2.first)*(dot1.first - dot2.first) + (dot1.second - dot2.second)*(dot1.second - dot2.second);
return sqrt( midval );
}

double triangle_area( double a, double b, double c )
{
double s = ( a + b + c ) / 2.0;
double tmp = s * ( s - a ) * ( s - b ) * ( s - c );
return sqrt( tmp );
}

int main() 
{

coordinate dot1, dot2, dot3;
dot1.first = 3.1;
dot1.second = 2.5;

dot2.first = 10.5;
dot2.second = 6.4;

dot3.first = 0;
dot3.second = -3.2;

double a = distance( dot1, dot2 );
double b = distance( dot1, dot3 );
double c = distance( dot2, dot3 );

cout << triangle_area( a, b, c ) << endl;

return 0;
}

#18


#include <iostream.h>
#include <math.h>

void main()
{
const int N=5;
float ps[N][2]={  //按顺时针排列的顶点坐标列表
{0,0},
{1,0},
{1,1},
{0.5,0.5},
{0,1}
};

double total=0.;

for(int i=1;i<=N-2;i++)
{
float a,b,c;
float dx,dy;
float s,area;

dx=ps[0][0]-ps[i][0];
dy=ps[0][1]-ps[i][1];
a=sqrt(dx*dx+dy*dy);

dx=ps[0][0]-ps[i+1][0];
dy=ps[0][1]-ps[i+1][1];
b=sqrt(dx*dx+dy*dy);

dx=ps[i+1][0]-ps[i][0];
dy=ps[i+1][1]-ps[i][1];
c=sqrt(dx*dx+dy*dy);

s=(a+b+c)/2;
area=sqrt(s*(s-a)*(s-b)*(s-c));

float k1,k2;
k1=(ps[i][1]-ps[0][1])/(ps[i][0]-ps[0][0]);
k2=(ps[i+1][1]-ps[0][1])/(ps[i+1][0]-ps[0][0]);
if (k2 < k1)
{
area = -area;
}

total += area;
}

cout<<total<<endl;
}

#19


同意分割成三角片的方式

#20


不好意思,有点错误
float k1,k2;
k1=(ps[i][1]-ps[0][1])/(ps[i][0]-ps[0][0]);
k2=(ps[i+1][1]-ps[0][1])/(ps[i+1][0]-ps[0][0]);
if (k2 < k1)
这段代码有时并不能判断0,i,i+1三个点是否为逆时针方向

#21


修正了三角形时针方向的判断
#include <iostream.h>
#include <math.h>

void main()
{
const int N=3;
float ps[N][2]={ //按顺时针的顶点坐标列表
{100,100},{147,154},{215,46}
};

double total=0.;

for(int i=1;i<=N-2;i++)
{
float a,b,c;
float dx,dy;
float s,area;

dx=ps[0][0]-ps[i][0];
dy=ps[0][1]-ps[i][1];
a=sqrt(dx*dx+dy*dy);

dx=ps[0][0]-ps[i+1][0];
dy=ps[0][1]-ps[i+1][1];
b=sqrt(dx*dx+dy*dy);

dx=ps[i+1][0]-ps[i][0];
dy=ps[i+1][1]-ps[i][1];
c=sqrt(dx*dx+dy*dy);

s=(a+b+c)/2;
area=sqrt(s*(s-a)*(s-b)*(s-c));

if ((ps[i][1]-ps[0][1])*(ps[i+1][0]-ps[0][0])-(ps[i+1][1]-ps[0][1])*(ps[i][0]-ps[0][0])<0)
{
area = -area;
}

total += area;
}

cout<<total<<endl;
}

#22


别费劲了

对于三角形来说,已知边长度的时候用海伦公式
在已知顶点坐标的时候看前面的yliang(风之悄语) 的说明

对于多边形更是如此

这里计算量上的差距是天壤之别的

#23


double area = 0;
for ( i = 0; i < N; i++ )
area += p[i].x * p[(i+1)%N].y - p[(i+1)%N].x * p[i].y;
area /= 2;
cout<<area<<endl;

#24


这些算法只对不自相交的多边形有效,如果多边形自相交,则必须拆分成不自相交的多边形再计算。

#25


对多边行进行切割,从水平方向或垂直方向上进行切割。切割为三角形,然后求面积。