bnuoj 1053 EASY Problem (计算几何)
http://www.bnuoj.com/bnuoj/problem_show.php?pid=1053
【题意】:基本上就是求直线与圆的交点坐标
【题解】:这种题我都比较喜欢用二分,三分做,果然可以完爆,哈哈,特有成就感的说。。。
【code】:
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <algorithm> using namespace std;
#define eps 1e-12 struct Point
{
double x,y;
Point(){}
Point(double dx,double dy)
{
x = dx;
y = dy;
}
}; double distance(double x1,double y1,double x2,double y2) //求距离
{
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
} double distance2(double x1,double y1,double x2,double y2) //求距离的平方
{
return ((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
} double area2(double x1, double y1, double x2, double y2, double x3,double y3) //两倍三角形面积
{
double area;
area = fabs(x1*y2+x2*y3+x3*y1-x3*y2-x1*y3-x2*y1);
return area;
} int isEqual(double a,double b) //判断两浮点数是否相等
{
if(fabs(a-b)>1e-) return ;
return ;
} Point bs(double x1,double y1,double x2,double y2,double x3,double y3,double R) //二分查找交点
{
double l=,r=,mid,x,y;
while(l<=r)
{
mid = (l+r)/;
x = x1 + mid*(x2-x1);
y = y1 + mid*(y2-y1);
double temp =distance(x,y,x3,y3);
if(temp<R) //与半径的距离为二分点
{
l=mid+eps;
}
else
{
r=mid-eps;
}
}
return Point(x,y);
} int main()
{
double Cx,Cy,R;
double Px,Py;
double Qx,Qy;
scanf("%lf%lf%lf",&Cx,&Cy,&R);
scanf("%lf%lf",&Px,&Py);
scanf("%lf%lf",&Qx,&Qy);
double area = area2(Px,Py,Qx,Qy,Cx,Cy);
double disPQ = distance(Px,Py,Qx,Qy);
double dis = area/disPQ; //用面积除以底求得三角形的高,即点到直线的距离
if(dis>R||isEqual(dis,R))
{
puts("-1");
return ;
}
double x1,y1;
x1 = Px-Qx;
y1 = Py-Qy;
double x=,y=,k=,lx,rx,ry,ly;
if(isEqual(Px,Qx)) //如果px==qx,不存在斜率
{
x = Px;
y = (Cx-x)*x1/y1+Cy;
lx = x;
ly = Cy-R;
rx = x;
ry = Cy+R;
}
else if(isEqual(Py,Qy)) //存在斜率为1
{
y = Py;
x = (Cy-y)*y1/x1+Cx;
ly = Py;
lx = Px-R;
ry = Py;
rx = Px+R;
}
else //斜率在0-1之间
{
y = (Cy*y1/x1+Cx-Px+Py*(Qx-Px)/(Qy-Py))/(y1/x1+(Qx-Px)/(Qy-Py));
x = (Cy-y)*y1/x1+Cx;
lx = Cx - R;
ly = (Qy-Py)/(Qx-Px)*(lx-Px)+Py;
rx = Cx + R;
ry = (Qy-Py)/(Qx-Px)*(rx-Px)+Py;
}
Point p1 = bs(x,y,lx,ly,Cx,Cy,R);
Point p2 = bs(x,y,rx,ry,Cx,Cy,R);
double ans = distance2(p1.x,p1.y,Px,Py)+distance2(p2.x,p2.y,Px,Py);
printf("%.3lf\n",ans);
return ;
}
bnuoj 1053 EASY Problem (计算几何)的更多相关文章
- POJ 2826 An Easy Problem?! --计算几何,叉积
题意: 在墙上钉两块木板,问能装多少水.即两条线段所夹的中间开口向上的面积(到短板的水平线截止) 解法: 如图: 先看是否相交,不相交肯定不行,然后就要求出P与A,B / C,D中谁形成的向量是指向上 ...
- HDU 5572 An Easy Physics Problem (计算几何+对称点模板)
HDU 5572 An Easy Physics Problem (计算几何) 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5572 Descripti ...
- poj2826 An Easy Problem?!【计算几何】
含[三点坐标计算面积].[判断两线段是否有交点].[求线段交点]模板 An Easy Problem?! Time Limit: 1000MS Memory Limit: 65536K Tot ...
- An Easy Problem?!(细节题,要把所有情况考虑到)
http://poj.org/problem?id=2826 An Easy Problem?! Time Limit: 1000MS Memory Limit: 65536K Total Sub ...
- 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 ...
随机推荐
- hdu 4665 搜索
思路:直接搜索 #include<iostream> #include<cstdio> #include<algorithm> #include<cstrin ...
- Quartz Scheduler(2.2.1) - hello world
简单示例 1. maven 依赖 <dependencies> <dependency> <groupId>org.quartz-scheduler</gro ...
- Redis 命令 - Connection
AUTH password Authenticate to the server More: http://redis.io/commands/auth, http://www.redis.cn/co ...
- .net求两个数的最大公约数和最小公倍数
最大公约数:指两个或多个整数共有约束中最大的一个. 最小公倍数:如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数,对于两个整数来说,指该两数共有倍数中最小的一个. /// <s ...
- Android Support v4,v7,v13
Android Support v4 是最早(2011年4月份)实现的库.用在Android1.6 (API lever 4)或者更高版本之上.它包含了相对V4, V13大的多的功能. 例如:Frag ...
- Xcode6:The file couldn’t be opened because you don’t have permission to view it
最近为了兼容iOS8升级到Xcode6.0编译之前的工程,结果App无法在真机上运行.报错如下: The file “xxxx.app” couldn’t be opened because you ...
- 什么是C++标准库?
C++中的标准程序库(简称标准库)是类库和函数的集合,其使用核心语言写成.标准程序库提供若干泛型容器.函数对象.泛型字符串和流(包含交互和文件I/O),支持部分语言特性和常用的函数,如开平方根.C++ ...
- (转)卸载和安装LINUX上的JDK
卸载默认的: 用root用户登陆到系统,打开一个终端输入 # rpm -qa|grep gcj 显示内容其中包含下面两行信息 # java-1.4.2-gcj-compat-1.4.2.0-27jpp ...
- javascript笔记——jqGrid再次封装
xingrunzhao js插件再次封装 demo 'use strict'; /** * commerce grid框架 * 依赖jqgrid */ (function ($_self, jQuer ...
- spring @Resource和@Autowired的区别
@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了.@Resource有两个属性是比较重要的,分 ...