poj 1375
一道解析几何么,,,
其实就是求直线与圆的切线。
看到方法有很多,比如根据角度之类的。
这里主要用到了初中的几何知识。
考虑这幅图。

首先可以根据相似三角形知道b的长度,同时圆心与点的方向也知道。 那么 圆心+b 就是 切点连线 与 点与圆心 连线的交点了。
然后根据 面积,有 l·r = (b的长度)*(中间点到切点的长度) .
就很容易得到切点了。详细看代码,poj返回vector好像会RE,就改成pair了。
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <cstring>
using namespace std;
typedef double db;
const db eps = 1e-;
const db pi = acos(-);
int sign(db k){
if (k>eps) return ; else if (k<-eps) return -; return ;
}
int cmp(db k1,db k2){return sign(k1-k2);}
struct point{
db x,y;
point operator + (const point &k1) const{return (point){k1.x+x,k1.y+y};}
point operator - (const point &k1) const{return (point){x-k1.x,y-k1.y};}
point operator * (db k1) const{return (point){x*k1,y*k1};}
point operator / (db k1) const{return (point){x/k1,y/k1};}
point turn(db k1){ return (point){x*cos(k1)-y*sin(k1),x*sin(k1)+y*cos(k1)};}
point turn90(){ return (point){-y,x};}
db abs(){ return sqrt(x*x+y*y);}
db abs2(){ return x*x+y*y;}
db dis(point k1){ return (*this-k1).abs();}
point unit(){db w=abs(); return (point){x/w,y/w};}
};
db cross(point k1,point k2){ return k1.x*k2.y-k1.y*k2.x;}
db dot(point k1,point k2){ return k1.x*k2.x+k1.y*k2.y;}
point proj(point k1,point k2,point q){
point k=k2-k1;
return k1+k*(dot(q-k1,k)/k.abs2());
}
point getLL(point k1,point k2,point k3,point k4){
db w1=cross(k1-k3,k4-k3),w2=cross(k4-k3,k2-k3);
return (k1*w2+k2*w1)/(w1+w2);
}
struct circle{
point o;db r;
int inside(point k){ return cmp(r,o.dis(k));}
};
pair<point,point> TangentCP(circle k1,point k2){//
db a=(k2-k1.o).abs(),b=k1.r*k1.r/a,c=sqrt(max((db)0.0,k1.r*k1.r-b*b));
point k=(k2-k1.o).unit(),m=k1.o+k*b,del=k.turn90()*c;
return {m-del,m+del};
}
struct line{
db l,r;
};
bool cmp2(line a,line b){
return a.l<b.l;
}
int n;
line l[];
circle c[];
pair<point,point> g;
point e,s1,s2;
int main(){
bool f=;
while (scanf("%d",&n)&&n){
if(f)printf("\n");
f=;
scanf("%lf%lf",&e.x,&e.y);
for(int i=;i<=n;i++){
scanf("%lf%lf%lf",&c[i].o.x,&c[i].o.y,&c[i].r);
}
for(int i=;i<=n;i++){
g=TangentCP(c[i],e);
s1 = getLL(e,g.first,point{0.0,0.0},point{100.0,0.0});
s2 = getLL(e,g.second,point{0.0,0.0},point{100.0,0.0});
l[i]=line{s2.x,s1.x};
}
sort(l+,l++n,cmp2);
db L = l[].l,R = l[].r;
for(int i=;i<=n;i++){
if(l[i].l>R){
printf("%.2f %.2f\n",L,R);
L = l[i].l,R=l[i].r;
} else
R = max(R,l[i].r);
}
printf("%.2f %.2f\n",L,R);
}
}
/**
*
1
300 300
390 150 90
0 6
300 450
70 50 30
120 20 20
270 40 10
250 85 20
220 30 30
380 100 100
*/
poj 1375的更多相关文章
- POJ 1375 Intervals 光源投影【平面几何】
<题目链接> <转载于> 题目大意: 给一个光源点s,给一些圆,源点和s相切会形成阴影,求每一段阴影在横轴上的区间. 解题分析: 这道其实不需要点与圆切线的板子来求解,完全可以 ...
- [poj] 1375 Interval || 圆的切线&和直线的交点
原题 每组数据给出一些圆(障碍物)的圆心和半径,一个点和一条线段,求站在这个点,能开到的线段的部分的左端点和右端点.没有则输出"No View" 相当于求过该点的圆的两条切线,切线 ...
- POJ 1375 Intervals | 解析几何
参考了这个博客 #include<cstdio> #include<algorithm> #include<cstring> #include<cmath&g ...
- poj 1375(解析几何)
Intervals Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4292 Accepted: 1288 Descrip ...
- [转] POJ计算几何
转自:http://blog.csdn.net/tyger/article/details/4480029 计算几何题的特点与做题要领:1.大部分不会很难,少部分题目思路很巧妙2.做计算几何题目,模板 ...
- ACM计算几何题目推荐
//第一期 计算几何题的特点与做题要领: 1.大部分不会很难,少部分题目思路很巧妙 2.做计算几何题目,模板很重要,模板必须高度可靠. 3.要注意代码的组织,因为计算几何的题目很容易上两百行代码,里面 ...
- CSU训练分类
√√第一部分 基础算法(#10023 除外) 第 1 章 贪心算法 √√#10000 「一本通 1.1 例 1」活动安排 √√#10001 「一本通 1.1 例 2」种树 √√#10002 「一本通 ...
- zoj 1375||poj 1230(贪心)
Pass-Muraille Time Limit: 2 Seconds Memory Limit: 65536 KB In modern day magic shows, passing t ...
- poj和hdu部分基础算法分类及难度排序
最近想从头开始刷点基础些的题,正好有个网站有关于各大oj的题目分类(http://www.pythontip.com/acm/problemCategory),所以写了点脚本把hdu和poj的一些题目 ...
随机推荐
- tr1
tr echo 12345 | tr '0-9' '9876543210' echo 87654 | tr '9876543210' '0-9' ROT13 echo "tr came, t ...
- java反射常用类
测试实体类 public class TestClass { public String classInfo; public String getClassInfo() { return classI ...
- rxjs
流就是一个事件 或者执行的某些操作
- sed追加文本-sed脚本追加文本
input为sed输入文件,内容如下: [root@node1 gitlab-test-]# cat inppu.txt aa bb cc dd 追加文本: 1.匹配 aa 行之后追加文本 We a ...
- 手把手教你写vue插件并发布(一)
vue的插件开发 这篇文章较长,需要一定的阅读时间.这里有一份改善版本的插件笔记,在一个项目下完成开发.测试.发布的全过程.https://www.cnblogs.com/adouwt/p/96555 ...
- mysql慢日志, 锁表情况查询
2018-5-29 9:10:15 星期二 锁表情况查询: show OPEN TABLES where In_use > ; 慢日志记录: 1. 修改配置文件, 重启服务后永久生效 slow_ ...
- ASP.NET Core之依赖注入
本文翻译自:http://www.tutorialsteacher.com/core/dependency-injection-in-aspnet-core ASP.NET Core支持依赖注入,依赖 ...
- 通过linux版本的lr agent提示找不到web_reg_save_param_ex函数
Action.c(5): Error: C interpreter run time error: /tmp/brr_TSBgR2/netdir/E/lrscript/aaa/Action.c (5) ...
- day16匿名函数
匿名函数,好像也就是 lambda 表达式 先来看一段函数,返回 def func(n): return n * 3 print(func(5))15 用lambda表达式写: func = lamb ...
- Scala数组| 集合
arrays :+ 5尾部 头部5 +: arrays TODO 声明不可变数组,不能删; 默认情况下,scala中集合的声明全都是不可变的 val arrays: Array[Int] = Ar ...