题目:http://poj.org/problem?id=1408
AC代码(C++):
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <vector>
#include <queue>
#include <math.h>
#include <string>
#include <string.h>
#include <bitset>
#define INF 0x7fffffff
#define LFINF 1e10
#define eps 1e-7
#define MAXN 100105
#define PI 3.14159265358979323846
using namespace std;
struct Point
{
double x,y;
Point(double x=0,double y=0):x(x),y(y) {}
};
typedef Point Vector;
Vector operator + (Vector A,Vector B) { return Vector(A.x+B.x,A.y+B.y); }
Vector operator - (Vector A,Vector B) { return Vector(A.x-B.x,A.y-B.y); }
Vector operator * (Vector A,double p) { return Vector(A.x*p,A.y*p); }
Vector operator / (Vector A,double p) { return Vector(A.x/p,A.y/p); }
int n;
Point node[40][40];
double Cross(Vector A,Vector B) { return (A.x*B.y-A.y*B.x); }
double Area2(Vector A,Vector B,Vector C) { return Cross(B-A,C-A); }
Vector Converxline(Vector A,Vector B,Vector C,Vector D)
{
Vector rtn;
rtn.x = (Area2(A,B,D)*C.x - Area2(A,B,C)*D.x)/(Area2(A,B,D)-Area2(A,B,C));
rtn.y = (Area2(A,B,D)*C.y - Area2(A,B,C)*D.y)/(Area2(A,B,D)-Area2(A,B,C));
return rtn;
}
int main(){
while(cin>>n){
if(n==0)break;
node[0][0].x=0.0;
node[0][0].y=0.0;
node[0][n+1].x=0.0;
node[0][n+1].y=1.0;
node[n+1][0].x=1.0;
node[n+1][0].y=0.0;
node[n+1][n+1].x=1.0;
node[n+1][n+1].y=1.0;
for(int i = 1; i <= n; i++){
cin>>node[i][0].x;
node[i][0].y=0.0;
}
for(int i = 1; i <= n; i++){
cin>>node[i][n+1].x;
node[i][n+1].y=1.0;
}
for(int i = 1; i <= n; i++){
cin>>node[0][i].y;
node[0][i].x=0.0;
}
for(int i = 1; i <= n; i++){
cin>>node[n+1][i].y;
node[n+1][i].x=1.0;
}
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
node[i][j] = Converxline(node[i][0],node[i][n+1],node[0][j],node[n+1][j]);
}
}
double ans = 0.0;
for(int i = 0; i <= n; i++){
for(int j = 0; j <= n; j++){
Vector v1,v2,v3;
v1 = node[i][j+1]-node[i][j];
v2 = node[i+1][j+1]-node[i][j];
v3 = node[i+1][j]-node[i][j];
double s = 0.5*fabs(Cross(v1,v2)) + 0.5*fabs(Cross(v2,v3));
if(s>ans)ans = s;
}
}
printf("%.6lf\n",ans);
}
}
总结: 计算不规则四边形的面积. 先将四边形ABCD分解成两个三角形ACD和ABD, 那么三角形ACD的面积为0.5*(AC与AD的叉积的绝对值), ABD同理, 则两个三角形面积的和就是四边形的面积. 简单几何的模板: http://blog.csdn.net/y990041769/article/details/38258761