zoj 3598 – Spherical Triangle

这道题有点意思,几何题,给出三个顶点的经纬度,求球面三角形的内角和。

  1. 很明显,建立在单位球面上,经纬度可以转换成笛卡尔坐标 (x,y,z);
  2. 再者,球面角实际上是两边所在大圆在顶点的切线的夹角,这事实上是过球心和分别两边形成的两个平面的二面角,也就是 AOB, BOC, COA 的二面角之和即为所求。
  3. 从第 1 点可以知道,OA, OB, OC 的三维向量我们是知道的,因此求二面角简单,因为 AOB 的法线就是 OA×OB,BOC 的法线就是 OB×OC,因此,球面角 B 就应该是 180-<OA×OB,OB×OC>,至于向量的向量积以及夹角,大学线性代数里面就有详细的方法,纯代数操作。

# -- coding: utf-8 --

3495437 2013-12-24 19:16:51 Accepted 3598 Python 140 272 呆滞的慢板

from math import sin, cos, acos, pi

def deg2rad(x): return float(x)*pi/180

def pol2car(a): return (cos(a[1])cos(a[0]), cos(a[1])sin(a[0]), sin(a[1]))

def dot(a, b): return sum([a[i]*b[i] for i in range(3)])

def cross(a, b): return (a[1]b[2]-a[2]b[1], a[2]b[0]-a[0]b[2], a[0]b[1]-a[1]b[0])

def module(a): return (sum(a[i]*a[i] for i in range(3)))**0.5

def angle(a, b): return acos(dot(a, b) / module(a) / module(b))

for t in range(int(raw_input())):

a, b, c = [tuple(map(deg2rad, raw_input().split())) for i in range(3)]
a, b, c = map(pol2car, [a, b, c])

print '%.2f' % (540-(angle(cross(a,b),cross(b,c))+
       angle(cross(b,c),cross(c,a))+
       angle(cross(c,a),cross(a,b)))/pi*180)</code>

【转载请附】愿以此功德,回向 >>

原文链接:http://www.huangwenchao.com.cn/2013/12/zoj3598.html【zoj 3598 – Spherical Triangle】

发表评论

电子邮件地址不会被公开。 必填项已用*标注