1266:How I Wonder What You Are!

問題文
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1266
星と望遠鏡が与えられる。すべての望遠鏡を使って見える星の数を数えよ。



























aとbをそれぞれ望遠鏡の方向ベクトルと星の位置ベクトルとすると、
cosθ=a•b/|a||b|
θ=acos(a•b/|a||b|)
で、このθが望遠鏡が見える角度以下だったらその星は見える。
これを全部試す。

#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<map>
#include<set>
#include<cmath>
#include<cstdio>

#define all(c) (c).begin(),(c).end()

using namespace std;

const double EPS=1e-10;

double add(double a, double b){
  if(abs(a+b) < EPS * (abs(a)+abs(b)))return 0;
  return a+b;
}

struct point{
  double x,y,z;
  point(){}
  point(double x,double y,double z) : x(x),y(y),z(z){}
  point operator + (point p){return point(add(x,p.x),add(y,p.y),add(z,p.z));}
  point operator - (point p){return point(add(x,-p.x),add(y,-p.y),add(z,-p.z));}
  point operator * (double d){return point(x*d,y*d,z*d);}
};
double dot(point a,point b){return a.x*b.x+a.y*b.y+a.z*b.z;}
double norm(point a){return sqrt(a.x*a.x+a.y*a.y+a.z*a.z);}
double theta(point a,point b){return acos(dot(a,b)/norm(a)/norm(b));}

int main(void){

  int n,m;
  while(cin >> n,n){
    vector<point>star(n);
    for(int i=0;i<n;i++)cin >> star[i].x >> star[i].y >> star[i].z;
    cin >> m;
    vector<double>p(m);
    vector<point>scope(m);
    for(int i=0;i<m;i++)
      cin >> scope[i].x >> scope[i].y >> scope[i].z >> p[i];
 
    int ans=0;
    for(int i=0;i<n;i++){
      for(int j=0;j<m;j++){
	if(theta(star[i],scope[j])-EPS<p[j]){ans++;break;}
      }
    }
    cout << ans << endl;
  }

  return 0;
}