Concurso de programación local de UCF 2013 (Práctica) H. En el punto de mira
Dirección del título original:
https://nanti.jisuanke.com/t/43743
Preguntas básicas:
Se colocan una serie de focos en el eje x de las coordenadas cartesianas, dando la posición de cada foco, la intensidad del foco y el ángulo entre el rango de irradiación del foco y el eje central, y luego se da una coordenada de posición (x, y) ¿Cuál es la intensidad de luz total en esta ubicación?
La fórmula para calcular la intensidad de la luz es: Intensidad del foco / distancia del foco ^ 2
Ideas basicas:
A través del título podemos encontrar que la dificultad principal es cómo confirmar si las coordenadas de posición de cada foco están dentro del rango del foco; al
principio, originalmente quería configurar el tablero para determinar directamente la relación posicional entre el punto y los rayos delimitadores izquierdo y derecho del foco, y luego el tablero parece tener un problema QAQ Después de
pensarlo, descubrimos que no es tan problemático, encontramos que hacer que el punto esté dentro del rango del foco, siempre que el ángulo de inclinación de la línea de conexión entre el foco y el punto sea mayor que el ángulo de inclinación del borde izquierdo del foco y menor que el ángulo de inclinación del borde derecho del foco.
Cuando haya determinado cada foco que puede iluminar las coordenadas de posición, simplemente calcule la fórmula de distancia directamente.
ps. Tenga en cuenta que la función atan2 () se utiliza al calcular la inclinación
Para la diferencia entre la función atan2 () y la función atan (), vea la Enciclopedia Baidu
Código de referencia:
#include <bits/stdc++.h>
using namespace std;
#define IO std::ios::sync_with_stdio(false)
#define ll long long
#define INF 0x3f3f3f3f
inline double dis(pair<double,double> a,pair<double,double> b){
return (a.first - b.first)*(a.first - b.first) + (a.second-b.second)* (a.second-b.second);
}
const int maxn = 110;
double x,y;
int n;
double a[maxn],b[maxn],c[maxn];
pair<double,double> o,temp;
signed main() {
int t;
cin >> t;
for (int cas = 1; cas <= t; cas++) {
cin >> x >> y >> n;
o = make_pair(x, y);
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= n; i++) cin >> b[i];
for (int i = 1; i <= n; i++) cin >> c[i];
double ans = 0;
for (int i = 1; i <= n; i++) {
temp = make_pair(a[i], 0);
double k1 = (90.0 - b[i]) / 180.0 * acos(-1.0);
double k2 = (90.0 + b[i]) / 180.0 * acos(-1.0);
double hu = atan2(o.second - temp.second,o.first - temp.first);
if (hu >= k1 && hu <= k2) {
ans += c[i] / dis(o, temp);
}
}
printf("Scene #%d: Spotlight intensity on Stacie is %.3f\n", cas, ans);
cout << endl;
}
}