<题目链接>

<转载于>

题目大意:

给一个光源点s,给一些圆,源点和s相切会形成阴影,求每一段阴影在横轴上的区间。

解题分析:

这道其实不需要点与圆切线的板子来求解,完全可以根据角度和线段长度之间的关系计算。

解此题的方法就是,先单独对每一个圆研究,算出它们各自在横轴上的投影区间,然后,再求出这些区间的并,把每一段区间输出即可。

当然,我们应该要注意到,点与圆的位置关系不只有这一种情况,还一种情况是,圆的圆形没有超过垂线,但是圆的圆心X+R超过了垂线,但是,经过简单证明发现,其实这两种情况都可以用一个表达式来表示,所以下面的代码只用写一种形式。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define MAXN 503 struct Ln //投影的区间
{
double l, r;//区间的左右端点横坐标
bool operator<(const Ln &b)const
{
return l < b.l;
}
}lns[MAXN];
int N; //水管总数 int main()
{
while (~scanf("%d", &N) && N)
{
int Lx, Ly; //light 灯的坐标
scanf("%d%d", &Lx, &Ly); for (int p = ; p < N; p++) {
int Ox, Oy, r;
scanf("%d%d%d", &Ox, &Oy, &r);//input
double OL = sqrt(double(Ox - Lx)*(Ox - Lx) + (Oy - Ly)*(Oy - Ly));
double alpha = asin((Lx - Ox) / OL);//∠OLC
double beta = asin(r / OL);//∠OLA
lns[p].l = Lx - Ly * tan(alpha + beta);
lns[p].r = Lx - Ly * tan(alpha - beta);
} sort(lns, lns + N);
double L = lns[].l, R = lns[].r;//初始化第一个区间
for (int p = ; p < N; p++) {
if (lns[p].l > R) {
printf("%.2lf %.2lf\n", L, R);//output//输出上一个
L = lns[p].l, R = lns[p].r;//初始化下一个
}
else
R = max(lns[p].r, R); //由于会出现长区间包含短区间的情况 因而需要比较大小
}
printf("%.2lf %.2lf\n\n", L, R); //output//输出最后一个大区间,这里不要忘记
}
return ;
}

2018-08-01

POJ 1375 Intervals 光源投影【平面几何】的更多相关文章

  1. POJ 1375 Intervals | 解析几何

    参考了这个博客 #include<cstdio> #include<algorithm> #include<cstring> #include<cmath&g ...

  2. Three.js的光源投影

    Three.js的光源默认不会导致物体间的投影,打开投影需要执行以下几步: 打开渲染器的地图阴影: renderer.shadowMapEnabled = true; 启用光线的投影:light.ca ...

  3. poj 1089 Intervals

    http://poj.org/problem?id=1089 Intervals Time Limit: 1000MS   Memory Limit: 10000K Total Submissions ...

  4. poj 1201 Intervals 解题报告

    Intervals Time Limit: 2000MS   Memory Limit: 65536KB   64bit IO Format: %lld & %llu Submit Statu ...

  5. POJ 3680 Intervals(费用流)

    Intervals Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5762   Accepted: 2288 Descrip ...

  6. POJ 1201 Intervals (差分约束系统)

    题意 在区间[0,50000]上有一些整点,并且满足n个约束条件:在区间[ui, vi]上至少有ci个整点,问区间[0, 50000]上至少要有几个整点. 思路 差分约束求最小值.把不等式都转换为&g ...

  7. poj 1201 Intervals(差分约束)

    做的第一道差分约束的题目,思考了一天,终于把差分约束弄懂了O(∩_∩)O哈哈~ 题意(略坑):三元组{ai,bi,ci},表示区间[ai,bi]上至少要有ci个数字相同,其实就是说,在区间[0,500 ...

  8. poj 1201 Intervals(差分约束)

    题目:http://poj.org/problem?id=1201 题意:给定n组数据,每组有ai,bi,ci,要求在区间[ai,bi]内至少找ci个数, 并使得找的数字组成的数组Z的长度最小. #i ...

  9. POJ 1201 Intervals(图论-差分约束)

    Intervals Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 20779   Accepted: 7863 Descri ...

随机推荐

  1. Theano教程:Python的内存管理

    在写大型程序时候的一大挑战是如何保证最少的内存使用率.但是在Python中的内存管理是比较简单的.Python显示分配内存,使用引用计数系统管理对象,当指向某一个对象的引用数变为 0 的时候,该对象所 ...

  2. 【干货】从windows注册表读取重要信息-----这种技能非常重要,占电子取证的70%

    也就是说,当我拿着U盘启动盘,从你电脑里面拷贝了注册表的几个文件,大部分数据就已经到我手中了.一起来感受一下吧. 来源:Unit 6: Windows File Systems and Registr ...

  3. Reverse Words in a String I & Reverse Words in a String II

    Reverse Words in a String I Given an input string, reverse the string word by word. For example,Give ...

  4. 六、regularized logisitic regssion练习(转载)

    转载链接:http://www.cnblogs.com/tornadomeet/archive/2013/03/17/2964858.html 在上一讲Deep learning:五(regulari ...

  5. 利用grub从ubuntu找回windows启动项

    在 /boot/grub/grub.cfg 中添加: menuentry "Windows 10" --class windows --class os { insmod ntfs ...

  6. 【转】assert预处理宏与预处理变量

    assert assert是一个预处理宏,由预处理器管理而非编译器管理,所以使用时都不用命名空间声明,如果你写成std::assert反而是错的.使用assert需要包含cassert或assert. ...

  7. [bzoj3123][洛谷P3302] [SDOI2013]森林(树上主席树+启发式合并)

    传送门 突然发现好像没有那么难……https://blog.csdn.net/stone41123/article/details/78167288 首先有两个操作,一个查询,一个连接 查询的话,直接 ...

  8. 用命令打开本地tomcat服务器

    1.点击开始菜单,搜索cmd,默认第一个结果是cmd.exe, 鼠标右键用管理员权限打开(win7及以上版本系统) 启动命令是net start tomcat8 (我电脑是tomcat8,如果是tom ...

  9. ThinkPHP 框架2.1,2.2和3.0版本开启lite模式导致URL命令执行漏洞

    在开启了Lite模式后,在ThinkPHP/extend/Mode/Lite/Dispatcher.class.php中第73行: // 解析剩余的URL参数 $res = preg_replace( ...

  10. maven 跳过test

    -DskipTests,不执行测试用例,但编译测试用例类生成相应的class文件至target/test-classes下. -Dmaven.test.skip=true,不执行测试用例,也不编译测试 ...