UCFローカルプログラミングコンテスト2013(演習)H。スポットライトで
元のタイトルの住所:
https://nanti.jisuanke.com/t/43743
基本的な質問:
一連のスポットライトがデカルト座標のx軸に配置され、各スポットライトの位置、スポットライトの強度、およびスポットライトの照射範囲と中心軸の間の角度を与え、次に位置座標(x、y)を与えます。この場所での総光量はどのくらいですか。
光の強度を計算する式は次のとおりです。スポットライトの強度/スポットライトからの距離^ 2
基本的なアイデア:
タイトルから、各スポットライトの位置座標がスポットライトの範囲内にあるかどうかを確認する方法が主な困難であることがわかります。
最初、最初にボードを設定して、スポットライトの点と左右の境界光線の位置関係を直接決定するように設定しましたが、ボードに問題QAQがあるようです;
我々は支障がそう点があればスポットライトの接続点とスポットライト左端の傾斜角度より大きい傾斜角度を確保するようにスポットライトで発見するが見つかりませんしばらく考え、傾斜角度が少ないライン上のスポットライトの右側の境界線を超えています。
位置座標を照らすことができる各スポットライトを決定したら、距離の式を直接計算します。
ps。傾きを計算するときにatan2()関数が使用されることに注意してください
atan2()関数とatan()関数の違いについては、百度百科事典を参照してください。
参照コード:
#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;
}
}