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的一些题目 ...
随机推荐
- Typora使用说明(记录总结)
目录 区域元素 YAML FONT Matters 菜单 段落 标题 引注 序列 可选序列 代码块 数学块 表格 脚注 水平线 特征元素 链接 超链接 内链接 相关链 URLs 图片 斜体 加粗 删除 ...
- [物理学与PDEs]第2章第2节 粘性流体力学方程组 2.1 引言
1. 实际的流体与理想流体的主要区别在于: 前者具有粘性 (内摩擦) 和热传导. 2. 内摩擦 (1) 当两层流体有相对运动时, 方有摩擦力; 它是一种内力; 单位面积上所受的内力称为应力; 而 ...
- Groovy 设计模式 -- 组合模式
Composite Pattern http://groovy-lang.org/design-patterns.html#_chain_of_responsibility_pattern 组合模式, ...
- word20161226
1. condensed 英[kən'denst]美[kənˈdɛnst]v. (使) 变稠或变浓,浓缩( condense的过去式和过去分词 ); (使) 凝结; 简说,摘要,简述;[例句]The ...
- 401 experience
AM: 块元素与内联元素 : div与span的区别 span只能设置水平的margin(左右内外边距) 在span里面加 display:block; 内联转块(相当于给span加了上下的边距)反 ...
- 【原创】大数据基础之Ambari(2)通过Ambari部署ElasticSearch(ELK)
ambari2.7.3(hdp3.1) 安装 elasticsearch6.3.2 ambari的hdp中原生不支持elasticsearch安装,下面介绍如何通过mpack方式使ambari支持el ...
- 【原创】Linux基础之curl
http请求过程如下: # curl -v http://www.baidu.com % Total % Received % Xferd Average Speed Time Time Time C ...
- 【原创】大叔经验分享(18)hive2.0以后通过beeline执行sql没有进度信息
一 问题 在hive1.2中使用hive或者beeline执行sql都有进度信息,但是升级到hive2.0以后,只有hive执行sql还有进度信息,beeline执行sql完全silence,在等待结 ...
- 【batch】命令对比两个文件夹下的文件(增删改的对比)
1.分别打印两个目录的结构 TREE D:\SOURCE /A /F >D:\SOURCE.TXT TREE D:\DEST /A /F >D:\DEST.TXT 2.然后使用工具/命令进 ...
- 完整备份和差异备份数据库的SQL脚本
工作中需要创建SQL Job对数据库进行定期备份,现把脚本记录如下. 1. 完整备份: -- FULL declare @filename varchar(1024), @file_dev varch ...