?? 2330.cpp
字號(hào):
/* This Code is Submitted by wywcgs for Problem 2330 on 2006-08-21 at 00:13:55 */
#include <cmath>
#include <algorithm>
using namespace std;
class Dir {
public:
double x, y, z;
Dir(double cx, double cy, double cz) : x(cx), y(cy), z(cz) {}
Dir(double, double);
Dir operator +(const Dir& d) const { return Dir(x+d.x, y+d.y, z+d.z); }
Dir operator *(const Dir& d) const { return Dir(y*d.z-z*d.y, z*d.x-x*d.z, x*d.y-y*d.x); }
};
Dir::Dir(double a, double b) {
a *= M_PI/180; b *= M_PI/180;
x = cos(a)*cos(b);
y = cos(a)*sin(b);
z = sin(a);
}
double m[3][4];
double intz(Dir&, Dir&, Dir&, Dir&, Dir&);
double det(int, int, int);
int main()
{
int T;
double ha, hb;
scanf("%d %lf %lf", &T, &ha, &hb);
Dir a(-50, 0, ha), b(50, 0, hb);
for(int t = 1; t <= T; t++) {
double aa, ab, ba, bb; scanf("%lf %lf %lf %lf", &aa, &ba, &ab, &bb);
Dir va(aa, ab), vb(ba, bb), vc = va*vb;
double za = intz(vc, va, a, vb, b), zb = intz(vc, vb, b, va, a);
printf("%d: %.0lf\n", t, (za+zb)/2);
}
return 0;
}
double intz(Dir& c, Dir& a, Dir& A, Dir& b, Dir& B)
{
Dir pb = c+A, pc = a+A;
m[0][0] = A.x; m[0][1] = A.y; m[0][2] = A.z; m[0][3] = 1;
m[1][0] = pb.x; m[1][1] = pb.y; m[1][2] = pb.z; m[1][3] = 1;
m[2][0] = pc.x; m[2][1] = pc.y; m[2][2] = pc.z; m[2][3] = 1;
double rc = B.x*det(1, 2, 3)-B.y*det(0, 2, 3)+B.z*det(0, 1, 3)-det(0, 1, 2);
double rf = b.x*det(1, 2, 3)-b.y*det(0, 2, 3)+b.z*det(0, 1, 3);
return B.z-rc/rf*b.z;
}
double det(int a, int b, int c)
{
return m[0][a]*m[1][b]*m[2][c]+m[0][b]*m[1][c]*m[2][a]+m[0][c]*m[1][a]*m[2][b]
-m[0][c]*m[1][b]*m[2][a]-m[0][b]*m[1][a]*m[2][c]-m[0][a]*m[1][c]*m[2][b];
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -