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. 锋利的jQuery第2版学习笔记4、5章

    第4章,jQuery中的事件和动画 注意:使用的jQuery版本为1.7.1 jQuery中的事件 JavaScript中通常使用window.onload方法,jQuery中使用$(document ...

  2. html5 之 canvas 相关知识(一)概念及定义

    什么是 Canvas? HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像. 画布是一个矩形区域,您可以控制其每一像素. canvas 拥有多种绘制路径.矩形.圆形.字符以 ...

  3. jquery 60秒倒计时(方法二)

    <script type="text/javascript">var wait=60;document.getElementById("btn"). ...

  4. Javascript之响应式相册

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  5. update更新多行数据(oracle)

    转自:http://blog.itpub.net/25322446/viewspace-767505 说明:笔记总结了在工作中遇到过的几种update方法和各种方法适用的范围. 1.单表更新方案:使用 ...

  6. 第四十二篇、自定义Log打印

    1.在Xcode 8出来之后,需要我们去关闭多余的日志信息打印 2.在开发的过程中,打印调试日志是一项比不可少的工程,但是在iOS 10中NSLog打印日志被屏蔽了,就不得不使用自定义Log 3.去掉 ...

  7. java新手笔记30 集合

    1.set/list package com.yfs.javase; import java.util.ArrayList; import java.util.Collection; import j ...

  8. c#基础汇总-------------封装

    说到封装,其实是比较基础类的问题,它为程序设计提供了系统与系统,模块与模块,类与类之间交互的实现手段.在.Net中,一切看起来都已经被包装在.Net FrameWork这一复杂的网络中,提供给最终开发 ...

  9. WiFi安全之WPA介绍

    WPA,全称为Wi-Fi Protected Access,是一种保护WiFi安全的系统,实现了IEEE 802.11i的大部分标准,是一种替代WEP的过渡方案. 这个协议包含了前向兼容RC4的加密协 ...

  10. bzoj 3626 LCA

    这一道题咋一看只觉得是离线,可以求出所有的f(1,i,z), 答案就等于f(1,r,z)-f(1,l-1,z).但是没有具体的做法,但是求LCA的深度和有一个非常巧妙的做法,每加一个点,就把这个点到根 ...