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 (计算几何)的更多相关文章

  1. POJ 2826 An Easy Problem?! --计算几何,叉积

    题意: 在墙上钉两块木板,问能装多少水.即两条线段所夹的中间开口向上的面积(到短板的水平线截止) 解法: 如图: 先看是否相交,不相交肯定不行,然后就要求出P与A,B / C,D中谁形成的向量是指向上 ...

  2. HDU 5572 An Easy Physics Problem (计算几何+对称点模板)

    HDU 5572 An Easy Physics Problem (计算几何) 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5572 Descripti ...

  3. poj2826 An Easy Problem?!【计算几何】

    含[三点坐标计算面积].[判断两线段是否有交点].[求线段交点]模板   An Easy Problem?! Time Limit: 1000MS   Memory Limit: 65536K Tot ...

  4. An Easy Problem?!(细节题,要把所有情况考虑到)

    http://poj.org/problem?id=2826 An Easy Problem?! Time Limit: 1000MS   Memory Limit: 65536K Total Sub ...

  5. UVA-11991 Easy Problem from Rujia Liu?

    Problem E Easy Problem from Rujia Liu? Though Rujia Liu usually sets hard problems for contests (for ...

  6. An easy problem

    An easy problem Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Sub ...

  7. 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, ...

  8. POJ 2826 An Easy Problem?!

    An Easy Problem?! Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7837   Accepted: 1145 ...

  9. hdu 5475 An easy problem(暴力 || 线段树区间单点更新)

    http://acm.hdu.edu.cn/showproblem.php?pid=5475 An easy problem Time Limit: 8000/5000 MS (Java/Others ...

随机推荐

  1. hdu 4417 划分树

    思路:二分枚举区间第k大.用划分树查找是否符合要求的高度. #include<iostream> #include<algorithm> #include<cstdio& ...

  2. Quartz Scheduler(2.2.1) - Usage of JobDataMap

    The JobDataMap can be used to hold any amount of (serializable) data objects which you wish to have ...

  3. .NET微信支付(H5仅限公众号支付)

    闲来无事,恰好有一个要用微信公众平台支付的功能,研究来研究去,就是要细心和多看腾讯提供的文档.当然有几个坑是很有必要说明一下的 公众号支付,这里统一叫H5支付,以下都是. 在做H5支付的时候,第一步就 ...

  4. XMPP登录应用

    一.导入框架 1.XMMP框架,写入头文件,设置XMPPStreamDelegate代理,定义 XMPPStream *_xmppStream; 2.libresolv.dylib 3.libxml2 ...

  5. C# 线程--第三线程池

    概述 线程池有那些优点: 1.在多线程中线程池可以减少我们创建线程,并合理的复用线程池中的线程.因为在线程池中有线程的线程处于等待分配任务状态. 2.不必管理和维护生存周期短暂的线程,不用在创建时为其 ...

  6. OC7_复合类内存管理(setter方法)

    // // Person.h // OC7_复合类内存管理(setter方法) // // Created by zhangxueming on 15/6/18. // Copyright (c) 2 ...

  7. ASP.NET Cache的一些总结分享

    最近我们的系统面临着严峻性能瓶颈问题,这是由于访问量增加,客户端在同一时间请求增加,这迫使我们要从两个方面解决这一问题,增加硬件和提高系统的性能. 1.1.1 摘要 最近我们的系统面临着严峻性能瓶颈问 ...

  8. css3学习笔记之渐变

    CSS3 线性渐变 语法 background: linear-gradient(direction, color-stop1, color-stop2, ...); 1 2 3 4 5 6 7 8 ...

  9. 创建featureclass,为它赋别名,并移动到数据集下

    if (pOutFtrClass == null) { //continue; //创建featureclass //得到规范的字段集 IFields pFields = pFeatureClass. ...

  10. 《APUE》第6章练习1

    问题:编写一个程序,它调用uname并输出utsname结构中的所有字段,并将输出与uname(1)命令的输出结构做比较. 我本来以为utsname结构也跟passwd结构一样,也有那三个函数来获取整 ...