主题:[讨论]多边形面积
zhangqun0949
[专家分:50] 发布于 2010-03-16 21:13:00
不知道哪位大哥有任意多边形面积的计算方法,或者程序!
回复列表 (共13个回复)
沙发
asymptotic [专家分:16630] 发布于 2010-03-16 23:21:00
我个人的想法:
1. 首先将点 (xi, yi)排序;
2. 用混合积的方法,计算三角形面积
(x1, y1)--(x2, y2)--(x3, y3)
(x1, y1)--(x3, y3)--(x4, y4)
(x1, y1)--(x4, y4)--(x5, y5)
...
板凳
trimtrim [专家分:1640] 发布于 2010-03-17 16:30:00
以前学过数网格求面积,楼主可以实现一下
3 楼
zhangqun0949 [专家分:50] 发布于 2010-03-17 17:32:00
能说的再具体点么?谢谢!原理或者思路!
4 楼
yeg001 [专家分:14390] 发布于 2010-03-18 01:38:00
任意多边形包括凹多边形吗?
6 楼
ridgepolewang [专家分:60] 发布于 2010-03-25 10:53:00
我的想法是分割成三角形,然后用海伦公式:s=(L*(L-A)*(L-B)*(L-C))^0.5
l是三角形周长的一半。
凸多边形好说,凹多边形目前还未有想法……
7 楼
asymptotic [专家分:16630] 发布于 2010-03-25 12:37:00
那首先还得求边长,这个也需要计算时间。
8 楼
yrliu [专家分:750] 发布于 2010-03-25 18:02:00
下面这个链接有方法
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 楼
weixing1531 [专家分:2580] 发布于 2010-03-26 23:51:00
《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 楼
yrliu [专家分:750] 发布于 2010-03-27 01:01:00
不好意思,俺的程序有错误,
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
我来回复