【计算几何】CDOJ1720 几何几何


#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
#define EPS 0.00000001
struct Point{
double x,y;
}a[2],b[2];
typedef Point Vector;
Vector operator * (const double &a,const Vector &v){
return (Vector){a*v.x,a*v.y};
}
Vector operator - (const Point &a,const Point &b){
return (Vector){a.x-b.x,a.y-b.y};
}
Vector operator + (const Vector &a,const Vector &b){
return (Vector){a.x+b.x,a.y+b.y};
}
double Cross(const Vector &a,const Vector &b){
return a.x*b.y-a.y*b.x;
}
Point GetIntersection(Point P,Vector v,Point Q,Vector w){
return P+(Cross(w,P-Q)/Cross(v,w))*v;
}
bool inLine(Point p,Point a,Point b){
if(a.x>b.x){
swap(a,b);
}
if(p.x-a.x>-EPS && b.x-p.x>-EPS){
return 1;
}
return 0;
}
int main(){
while(scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&a[0].x,&a[0].y,&a[1].x,&a[1].y,&b[0].x,&b[0].y,&b[1].x,&b[1].y)!=EOF){
if(fabs(a[0].y-a[1].y)<EPS || fabs(b[0].y-b[1].y)<EPS){
puts("0.00");
continue;
}
if(fabs(Cross(a[0]-a[1],b[0]-b[1]))<EPS){
puts("0.00");
continue;
}
if(a[0].y<a[1].y){
swap(a[0],a[1]);
}
if(b[0].y<b[1].y){
swap(b[0],b[1]);
}
Point p=GetIntersection(a[0],a[1]-a[0],b[0],b[1]-b[0]);
if((!inLine(p,a[0],a[1])) || (!inLine(p,b[0],b[1]))){
puts("0.00");
continue;
}
if(a[0].y<b[0].y){
swap(a[0],b[0]);
swap(a[1],b[1]);
}
if(fabs(a[0].y-b[0].y)<EPS){
printf("%.2f\n",fabs(a[0].x-b[0].x)*0.5*fabs(p.y-a[0].y));
continue;
}
if((!fabs(a[0].x-a[1].x)<EPS) && (!fabs(b[0].x-b[1].x)<EPS)){
double ka=(a[0].y-a[1].y)/(a[0].x-a[1].x);
double kb=(b[0].y-b[1].y)/(b[0].x-b[1].x);
if((ka>EPS && kb>EPS) || (ka<EPS && kb<EPS)){
if(fabs(ka)-fabs(kb)>EPS){
if((a[0].x-b[0].x<EPS && p.x-b[0].x>-EPS) || (a[0].x-b[0].x>-EPS && p.x-b[0].x<EPS)){
puts("0.00");
continue;
}
}
}
}
double rr=(b[0].y-p.y)/(a[0].y-p.y);
Point bc=p+rr*(a[0]-p);
printf("%.2f\n",0.5*(b[0].y-p.y)*fabs(bc.x-b[0].x));
}
return 0;
}
【计算几何】CDOJ1720 几何几何的更多相关文章
- Geometry 判断几何是否被另一个几何/线段分割成多段
如下图,如何判断几何多边形A被多边形B,切割为多段几何? 几何A被几何B切割 1. 获取几何A与几何B的交集C var intersectGeometry = new CombinedGeometry ...
- [知识点]计算几何I——基础知识与多边形面积
// 此博文为迁移而来,写于2015年4月9日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102vxaq.html 1.前言 ...
- UVA12304 2D Geometry 110 in 1! 计算几何
计算几何: 堆几何模版就能够了. . .. Description Problem E 2D Geometry 110 in 1! This is a collection of 110 (in bi ...
- 计算几何 val.2
目录 计算几何 val.2 几何单位结构体板子 旋转卡壳 基础概念 求法 模板 半平面交 前置芝士:线段交 S&I算法 模板 最小圆覆盖 随机增量法 时间复杂度 模板 后记 计算几何 val. ...
- LA 3263 好看的一笔画 欧拉几何+计算几何模板
题意:训练指南260 #include <cstdio> #include <cstring> #include <algorithm> #include < ...
- NOIP2002矩形覆盖[几何DFS]
题目描述 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4(0,7),见图一. 这 ...
- Direct2D 几何计算和几何变幻
D2D不仅可以绘制,还可以对多个几何图形对象进行空间运算.这功能应该在GIS界比较吃香. 这些计算包括: 合并几何对象,可以设置求交还是求并,CombineWithGeometry 边界,加宽边界,查 ...
- You can Solve a Geometry Problem too (hdu1086)几何,判断两线段相交
You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/3276 ...
- Direct2D教程III——几何(Geometry)对象
目前博客园中成系列的Direct2D的教程有 1.万一的 Direct2D 系列,用的是Delphi 2009 2.zdd的 Direct2D 系列,用的是VS中的C++ 3.本文所在的 Direct ...
随机推荐
- spring-retry 重试机制
业务场景 应用中需要实现一个功能: 需要将数据上传到远程存储服务,同时在返回处理成功情况下做其他操作.这个功能不复杂,分为两个步骤:第一步调用远程的Rest服务逻辑包装给处理方法返回处理结果:第二步拿 ...
- /proc/diskstats文件注解
/proc/diskstats 注解 今儿在准备利用shell监控磁盘读写次数等信息时,看到该文件,但是又不清楚每段的具体含义,这里备注下. 文件内容 [root@namenode proc]# ca ...
- Python学习笔记 - day10 - 正则表达式
正则表达式 字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在.比如判断一个字符串是否是合法的Email地址,虽然可以编程提取@前后的子串,再分别判断是否是单词和域名,但这样 ...
- Intel call指令
转载:http://blog.ftofficer.com/2010/04/n-forms-of-call-instructions/ 最近有一个需求,给你个地址,看看这个地址前面是不是一个CALL指令 ...
- python基础===字符串的制表,换行基础操作
\n\t 制表符和换行符 >>> print("Languages:\n\tPython\n\tC\n\tJavaScript") Languages: Pyth ...
- 大公司开源网址[www]
https://github.com/blackberry https://github.com/CallForSanity?tab=repositories https://github.com/b ...
- popup menu案例,无说明只代码
效果图: 布局文件, 展示列表的容器 <?xml version="1.0" encoding="utf-8"?> <LinearLayout ...
- NOIP 2013 day1
tags: 模拟 快速幂 逆序对 树状数组 归并排序 最小生成树 lca 倍增 categories: 信息学竞赛 总结 tex live 2017.iso 转圈游戏 火柴排队 货车运输 转圈游戏 s ...
- http跟https的区别
http: Hypertext transform protocol 超文本传输协议 是一个为了传输超媒体文档(比如html)的应用层协议 是为了web的浏览器跟web的server端的交流而设计的, ...
- jpa缓存导致无法查询到更新后的数据&android出现ANR的一个解决办法
1. 向服务器更新记录后查询,始终查询不到更新后的信息 只能查到更新之前的,马上推断出是缓存的问题.网上搜索一番,将问题定位为jpa缓存,我们要设置jpa查询时不从缓存中取,直接从数据库中取,这样便能 ...