POJ 1408.Fishnet

题目: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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值