POJ 1375 Intervals 解析几何 求圆的切线
来源:互联网 发布:加工中心编程高清图纸 编辑:程序博客网 时间:2024/04/23 16:10
题目大意:给出一个点,再给出都处于这个点之下的一些圆,求这个点光源照到这些圆上之后所得到的阴影的并集。
思路:求出每一个圆关于那个点的切线,每一个圆可以处理出来两个切线,这两个切线在x轴上交点的中间部分就是要求的阴影。最后将所有的阴影部分取并输出。
关于求切线,我是利用方向向量解方程做的。应该有更简洁的方法吧。。
CODE:
#include <cmath>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define MAX 510#define EPS 1e-8#define DCMP(a) (fabs(a) < EPS)using namespace std;struct Point{double x,y;Point(double _ = .0,double __ = .0):x(_),y(__) {}Point operator +(const Point &a)const {return Point(x + a.x,y + a.y);}Point operator -(const Point &a)const {return Point(x - a.x,y - a.y);}Point operator *(double a)const {return Point(x * a,y * a);}Point operator /(double a)const {return Point(x / a,y / a);}void Read() {scanf("%lf%lf",&x,&y);}}start;struct Circle{Point o;double r;void Read() {o.Read();scanf("%lf",&r);}}circle;struct Complex{double x,y;Complex(double _ = .0,double __ = .0):x(_),y(__) {}bool operator <(const Complex &a)const {if(x == a.x)return y < a.y;return x < a.x;}}ans[MAX];int cnt;inline double Calc(const Point &a,const Point &b){return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));}inline Point Solve(double a1,double b1,double c1,double a2,double b2,double c2){double y = ((a1 * c2) - (a2 * c1)) / ((a1 * b2) - (a2 * b1));double x = (c1 - b1 * y) / a1;return Point(x,y);}inline Complex Work(const Point &p,const Circle &circle){double d = Calc(circle.o,p),_d = sqrt(d * d - circle.r * circle.r);Point v = Solve(circle.r,-_d,p.x - circle.o.x,_d,circle.r,p.y - circle.o.y);Point tangency = circle.o + v * circle.r;Point u = tangency - p;Point center = p + ((u / (p.y - tangency.y)) * p.y);double first = center.x;v = Solve(circle.r,_d,p.x - circle.o.x,-_d,circle.r,p.y - circle.o.y);tangency = circle.o + v * circle.r;u = tangency - p;center = p + ((u / (p.y - tangency.y)) * p.y);double second = center.x;return Complex(second,first);}int main(){while(scanf("%d",&cnt),cnt) {start.Read();for(int i = 1; i <= cnt; ++i) {circle.Read();ans[i] = Work(start,circle);}sort(ans + 1,ans + cnt + 1);double l = ans[1].x,r = ans[1].y;for(int i = 2; i <= cnt; ++i) {if(ans[i].x > r) {printf("%.2f %.2f\n",l,r);l = ans[i].x,r = ans[i].y;}elser = max(r,ans[i].y);}printf("%.2f %.2f\n\n",l,r);}return 0;}
0 0
- POJ 1375 Intervals 解析几何 求圆的切线
- poj 1375 Intervals(解析几何 过圆外一点求与圆的切线)
- poj 1375 Intervals 圆的切线
- poj 1375 Intervals(计算圆的切线)
- POJ 1375 Intervals【过定点做圆的切线】
- POJ 1375 Intervals(解析几何)
- POJ1375 Intervals(解析几何,圆)
- POJ 1375 圆切线
- POJ 1375 过一点求圆切线极角
- POJ 1375 求圆外一点引圆的切线
- POJ 1375 圆外一点引向圆的切线,直线交点
- 求三角形外心的模版 解析几何做法
- poj1375 圆的切线
- FUZ2213 圆的切线问题
- POJ 1375 Intervals
- POJ 1375 Intervals
- POJ 1375 Intervals
- POJ 1375 Intervals 笔记
- struts2防止重复提交的办法
- 作业报告16 乘法口诀表
- Java 冒泡排序算法
- goagent 3.2.1 chrome出现403、404错误的解决
- weblogic执行filter出现报错
- POJ 1375 Intervals 解析几何 求圆的切线
- 国内免费(开源)CMS系统大全
- Java 多线程 BlockingQueue 实现 高并发邮件 代码 SystemEmailServiceImpl
- 生成的推送证书显示“ 证书仍然无效”
- 关于右键菜单实现子窗口最大化,最小化,还原和关闭的小感想
- 消息模式Toast.makeText的几种常见用法
- Java 多线程 BlockingQueue 实现 高并发邮件 代码 SystemEmailBlockingQueue
- 【淘小店】开启移动电商大格局 淘小店亮相商家迎来又一春
- CSS字体大小设置参考