博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj-1031-fence(不是我写的,我只是想看着方便)
阅读量:4692 次
发布时间:2019-06-09

本文共 1211 字,大约阅读时间需要 4 分钟。

题目大意:

  有一个光源位于(0,0)处,一个多边形的围墙。围墙是“全黑”的,不透光也不反射光。距光源r处的光强度为I0=k/r,k为常数。

  一块无穷窄高为h的墙上围墙受到的照度为dI=I0*|cosα|*dl*h,其中I0为该点光强,α为法线与该点到光源连线的夹角。

求总照度。(dI之和)

输入:第一行三个数,第一个数为给定的常数k,第二个数位围墙高h,第三个数为围墙顶点数。接下来每行为一个围墙的顶点,按遍历多边形的顺序给出。

输出:总的照度。


Sample Input

0.5 1.7 31.0 3.02.0 -1.0-4.0 -1.0

Sample Output

5.34

如果有一点点计算机视觉的基础或者物理直觉好的话,会知道结果实际与距离和夹角都没有关系,只要求光源向360°辐射的范围内,有多大的角度被墙挡住了。于是转化为了求围墙相对于光源张角的问题。

求张角的过程大致如下:

遍历所有的边,求边相对于光源的张角(自行规定一个正方向)。记录下每次求和之后的最大值和最小值(即像一个方向延扫得最远时的角度),但要注意不应该大于360度。

#include
#include
#include
using namespace std;const double pi=3.1415926;double k,h,x[105],y[105];double angle(double x0,double y0,double x,double y){ double a=atan2(y0,x0);//atan2(X2-X1,Y2-Y1)所表达的意思是坐标原点为起点, 指向(x,y)的射线在坐标平面上与x轴正方向之间的角的角度。 double b=atan2(y,x);//我试过x,y顺序可以翻过来 if(a-b>pi)b+=pi*2; if(b-a>pi)a+=pi*2; return a-b;}int main(){int n;cin>>k>>h>>n;for(int i=0;i
>x[i]>>y[i];x[n]=x[0],y[n]=y[0];double s=0,max=0,min=0;for(int i=0;i
max)max=s; if(max-min>=2*pi) {max=min+2*pi; break;}} cout<
<
<
<

  

转载于:https://www.cnblogs.com/jin-nuo/p/5292754.html

你可能感兴趣的文章
RabbitMQ命令行手动创建队列rabbitmqadmin用法
查看>>
linux修改当前用户环境变量永久生效
查看>>
Javascript Asynchronous Investigation
查看>>
spring学习笔记之---bean管理
查看>>
spring学习笔记之---bean管理的注解方式
查看>>
spring学习笔记之---bean属性注入
查看>>
SpringMVC项目案例之---数据的获取与显示
查看>>
SpringMVC学习笔记之---深入使用
查看>>
SpringMVC学习笔记之---简单入门
查看>>
SpringMVC学习笔记之---数据绑定
查看>>
Mybatis学习笔记之---环境搭建
查看>>
Mybatis学习笔记之---编写dao实现类的CRUD
查看>>
SpringMVC学习笔记之---RESTful风格
查看>>
Mybatis学习笔记之---动态sql中标签的使用
查看>>
Mybatis学习笔记之---CRUD(增删改查)
查看>>
Mybatis学习笔记之---多表查询(2)
查看>>
Mybatis学习笔记之---多表查询(1)
查看>>
SSM整合之---简单选课系统
查看>>
SSM整合之---环境搭建
查看>>
创建.net framework webapi出现“Web 服务器被配置为不列出此目录的内容。”错误
查看>>