Zoj 3598 Spherical Triangle 【计算几何】【曲面三角形】
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3598
题目大意:给出一个球体上的三点,三点的坐标以经纬度的形式给出,求曲面三角形的内角和。
即:给出ABC三个点的经纬度,求出 角A+ 角B+角C的值。
利用公式即可求得 cosa=cosb*cosc+sinb*sinc*cosA
其中小写a,b,c表示球面三角形边长所对应的圆心角 大写A表示三角形内角。
下面的难度就是求出abc角的大小即可。
网上看了一个写法看了好久看不太懂:T.T
<span style="font-size:14px;">//计算圆心角lat表示纬度,-90<=w<=90,lng表示经度
//返回两点所在大圆劣弧对应圆心角,0<=angle<=pidouble angle(double lng1, double lat1, double lng2, double lat2)
{double dlng = fabs(lng1 - lng2) * Pi / 180;while (dlng + eps > Pi + Pi)dlng -= Pi + Pi;if (dlng > Pi)dlng = Pi + Pi - dlng;lat1 *= Pi / 180, lat2 *= Pi / 180;return acos(cos(lat1) * cos(lat2) * cos(dlng) + sin(lat1) * sin(lat2));
}</span>
太水了,后来找到了一个能接受的写法:
我们先把经纬度换为xyz坐标。(默认了R是1)
比如已知一点A的坐标为(x1,y1,z1),B的坐标是(x2,y2,z2)
下面就是求角度AOB,向量OA为(x1,y1,z1),向量OB为(x2,y2,z2)。
OA*OB=|OA|*|OB|*cos(角AOB)=x1*x2+y1*y2+z1*z2
则就可以求出角AOB了。
具体算法看代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
const double PI = 2.0 * asin(1.0);
using namespace std;
struct po
{double x,y,z;
};void m_change(double ll, double la, po& p)
{p.x = cos(la * PI / 180) * cos(ll * PI / 180);p.y = cos(la * PI / 180) * sin(ll * PI / 180);p.z = sin(la * PI / 180);
}double xlj(po p, po q)
{return (p.x * q.x) + (p.y * q.y) + (p.z * q.z);
}int main()
{int n;cin>>n;while(n--){po A,B,C;cin>>A.x>>A.y>>B.x>>B.y>>C.x>>C.y;m_change(A.x,A.y,A);m_change(B.x,B.y,B);m_change(C.x,C.y,C);double a = acos(xlj(C,B));double b = acos(xlj(A,C));double c = acos(xlj(A,B));
// printf("a:%lf b:%lf c:%lf\n",a,b,c);double da,db,dc;da = acos((cos(a) - cos(b) * cos(c)) / (sin(b) * sin(c)));db = acos((cos(b) - cos(c) * cos(a)) / (sin(c) * sin(a)));dc = acos((cos(c) - cos(a) * cos(b)) / (sin(a) * sin(b)));
// printf("da:%lf db:%lf dc:%lf\n",da,db,dc);double ans = da + db + dc;printf("%.2lf\n",ans * (180 / PI));}
}
Zoj 3598 Spherical Triangle 【计算几何】【曲面三角形】相关推荐
- ZOJ 3598 Spherical Triangle(计算几何 球面三角形内角和)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4682 As everybody knows, the sum of ...
- ZOJ 1598 Spherical Triangle
题意:给出经纬度,求球面三角形的三角和. 看了一下午的维基百科才知道他到底说了什么,英语是真烂啊... 晚上A码的时候也特别慢,看来自己修炼之路还很长,最后还是在师哥的协助下A掉 公式:(其中a,b, ...
- POJ 1673 EXOCENTER OF A TRIANGLE(证明+求三角形垂心)
POJ 1673 EXOCENTER OF A TRIANGLE(证明+求三角形垂心) http://poj.org/problem?id=1673 题意: ZOJ 1821 有一个三角形ABC,扩展 ...
- 定义一个Triangle类表示三角形,测试这个三角形类的所有方法
定义一个Triangle类表示三角形,其中三个double型变量a.b.c表示三条边长.为该类定义两个构造方法:默认构造方法设置三角形的三条边长都为0.0; 带三个参数的构造方法通过传递三个参数创建三 ...
- 【计算几何】【极角序】【二分】bzoj1914 [Usaco2010 OPen]Triangle Counting 数三角形
极角排序后枚举每个点,计算其与原点连线的左侧的半平面内的点与其组成的三角形数(二分/尺取),这些都不是黄金三角形. 补集转化,用平面内所有三角形的个数(C(n,3))减去这些即可. 精度很宽松,几乎不 ...
- LeetCode 118 Pascal's Triangle(帕斯卡三角形)(vector)
翻译 给定一个行数字,生成它的帕斯卡三角形.例如,给定numRows = 5, 返回: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1] ] 原文 Given numR ...
- E. Draw a triangle(计算几何+EXGCD)
之前学的EXGCD太过于浅显了,很多性质都不是很清楚,正好vp被卡这题了,我们来做一下. E. Draw a triangle 题意:给定两个点的坐标,请你求第三个点的标,保证三个点构成的三角形面积最 ...
- POJ 1673 EXOCENTER OF A TRIANGLE(求三角形的垂心)
博客原文地址:http://blog.csdn.net/xuechelingxiao/article/details/40654421 EXOCENTER OF A TRIANGLE 题目大意:一个三 ...
- Leetcode812.Largest Triangle Area最大三角形面积
给定包含多个点的集合,从其中取三个点组成三角形,返回能组成的最大三角形的面积. 示例: 输入: points = [[0,0],[0,1],[1,0],[0,2],[2,0]] 输出: 2 解释: 这 ...
最新文章
- 对比Memcached和Redis,谁才是适合你的缓存?
- python opencv 凸包
- WordPress添加固定位置的百度分享按钮
- 使用h5py操作hdf5文件
- 通过telnet自动下载cfg配置文件
- linux中的strip命令简介------给文件脱衣服
- 华为 EC169 3G上网卡在MacPro中的使用
- Android内存泄漏分析心得
- 台式计算机颜色如何矫正,显示器颜色校正,详细教您怎么校准显示器颜色
- 003-Java技术体系
- Why the MonthCalendar.MinDate is 01/01/1753?
- 基于 Robot Framework 实现网络自动化测试
- SNS、FaceBook、导航设计等等
- 【DFS练习】水洼数
- 火遍日本 IT 界的深度学习入门书,你读完了吗?
- 程序员必备的软技能-金字塔原理拆解(上)
- 解析单总线协议(1-wire)
- MySQL之账号管理、建库以及四大引擎
- 8.ASP.NET Core中的Kestrel Web服务器
- 常见的三种Web应用程序:SWA, PWA 和Jamstack