Poj2826 An Easy Problem
呵呵哒。WA了无数次,一开始想的办法最终发现都有缺陷。首先需要知道:
1)线段不相交,一定面积为0
2)有一条线段与X轴平行,面积一定为0
3)线段相交,但是能接水的三角形上面线段把下面的线段完全覆盖。
(1),(2)的情况简单,主要是解决(3)。下面对(3)进行讨论,如下图所示,设p1,p2是两线段各自位置较高的点,p0为两线段的交点,向量e是三角形p0p1p2的关于边p1p2的外侧法向量。则当e的终点位于第1,2象限时才会有积水,3,4象限是没有的。判断e的方向可以根据它与(p0p1+p0p2)的点积,e与(p0p1+p0p2)的点积总是大于0的。
- #define _CRT_SECURE_NO_DEPRECATE
- #include<iostream>
- #include<cmath>
- #include<algorithm>
- using namespace std;
- const double PI = acos(-1.0);
- const int N = ;
- const double EPS = 1e-;//实数精度
- //点结构类型
- struct Point{
- double x, y;
- Point(double a = , double b = ){ x = a; y = b; }
- };
- //线段结构类型
- struct LineSeg{
- Point s, e;
- LineSeg(){};
- LineSeg(Point a, Point b) : s(a), e(b){}
- };
- struct Line{
- double a, b, c;
- };
- Point operator-(Point a, Point b){
- return Point(a.x - b.x, a.y - b.y);
- }
- //重载==,判断点a,b是否相等
- bool operator==(Point a, Point b){
- return abs(a.x - b.x) < EPS&&abs(a.y - b.y) < EPS;
- }
- //比较实数r1与r2的大小关系
- int RlCmp(double r1, double r2 = ){
- if (abs(r1 - r2) < EPS)
- return ;
- return r1>r2 ? : -;
- }
- //返回向量p1-p0和p2-p0的叉积
- double Cross(Point p0, Point p1, Point p2){
- Point a = p1 - p0;
- Point b = p2 - p0;
- return a.x*b.y - b.x*a.y;
- }
- //判断线段L1与线段L2是否相交(包括交点在线段上)
- bool Intersect(LineSeg L1, LineSeg L2){
- //排斥实验和跨立实验
- return max(L1.s.x, L1.e.x) >= min(L2.s.x, L2.e.x)
- && min(L1.s.x, L1.e.x) <= max(L2.s.x, L2.e.x)
- && max(L1.s.y, L1.e.y) >= min(L2.s.y, L2.e.y)
- && min(L1.s.y, L1.e.y) <= max(L2.s.y, L2.e.y)
- && Cross(L1.s, L1.e, L2.s)*Cross(L1.s, L1.e, L2.e) <=
- && Cross(L2.s, L2.e, L1.s)*Cross(L2.s, L2.e, L1.e) <= ;
- }
- Line MakeLine(Point a, Point b){
- Line L;
- L.a = (b.y - a.y);
- L.b = (a.x - b.x);
- L.c = (b.x*a.y - a.x*b.y);
- if (L.a < ){ //保准x系数大于等于0
- L.a = -L.a;
- L.b = -L.b;
- L.c = -L.c;
- }
- return L;
- }
- //判直线X,Y是否相交,相交返回true和交点
- bool LineIntersect(Line X, Line Y, Point&P){
- double d = X.a*Y.b - Y.a*X.b;
- if (d == ) //直线平行或者重合
- return false;
- P.x = (X.b*Y.c - Y.b*X.c) / d;
- P.y = (X.c*Y.a - Y.c*X.a) / d;
- return true;
- }
- Point HighPoint(Point a, Point b){
- return a.y > b.y ? a : b;
- }
- Point LowPoint(Point a, Point b){
- return a.y < b.y ? a : b;
- }
- double Dot(Point a, Point b){
- return a.x*b.x + a.y*b.y;
- }
- double Area(LineSeg L1, LineSeg L2){
- if (!Intersect(L1, L2))
- return ; //不相交
- Line X = MakeLine(L1.s, L1.e);
- Line Y = MakeLine(L2.s, L2.e);
- if (RlCmp(X.a*Y.a) == ) //有一条直线与x平行
- return ;
- Point inter;
- LineIntersect(X, Y, inter); //计算交点
- double y = min(max(L1.e.y, L1.s.y), max(L2.e.y, L2.s.y));
- double x1 = -(X.b*y + X.c) /X.a;
- double x2 = -(Y.b*y + Y.c) / Y.a;
- Point p1(x1, y), p2(x2, y);
- double area = abs(Cross(inter, p1, p2) / ); //计算面积
- if (RlCmp(X.b*Y.b) == ) //有一条线与Y轴平行
- return area;
- double k1 = -X.a / X.b; //X的斜率
- double k2 = -Y.a / Y.b; //Y的斜率
- Point high = HighPoint(HighPoint(L1.s, L1.e),HighPoint(L2.s, L2.e));
- Point low = LowPoint(HighPoint(L1.s, L1.e), HighPoint(L2.s, L2.e));
- if (RlCmp(high.y - low.y) == )
- return area;
- if (RlCmp(high.x - low.x) == )
- return ;
- double k = -(high.x - low.x) / (high.y - low.y);
- Point mid((high.x + low.x) / , (high.y + low.y) / );
- Point op = mid - inter;
- Point ans;
- if (RlCmp(Dot(op, Point(, k))) >= )
- ans = Point(, k);
- else
- ans = Point(-, -k);
- if ((ans.x > && ans.y > || (ans.x< && ans.y>)))
- return area;
- else
- return ;
- }
- int main(){
- int T;
- double a, b, c, d;
- scanf("%d", &T);
- while (T--){
- scanf("%lf%lf%lf%lf", &a, &b, &c, &d);
- LineSeg L1(Point(a, b), Point(c, d));
- scanf("%lf%lf%lf%lf", &a, &b, &c, &d);
- LineSeg L2(Point(a, b), Point(c, d));
- double area = Area(L1, L2);
- printf("%.2lf\n", area);
- }
- return ;
- }
Poj2826 An Easy Problem的更多相关文章
- poj2826 An Easy Problem?!【计算几何】
含[三点坐标计算面积].[判断两线段是否有交点].[求线段交点]模板 An Easy Problem?! Time Limit: 1000MS Memory Limit: 65536K Tot ...
- poj2826 An Easy Problem?!(计算几何)
传送门 •题意 两根木块组成一个槽,给定两个木块的两个端点 雨水竖直下落,问槽里能装多少雨水, •思路 找不能收集到雨水的情况 我们令线段较高的点为s点,较低的点为e点 ①两条木块没有交点 ②平行或重 ...
- UVA-11991 Easy Problem from Rujia Liu?
Problem E Easy Problem from Rujia Liu? Though Rujia Liu usually sets hard problems for contests (for ...
- An easy problem
An easy problem Time Limit:3000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Sub ...
- UVa 11991:Easy Problem from Rujia Liu?(STL练习,map+vector)
Easy Problem from Rujia Liu? Though Rujia Liu usually sets hard problems for contests (for example, ...
- POJ 2826 An Easy Problem?!
An Easy Problem?! Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7837 Accepted: 1145 ...
- hdu 5475 An easy problem(暴力 || 线段树区间单点更新)
http://acm.hdu.edu.cn/showproblem.php?pid=5475 An easy problem Time Limit: 8000/5000 MS (Java/Others ...
- 【暑假】[实用数据结构]UVa11991 Easy Problem from Rujia Liu?
UVa11991 Easy Problem from Rujia Liu? 思路: 构造数组data,使满足data[v][k]为第k个v的下标.因为不是每一个整数都会出现因此用到map,又因为每 ...
- HDU 5475 An easy problem 线段树
An easy problem Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pi ...
随机推荐
- 使用 Spirit 类在 XNA 中创建游戏中的基本单位精灵(十三)
平方已经开发了一些 Windows Phone 上的一些游戏,算不上什么技术大牛.在这里分享一下经验,仅为了和各位朋友交流经验.平方会逐步将自己编写的类上传到托管项目中,没有什么好名字,就叫 WPXN ...
- maven文件报错(pom.xml或者jar包缺失)解决方法
相信很多朋友在myeclipse上把maven配置好了,但是新建maven项目的时候会报错,下面我来总结以下我遇到的问题. 新建完maven项目后,pom.xml报错 1.报错的原因:很多时候我们在下 ...
- 使用shell脚本生成数据库markdown文档
学习shell脚本编程的一次实践,通过shell脚本生成数据库的markdown文档,代码如下: HOST=xxxxxx PORT=xxxx USER="xxxxx" PASSWO ...
- python矩阵和向量的转置问题
numpy有很多方法进行转置,这里由于时间和精力限制(主要是我实在比较懒,有一个基本上一直能使的,就懒得看其他的了),其他方法我没研究,这里我总结的东西,如果有问题,欢迎各路大佬拍砖 一.创建矩阵: ...
- Visual C++斗地主游戏网络版源代码
说明:VC++ 6.0写的网络版斗地主游戏,程序基于directx SDK开发,因此你在编译时需要引入相应文件才可以,本斗地主可以支持双人对战.网络对战,游戏随机产生地主,动画发牌,界面也不错,还有声 ...
- linux系统负载状态检查脚本
为了便于分析问题,编写了一个linux状态检查脚本,脚本可放置任意目录,脚本执行检测后会输出日志记录到当前目录下.直接执行脚本可用于一次检测,可通过日志进行分析.如果需要长时间监测,可执行-x参数,脚 ...
- html获取当前地址的参数
//jsd代码 function UrlSearch(){ var name,value; var str1 = ""; var str=loc ...
- POJ2749 Building roads 【2-sat】
题目 Farmer John's farm has N barns, and there are some cows that live in each barn. The cows like to ...
- 版本控制——hg教程
hg教程 引用来自官方网站的思维导图,来说明hg的使用规则:
- spring+freemarker+redis
1./pom.xml文件内容: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http ...