Concurso de programación local UCF 2013 (práctica) H. En la geometría computacional de Spotlight

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;
    }
}
Publicado 23 artículos originales · elogiado 7 · visitas 1744

Supongo que te gusta

Origin blog.csdn.net/weixin_44164153/article/details/104808320
Recomendado
Clasificación