⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 2330.cpp

📁 哈尔滨工业大学ACM 竞赛网上在线试题集锦的源代码
💻 CPP
字号:
/*  This Code is Submitted by wywcgs for Problem 2330 on 2006-08-21 at 00:13:55 */ 
#include <cstdio>
#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];
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -