回 帖 发 新 帖 刷新版面

主题:[讨论]多边形面积

不知道哪位大哥有任意多边形面积的计算方法,或者程序!

回复列表 (共13个回复)

沙发

我个人的想法:
1. 首先将点 (xi, yi)排序;
2. 用混合积的方法,计算三角形面积 
(x1, y1)--(x2, y2)--(x3, y3)
(x1, y1)--(x3, y3)--(x4, y4)
(x1, y1)--(x4, y4)--(x5, y5)
...

板凳

以前学过数网格求面积,楼主可以实现一下

3 楼


能说的再具体点么?谢谢!原理或者思路!

4 楼

任意多边形包括凹多边形吗?

5 楼


凸凹都包括

6 楼


我的想法是分割成三角形,然后用海伦公式:s=(L*(L-A)*(L-B)*(L-C))^0.5
l是三角形周长的一半。
凸多边形好说,凹多边形目前还未有想法……

7 楼

那首先还得求边长,这个也需要计算时间。

8 楼

下面这个链接有方法

http://faq.csdn.net/read/179049.html

俺的程序:

module comval
integer,parameter:: num=8
double precision:: xray(num),yray(num)
end module

program multirec
use comval
implicit none
integer:: i,j
double precision:: area,totarea=0.0,caltri

do i=0,7
xray(i+1)=i
enddo
yray(1)=0
yray(2)=1
yray(3)=7
yray(4)=3
yray(5)=5
yray(6)=2
yray(7)=10
yray(8)=20

do i=2,num-1
    j=i+1
    area=caltri(1,i,j)
    if ( (area .ne. 0.0) .or. (area .eq. 0.0 .and. i .eq. num-1) ) then
        totarea=totarea+area
    else
        area=caltri(1,i,j+1)
        if (area .eq. 0.0) then
            print *,"Error: Four points in one line:",1,i,j,j+1
            stop
        else
            totarea=totarea+area+caltri(i,j,j+1)
        endif
    endif
enddo 
print*,"Total area:", abs(totarea)
end program

double precision function caltri(i,j,k)
use comval
implicit none 
integer:: i,j,k
double precision:: a,b,c,d,e,f
a=xray(i);b=yray(i);c=xray(j);d=yray(j);e=xray(k);f=yray(k)
caltri=0.5*(a*d+b*e+c*f-d*e-b*c-a*f)
end function

9 楼

《FORTRAN 95/2003 程序设计》这本书的第688页的课后题16-4

多边形的面积计算公式(前提:这些顶点为有序的):

A=(x(1)*y(2)+x(2)*y(3)+…+x(n-1)*y(n)+x(n)*y(1)-y(1)*x(2)-y(2)*x(3)-…-y(n-1)*x(n)-y(n)*x(1))/2.0

其中x(i)和y(i)是第i点的x,y坐标,n为总点数,A为多边形的面积(逆时针为正,顺时针为负)

采用数学归纳法证明:

当n=3时,采用向量叉乘法则(三顶点z方向坐标均设为0)即可说明公式成立

假设k=n时,公式成立

那么当k=n+1时

即(n+1)边形为在原来n边形的基础上再加上一个三角形(三顶点分别为第1、n、n+1这三点)

经一系列推导后公式在当k=n+1也成立

10 楼

不好意思,俺的程序有错误,

module comval
integer,parameter:: num=8
double precision:: xray(num),yray(num)
end module

program multirec
use comval
implicit none
integer:: i,j
double precision:: area,totarea=0.0,caltri

do i=0,7
xray(i+1)=i
enddo
yray(1)=0
yray(2)=1
yray(3)=1
yray(4)=3
yray(5)=4
yray(6)=6
yray(7)=3
yray(8)=1

do i=2,num-1
    j=i+1
    area=caltri(1,i,j)
    totarea=totarea+area
enddo
print*,"Total area:", abs(totarea)
end program

double precision function caltri(i,j,k)
use comval
implicit none 
integer:: i,j,k
double precision:: a,b,c,d,e,f
a=xray(i);b=yray(i);c=xray(j);d=yray(j);e=xray(k);f=yray(k)
caltri=0.5*(a*d+b*e+c*f-d*e-b*c-a*f)
end function

我来回复

您尚未登录,请登录后再回复。点此登录或注册