poj1375Intervals(点到圆的切线)
貌似这样的叫解析几何
重点如何求得过光源到圆的切线与地板的交点x坐标,可以通过角度及距离来算,如图,

根据距离和半径可以求得角度a、b、r,自然也可以求得d1,d2.
至于方向问题,在求r得时候 可以使r = asin((p.x-c.x)/d) p为源点,c为圆心 ,d为两点距离。
若在反方向,自然r为负角 ,并不影响最后的结果。
排序后,统计区间就可以了。
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<vector>
#include<cmath>
#include<queue>
#include<set>
using namespace std;
#define N 505
#define LL long long
#define INF 0xfffffff
const double eps = 1e-;
const double pi = acos(-1.0);
const double inf = ~0u>>;
struct point
{
double x,y;
double r;
point(double x=,double y=):x(x),y(y){}
}p[N];
struct node
{
double l,r;
}li[N],ans[N];
typedef point pointt;
pointt operator -(point a,point b)
{
return point(a.x-b.x,a.y-b.y);
}
double dis(point a)
{
return sqrt(a.x*a.x+a.y*a.y);
}
node cal(point a,point b)
{
double ang1,ang2,ang3,ang4;
double d = dis(a-b);
ang1 = asin(a.r/d);
ang2 = asin((b.x-a.x)/d);
ang3 = ang1+ang2;
ang4 = ang2-ang1;
//cout<<ang1<<" "<<ang2<<" "<<ang3<<" "<<ang4<<endl;
node ll;
double l = b.x-b.y*tan(ang3);
double r = b.x-b.y*tan(ang4);
ll.l = min(l,r);
ll.r = max(l,r);
return ll;
}
bool cmp(node a,node b)
{
return a.l<b.l;
}
int main()
{
int n,i;
point pp;
while(scanf("%d",&n)&&n)
{
scanf("%lf%lf",&pp.x,&pp.y);
for(i = ; i <= n; i++)
scanf("%lf%lf%lf",&p[i].x,&p[i].y,&p[i].r);
for(i = ; i <= n; i++)
{
li[i] = cal(p[i],pp);
}
sort(li+,li+n+,cmp);
int g = ;
ans[g].l = li[].l;
double te = li[].r;
for(i = ; i <= n; i++)
{
if(li[i].l>te)
{
ans[g].r = te;
ans[++g].l = li[i].l;
}
te = max(te,li[i].r);
}
ans[g].r = te;
for(i = ; i <= g; i++)
printf("%.2f %.2f\n",ans[i].l,ans[i].r);
puts("");
}
return ;
}
poj1375Intervals(点到圆的切线)的更多相关文章
- hdu4454 三分 求点到圆,然后在到矩形的最短路
题意: 求点到圆,然后在到矩形的最短路. 思路: 把圆切成两半,然后对于每一半这个答案都是凸性的,最后输出两半中小的那个就行了,其中有一点,就是求点到矩形的距离,点到矩形的距离 ...
- C++ 2(将类分文件) //点和圆的关系 //设计一个圆形类 和一个点类 计算点和圆的关系 //点到圆心的距离 == 半径 点在圆上 //点到圆心的距离 > 半径 点在圆外 //点到圆心的距离 < 半径 点在圆内 //点到圆心的距离 获取 ....... (x1 -x2)^2 + (y1-y2)^2 开根号 和半径对比 // 计算 可以 两边同时 平方
1 源文件 main.cpp 2 //点和圆的关系 3 //设计一个圆形类 和一个点类 计算点和圆的关系 4 //点到圆心的距离 == 半径 点在圆上 5 //点到圆心的距离 > 半径 点在圆外 ...
- C++ 1 (只在源文件)//点和圆的关系 //设计一个圆形类 和一个点类 计算点和圆的关系 //点到圆心的距离 == 半径 点在圆上 //点到圆心的距离 > 半径 点在圆外 //点到圆心的距离 < 半径 点在圆内 //点到圆心的距离 获取 ....... (x1 -x2)^2 + (y1-y2)^2 开根号 和半径对比 // 计算 可以 两边同时 平方
1 //点和圆的关系 2 //设计一个圆形类 和一个点类 计算点和圆的关系 3 //点到圆心的距离 == 半径 点在圆上 4 //点到圆心的距离 > 半径 点在圆外 5 //点到圆心的距离 &l ...
- FZU 2213——Common Tangents——————【两个圆的切线个数】
Problem 2213 Common Tangents Accept: 7 Submit: 8Time Limit: 1000 mSec Memory Limit : 32768 KB ...
- [poj] 1375 Interval || 圆的切线&和直线的交点
原题 每组数据给出一些圆(障碍物)的圆心和半径,一个点和一条线段,求站在这个点,能开到的线段的部分的左端点和右端点.没有则输出"No View" 相当于求过该点的圆的两条切线,切线 ...
- Gym - 101201E:Enclosure (点到凸包的切线)
题意:给点N棵树,前K棵是已经拥有的,现在可以再拥有一棵树,问形成的最大凸包面积. 思路:先求K棵树的凸包C,然后对于后面的N-K棵树,我们先判断是否在凸包内,如果不在,我们要求两个切线. 这里分类讨 ...
- uva 12304点与直线与圆之间的关系
Problem E 2D Geometry 110 in 1! This is a collection of 110 (in binary) 2D geometry problems. Circum ...
- 简单几何(点的位置) POJ 1584 A Round Peg in a Ground Hole
题目传送门 题意:判断给定的多边形是否为凸的,peg(pig?)是否在多边形内,且以其为圆心的圆不超出多边形(擦着边也不行). 分析:判断凸多边形就用凸包,看看点集的个数是否为n.在多边形内用叉积方向 ...
- 简单几何(直线与线段相交) POJ 1039 Pipe
题目传送门 题意:一根管道,有光源从入口发射,问光源最远到达的地方. 分析:黑书上的例题,解法是枚举任意的一个上顶点和一个下顶点(优化后),组成直线,如果直线与所有竖直线段有交点,则表示能穿过管道. ...
随机推荐
- 7、XML加强/Web开发/Tomcat
1 XML加强 XML加强 1)Dom4j修改XML文档 写出xml文档: XMLWriter writer = new XMLWriter() writer.wrtite(doc); 增加: Doc ...
- Mac 终端命令汇总
OSX 的文件系统 OSX 采用的Unix文件系统,所有文件都挂在跟目录 / 下面,所以不在要有Windows 下的盘符概念. 你在桌面上看到的硬盘都挂在 /Volumes 下. 比如接上个叫做 US ...
- js获取随机色
方法一: var getRandomColor = function(){ return '#' + (function(color){ return (color += '0123456789abc ...
- Counting Rectangles
Counting Rectangles Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 1043 Accepted: 546 De ...
- Currency Exchange 分类: POJ 2015-07-14 16:20 10人阅读 评论(0) 收藏
Currency Exchange Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 22180 Accepted: 8015 De ...
- 基于@AspectJ和schema的aop(二)---@AspectJ基础语法
@AspectJ使用jdk5.0和正规的AspectJ切点表达式描述切面, 由于spring只支持方法的连接点,所以Spring只支持部分AspectJ的切点语言. 1.切点表达式函数 AspectJ ...
- 对“Java”的诞生历史、特点、定义等HR常问的简单题
本人是一个学习Java的新手,在学习了Java以后,对Java的一些总结. 这里共有12点对Java的简单的阐述,如果解释的不怎么样请大家谅解哈. 1.首先我们来看一看,在Java之前的有那些打牌语言 ...
- 反射获取类中的属性和set属性
package framework.base; import java.beans.IntrospectionException; import java.beans.PropertyDescript ...
- fastboot 教程
参考: http://blog.csdn.net/geniusmen/article/details/7892398 http://www.cnblogs.com/eastnapoleon/p/327 ...
- mysql正则匹配解决查询一个字段是否在另一个字段中
select b.filter_name , count(*) from at_goods a , at_search_filter bwhere a.application REGEXP b.fil ...