空间向量夹角
空间夹角公式见下图:

代码:
#include <iostream>
#include <cmath>
using namespace std;
const double eps = 1e-11;
struct Node {
double x, y, z;
Node() { x = y = z = 0; }
Node(double a, double b, double c) { x = a; y = b; z = c; }
Node operator- ( Node nd ) {
return Node(x-nd.x, y-nd.y, z-nd.z);
}
};
Node goodEye, goodFeet, badEye, badFeet, dir;
double h1, r1, h2, r2;
void input() {
scanf("%lf %lf %lf %lf %lf", &h1, &r1, &badFeet.x, &badFeet.y, &badFeet.z);
scanf("%lf %lf", &h2, &r2 );
scanf( "%lf %lf %lf", &goodFeet.x, &goodFeet.y, &goodFeet.z);
scanf( "%lf %lf %lf", &dir.x, &dir.y, &dir.z );
}
double dis( Node a, Node b ) { //求出空间两点距离
a.x -= b.x;
a.y -= b.y;
a.z -= b.z;
return sqrt(a.x*a.x + a.y*a.y + a.z*a.z);
}
double getDree( Node a, Node b ) { //求向量a,b之间的夹角
double c, d;
c = a.x*b.x + a.y*b.y + a.z*b.z;
d = sqrt(a.x*a.x + a.y*a.y + a.z*a.z) * sqrt(b.x*b.x + b.y*b.y + b.z*b.z);
return acos(c/d);
}
bool solve() {
double limit, now, len;
Node a;
goodEye.x = goodFeet.x;
goodEye.y = goodFeet.y;
goodEye.z = goodFeet.z + h2 * 0.9 - r2;
badEye.x = badFeet.x;
badEye.y = badFeet.y;
badEye.z = badFeet.z + h1 - r1;
len = dis( badEye, goodEye );
limit = asin( r1/len ); //求出边界
a = badEye - goodEye;
now = getDree(a, dir);
if( now - limit > eps ) return 0;
return 1;
}
int main() {
// freopen( "c:/aaa.txt", "r", stdin );
int T;
scanf( "%d", &T);
while( T-- ) {
input();
solve() ? puts( "YES" ) : puts( "NO" );
}
return 0;
}
浙公网安备 33010602011771号