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 ...
随机推荐
- Window 中常见的dos命令
在哪里操作dos命令: win7---->开始---->所有程序---->附件---->命令提示符 win7-- ...
- C#中泛型容器Stack<T>
我以前都是学出c,c++,这个学期开始学c#有点不适应,在编程中遇到些问题,所以自己在网上查了些资料,翻了一下书,写一些总结. 关于c#中Stack<T>泛型容器: <1>st ...
- 实现类似 QQ音乐网页版 的单页面总结
最近需要对创业团队的网站进行改版,而我负责前端设计和实现. 下面是一些总结与体会: 当设计完成之前,我就跟和我配合的Java 后台说用iframe实现,结果说麻烦不肯,到最后突然对我说还是用ifram ...
- http keepalive
转载自: http://www.92csz.com/17/1152.html http keepalive 在http早期 ,每个http请求都要求打开一个tpc socket连接,并且使用一次之后就 ...
- C#保存上传来的图片示例代码
保存上传图片的方法有很多,在接下来的文章中为大家详细介绍下使用C#是如何做到的,感兴趣的朋友不要错过 复制代码代码如下: [HttpPost] public string UploadImage() ...
- Android之所有权限
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" >& ...
- JAVA之数据溢出
Integer在java中属于包装类,既能用于字符串与整型的转换,也能用于拆箱与装箱 package ABC; public class A{ public static void main(Stri ...
- 使用TreeView+ListBox+TxtBox 资料管理器
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- 基于Tengine的反向代理详细配置
系统环境: SUSE Linux Enterprise Server 10 SP1 (x86_64) 注:所有软件包都放置在/data/software目录下 nginx_tcp_proxy_modu ...
- des算法的C#实现
DES是Data Encryption Standard(数据加密标准)的缩写.它是一种通过56位密钥来加密64位数据的方法. public class EncryptUtility{ #reg ...