An Easy Problem?! POJ - 2826
题意:给两条线段,判断两条线段能够接多少从天上落下的水,把这个水从侧面投影,求这个投影的面积
思路:首先要判断这两条线段能不能接到水:
1、不相交不行
2、有一条线段平行于x轴不行
3、上端线段挡住了下端线段接水不行
这三个条件都避开之后就可以计算三角形的面积了,利用叉积的方法计算可以减小误差,求出两条线段相交的交点,然后将线段上段的两个点分别作平行于x轴的直线,交于另外一条线段,会产生两个三角形,这两个都求出来取一个min就好了。因为只有小的那个是有效的,平行线延长求出的是直线交点,较大的三角形的那个交点其实是不存在的。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std;
#define eps 1e-8
double sgn(double x) {
if(fabs(x) < eps) return 0;
if(x < 0) return -1;
else return 1;
}
struct Point {
// 表示点
double x, y;
Point(){
}
Point(double _x,double _y) {
x = _x; y = _y;
}
Point operator + (const Point& b) const {
return Point(x + b.x,y + b.y);
}
Point operator - (const Point &b) const {
return Point(x - b.x,y - b.y);
}
double operator * (const Point &b) const {
return x*b.x + y*b.y;
}
double operator ^ (const Point &b)