【计算几何】多边形面积 pascal 解…

【计算几何】多边形面积

Time Limit:1000MS  Memory Limit:65536K
Total Submit:4 Accepted:1

Description

多边形面积(area.pas/c/cpp)

【问题描述】

中学生杰利陶醉于数学研究,他思考的问题对专家而言可能太过简单,但作为一个15岁的中学生来说,他做得非常棒。他太热衷于思考数学问题,以至于轻易就会尝试用数学方法来解决碰到的问题。一天,他看到桌上的一张纸。他四岁的妹妹玛丽在上面画了一些线。那些线恰好构成一个凹多边形,如图1所示。

【计算几何】多边形面积 <wbr>pascal <wbr>解题报告

“棒极了!”他想,“这些多边形看起来是规则的。我曾经学过怎样计算三解形、矩形和圆的面积。我一定能找到计算这些图形面积的方法。”他确实做到了。首先,他标记多边形顶点的坐标,如图2所示。随后,他豪不费力的求得结果----0.75 。

【计算几何】多边形面积 <wbr>pascal <wbr>解题报告

当然,他不会满足于解决这么简单的问题。“嗯,如果纸上面的是一个任意的多边形,我应该怎么计算它的面积呢?”他问自己。可他一直都没有找到计算任意多边形面积的通用方法。他清楚地明白以他的能力无法找到问题的答案。所以他向你请教。他会很感激你好心的帮助。

Input

输入数据的第一行是一个整数n,代表图形的顶点个数(1=
接下来的N行,每行是一对实数,代表图形的顶点的坐标(xi,yi)。每个图形由第一个顶点连接第二个顶点,第二个顶点连接第三个顶点,…,最后第N个顶点连接第一个顶点形成封闭的多边形。

Output

输出图形的面积或字符串“Impossible”。
如果图形是一个多边形,计算它的面积(精确到小数后两位)。如果输入的顶点不能构成一个多边形(也就是说,一条边和另一条不相连的边相交,例如,四条线段的图形,第一条线和第三条线段相交),就输出“Impossible”,指出图形不可能是多边形。如果顶点的数量不足以构成一个封闭的多边形,也输出“Impossible”。

Sample Input

样例一
5
0 0
0 1
0.5 0.5
1 1
1 0

样例二
4
0 0
0 1
1 0
1 1

Sample Output

样例一
0.75

样例二
Impossible

Source

 

叉乘的几何意义就是以这两条向量为边的平行四边形的面积。

两条向量叉积的一半就表示这两条向量构成的三角形的面积。

这个面积是分正负的(我也不是很懂为什么)。

【计算几何】多边形面积 <wbr>pascal <wbr>解题报告
对于凸多边形,很容易理解面积公式。

对于凹多边形,△p1p4p5的面积是负的,其与 △p1p3p4和△p1p5p6 的重叠面积相抵消,也减去了△p1p5p6包括的不再多变形内的面积,所以符合面积公式。

 

 

 

var

 tot:real;

 n:longint;

 a:array[1..1001,1..2]of real;

 

procedure init;

var

 i:longint;

begin

 read(n);

 if n<3  then begin writeln('Impossible');  halt; end;

 for i:=1 to n do

  read(a[i,1],a[i,2]);

end;

 

function cj(x,y,z:longint):real;

var

 i:real;

begin

 i:=(a[x,1]-a[z,1])*(a[y,2]-a[z,2])-

    (a[x,2]-a[z,2])*(a[y,1]-a[z,1]);

 exit(i);

end;

 

procedure main;

var

 i,j:longint;

begin

 for i:=2 to n-2 do

  for j:=i+2 to n do

   if (cj(j,i,i-1)*cj(j-1,i,i-1)<0)and(cj(i,j,j-1)*cj(i-1,j,j-1)<0) then begin writeln('Impossible');  exit; end;

 

 for i:=2 to n-1 do

  tot:=tot+cj(i,i+1,1)/2;

 writeln(abs(tot):0:2)

end;

 

begin

 init;

 main;

end.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值