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<=pi

double 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));
    }
}
时间: 2024-10-25 20:34:43

Zoj 3598 Spherical Triangle 【计算几何】【曲面三角形】的相关文章

ZOJ 3598 Spherical Triangle (三角关系)

ZOJ Problem Set - 3598 Spherical Triangle Time Limit: 2 Seconds      Memory Limit: 65536 KB As everybody knows, the sum of the interior angles of a triangle on a plane is always 180 degree. But this is not true when the triangle is on spherical surfa

ZOJ 3598 Spherical Triangle(计算几何 球面三角形内角和)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4682 As everybody knows, the sum of the interior angles of a triangle on a plane is always 180 degree. But this is not true when the triangle is on spherical surface. Given a triangle on

ZOJ 3598 Spherical Triangle球面几何公式应用

#include <map> #include <set> #include <list> #include <cmath> #include <ctime> #include <deque> #include <stack> #include <queue> #include <cctype> #include <cstdio> #include <string> #inc

计算几何---曲面三角形差值公式

1.对非平面的三角形面片进行差值,可以从指定的定点法相.或者边界切线方向开始进行差值,即从三个端点值,以及留个且向量使用Hermite差值完成. 对于曲面三角形的任一条边,如上图所示.如果向量定点v0处的法向量n0没有给出通过标签<normal>给出,则通过计算v0点的两个边的切向量的叉积的方式,计算v0d的法相量n0. 其中,该曲面三角巷的曲率边通过标签<vertices>下的元素<edge>进行指定. 计算重心点的且向量,通过使用二次Hermite曲线差值的方式,然

ZOJ 3720 Magnet Darts (计算几何,概率,判点是否在多边形内)

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3720 题意: 在一个矩形区域投掷飞镖,因此飞镖只会落在整点上,投到每个点的得分是Ax+By.矩形区域里面有个多边形,如果飞镖投在多边形里面则得分,求最终的得分期望. 即:给定一个矩形内的所有整数点,判断这些点是否在一个多边形内 方法: 计算几何的判点是否在多边形内(几何模板),如果在,则令得分加(Ax+By)*以此点为中心边长为1的正方形面积 1 void solve()

[Usaco2010 OPen]Triangle Counting 数三角形

[Usaco2010 OPen]Triangle Counting 数三角形 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 394  Solved: 198[Submit][Status][Discuss] Description 在一只大灰狼偷偷潜入Farmer Don的牛群被群牛发现后,贝西现在不得不履行着她站岗的职责.从她的守卫塔向下瞭望简直就是一件烦透了的事情.她决定做一些开发智力的小练习,防止她睡着了.想象牧场是一个X,Y平面的网格.她将

【LeetCode-面试算法经典-Java实现】【118-Pascal&#39;s Triangle(帕斯卡三角形)】

[118-Pascal's Triangle(帕斯卡三角形(杨辉三角))] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5, Return [ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1] ] 题目大意 给定一个正整数n,求n层帕斯卡三角形

Pascal&#39;s Triangle II(帕斯卡三角形)

Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3, Return [1,3,3,1]. Note: Could you optimize your algorithm to use only O(k) extra space? 杨辉三角形,西方称为帕斯卡三角形 杨辉三角 1.每行数字左右对称,由1开始逐渐变大,然后变小,回到1. 2.第n行的数字个数为n个. 3.第n行数

bzoj 1914: [Usaco2010 OPen]Triangle Counting 数三角形 容斥

1914: [Usaco2010 OPen]Triangle Counting 数三角形 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 272  Solved: 143[Submit][Status] Description 在 一只大灰狼偷偷潜入Farmer Don的牛群被群牛发现后,贝西现在不得不履行着她站岗的职责.从她的守卫塔向下瞭望简直就是一件烦透了的事情.她决定做一些开发智力的小练习,防止她睡 着了.想象牧场是一个X,Y平面的网格.她将N