HDU 5295 Unstable 计算几何
Unstable
题目连接:
http://acm.hdu.edu.cn/showproblem.php?pid=5295
Description
Rasen had lost in labyrinth for 20 years. In a normal day, he found a bright screen. There were 4 points labeled by ‘A’ , ‘B’ , ‘C’ , ‘D’, and rasen could drag these point. And two points ‘E’ , ‘F’ moved. Rasen found that ‘E’ is the middle point of ‘A’ and ‘B’, and ‘F’ is the middle point of ‘C’ and ‘D’. Near the screen there was a marble slab.There were a list of the distance of AB , BC , CD , DA and EF. Rasen also found that the distance of these edge of the points in screen showed at the same time he drop the points. He wanted to know what will happen if the distances in screen are same with the number in slab.
Input
The first line of input contains only one integer T(<=50000), the number of test cases.
Each case contains five float number, indicating the distance of AB , BC , CD , DA , EF.(0<=distance<=10000)
Output
For each test, first print a line “Case #i:”(without quotes),with i implying the case number, then output the coordinates of A,B,C,D four points. Answer will be considered as correct if the length got from your output (the spj will use double to get the point, and the distance from two points will calculate in the way of sqrt((x1-x2)^2 +(y1-y2)^2) ) and the length given is less than 10-4.
(It guarantees that there exists a solution. If there are many solutions, output any one of them.)
Sample Input
1
1.000000 1.000000 1.000000 1.000000 1.000000
Sample Output
Case #1:
0.000000 0.000000
1.000000 0.000000
1.000000 1.000000
0.000000 1.000000
Hint
题意
平面上有四个点A,B,C,D
然后告诉你AB,BC,CD,DA长度,然后E是AB中点,F是CD中点,EF的长度你也知道。
现在你需要构造一组解,使得满足要求。
题解:
随便画个四边形,然后延长AF到A‘,使得A’F=AF,做AB的平行线DG,使得DG=AB。
然后连接A'C,A'B,A'G,CG
显然的发现三角形DFA全等于三角形FCA',三角形AFE相似于三角形ABA'
然后A‘就是以C点为圆心,AC为半径和B点为圆心,BA'为半径的圆相交的交点。
知道A’之后,G点可以由CA'+CB得到。
然后D点坐标就是以G为圆心,AB为半径,C为圆心,CD为半径的交点。
然后A点就瞎搞就好了。
然后就完了。
代码
#include<bits/stdc++.h>
using namespace std;
struct POINT
{
double x;
double y;
POINT(double a=0, double b=0) { x=a; y=b;} //constructor
};
void c2point(POINT p1,double r1,POINT p2,double r2,POINT &rp1,POINT &rp2)
{
if(fabs(p1.x-p2.x)<1e-6&&fabs(p1.y-p2.y)<1e-6&&fabs(r1-r2)<1e-6)
{
rp1.x=p1.x;
rp1.y=p1.y+r1;
rp2.x=p1.x;
rp2.y=p1.y-r1;
return;
}
double a,b,r;
a=p2.x-p1.x;
b=p2.y-p1.y;
r=(a*a+b*b+r1*r1-r2*r2)/2;
if(fabs(a)<1e-6&&fabs(b)>1e-6)
{
rp1.x=rp2.x=r/b;
double tmp = r1*r1-rp1.x*rp1.x;
if(tmp<0)tmp=0;
rp1.y=sqrt(tmp);
rp2.y=-rp1.y;
}
else if(fabs(a)>1e-6&&fabs(b)<1e-6)
{
rp1.x=rp2.x=r/a;
double tmp = r1*r1-rp1.x*rp2.x;
if(tmp<0)tmp=0;
rp1.y=sqrt(tmp);
rp2.y=-rp1.y;
}
else if(fabs(a)>1e-6&&fabs(b)>1e-6)
{
double delta;
delta=b*b*r*r-(a*a+b*b)*(r*r-r1*r1*a*a);
if(delta<0)delta=0;
rp1.y=(b*r+sqrt(delta))/(a*a+b*b);
rp2.y=(b*r-sqrt(delta))/(a*a+b*b);
rp1.x=(r-b*rp1.y)/a;
rp2.x=(r-b*rp2.y)/a;
}
rp1.x+=p1.x;
rp1.y+=p1.y;
rp2.x+=p1.x;
rp2.y+=p1.y;
}
void solve(int Cas)
{
double ab,bc,cd,da,ef;
scanf("%lf %lf %lf %lf %lf",&ab,&bc,&cd,&da,&ef);
POINT A,B,C,D,E,F,G,A1;
C.x=0,C.y=0;
B.x=bc,B.y=0;
POINT tmp1,tmp2;
c2point(C,da,B,2*ef,tmp1,tmp2);
A1=tmp1;
G.x=A1.x+B.x,G.y=A1.y+B.y;
c2point(C,cd,G,ab,tmp1,tmp2);
D=tmp1;
A.x=D.x+C.x-A1.x;
A.y=D.y+C.y-A1.y;
printf("Case #%d:\n",Cas);
printf("%.12f %.12f\n",A.x,A.y);
printf("%.12f %.12f\n",B.x,B.y);
printf("%.12f %.12f\n",C.x,C.y);
printf("%.12f %.12f\n",D.x,D.y);
}
int main()
{
int t;scanf("%d",&t);
for(int i=1;i<=t;i++)solve(i);
return 0;
}
HDU 5295 Unstable 计算几何的更多相关文章
- HDU 4998 Rotate (计算几何)
HDU 4998 Rotate (计算几何) 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4998 Description Noting is more ...
- hdu 4643 GSM 计算几何 - 点线关系
/* hdu 4643 GSM 计算几何 - 点线关系 N个城市,任意两个城市之间都有沿他们之间直线的铁路 M个基站 问从城市A到城市B需要切换几次基站 当从基站a切换到基站b时,切换的地点就是ab的 ...
- HDU 1174 爆头(计算几何)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1174 解题报告:就是用到了三维向量的点积来求点到直线的距离,向量(x1,y1,z1)与(x2,y2,z ...
- hdu 1086(计算几何入门题——计算线段交点个数)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1086 You can Solve a Geometry Problem too Time Limit: 2 ...
- hdu 4613 Points<计算几何>
链接:http://acm.hdu.edu.cn/showproblem.php?pid=4613 题意: 判断一个集合中的点能不能由另一个集合中的点,通过平移,旋转,放缩得到~ 思路:先求出集合中的 ...
- 2017多校第6场 HDU 6097 Mindis 计算几何,圆的反演
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6097 题意:有一个圆心在原点的圆,给定圆的半径,给定P.Q两点坐标(PO=QO,P.Q不在圆外),取圆 ...
- hdu 4643(计算几何)
题意:容易理解 分析:切换的地点为两个基站所在直线的中垂线与两座城市所在直线的交点. 代码实现: #include <cstdio> #include <cmath> #inc ...
- hdu 4606 简单计算几何+floyd+最小路径覆盖
思路:将所有的直线的两个端点和城市混在一起,将能直接到达的两个点连线,求一次floyd最短路径.二分枚举bag容量,然后按给的要先后占领的城市由前向后,把能到一步到达的建一条边.然后求一次最小路径覆盖 ...
- hdu 4063 Aircraft(计算几何+最短路)
不说了...说多了都是泪...从昨天下午一直wa到现在,直到刚刚才让人帮我找到所谓的“bug”,其实也算不上bug... 这个题的思路就是:找出平面上的所有点:所有圆的交点以及所有圆的圆心.然后依次判 ...
随机推荐
- 【Git】git clone与git pull区别
从字面意思也可以理解,都是往下拉代码,git clone是克隆,git pull 是拉.但是,也有区别: 从远程服务器克隆一个一模一样的版本库到本地,复制的是整个版本库,叫做clone.(clone是 ...
- shell source命令说明
当我修改了/etc/profile文件,我想让它立刻生效,而不用重新登录:这时就想到用source命令,如:source /etc/profile对source进行了学习,并且用它与sh 执行脚本进行 ...
- adb_usb.ini在adb找不到设备时
不能连接不上adb,如下方法解决,步骤描述不愿意看的话,直接使用本文最下面的批处理命令,方法copy粘贴到新建的bat文件里运行,或者直接粘贴到dos窗口运行. 1. 使用androidsdk目录中的 ...
- ProxySQL(MGR)部署故障:'sys.gr_member_routing_candidate_status' doesn't exist
ProxySQL(MGR) 故障排查: 故障现象:runtime_mysql_servers节点状态offline_hostgroup(本案例为15) 日志关键信息: [WARNING] Group ...
- Django Authentication 用户认证系统
一. Django的认证系统 Django自带一个用户认证系统,用于处理用户账户.群组.许可和基于cookie的用户会话. 1.1 概览 Django的认证系统包含了身份验证和权限管理两部分.简单地说 ...
- MySQL之正则表达式
一.介绍 正则表达式用来描述或者匹配符合规则的字符串.它的用法和like比较相似,但是它又比like更强大,能够实现一些很特殊的规则匹配:正则表达式需要使用REGEXP命令,匹配上返回"1& ...
- PHP 权威代码风格规范
1.常规 尽量统一ide 比如phpstream 配置文件(Settings → Code Style → PHP → Set from... → Predefined Style → PSR1/PS ...
- [实战]MVC5+EF6+MySql企业网盘实战(23)——文档列表
写在前面 上篇文章实现了图片列表,这篇文章实现文档列表将轻车熟路,因为逻辑基本相似,只是查询条件的不同.这里将txt,doc,docx,ppt,pptx,xls,xlsx的文件都归为文档列表中. 系列 ...
- LeetCode 260. Single Number III(只出现一次的数字 III)
LeetCode 260. Single Number III(只出现一次的数字 III)
- mvc bundle的介绍及使用 转载自 http://www.ityouzi.com/archives/mvc-bundleconfig.html
Asp.Net MVC4 BundleConfig文件合并.压缩,网站优化加速 浏览器在向服务器发送请求的时候,请求的文件链接数量是有限制的,如果页面文件少就没有什么问题了,如果文件太多就会导致链接失 ...