C++ 使用 glm 实现 Cartesian3.fromDegrees

C++ 使用 glm 实现 Cartesian3.fromDegrees

cpp 复制代码
#include <glm/glm.hpp>
#define _USE_MATH_DEFINES
#include <cmath>

namespace FastBVH
{
  float RADIANS_PER_DEGREE = M_PI / 180.0;
  // 定义地球半径的平方(可以用你自己的椭球模型)
  const glm::dvec3 defaultRadiiSquared = glm::dvec3(6378137.0f * 6378137.0f, 6378137.0f * 6378137.0f, 6356752.3f * 6356752.3f);

  class Cartesian3
  {
  public:
    static glm::dvec3 fromRadians(double longitude, double latitude, double height)
    {
      const glm::dvec3 &radiiSquared = defaultRadiiSquared;

      double cosLatitude = std::cos(latitude);
      glm::dvec3 scratchN(cosLatitude * std::cos(longitude), cosLatitude * std::sin(longitude), std::sin(latitude));

      scratchN = glm::normalize(scratchN);

      glm::dvec3 scratchK = radiiSquared * scratchN;

      double gamma = std::sqrt(dot(scratchN, scratchK));
      scratchK = scratchK / gamma;

      scratchN = scratchN * height;

      return scratchK + scratchN;
    }

    static glm::dvec3 fromDegrees(double longitude, double latitude, double height)
    {
      longitude = longitude * RADIANS_PER_DEGREE;
      latitude = latitude * RADIANS_PER_DEGREE;
      return fromRadians(longitude, latitude, height);
    }
  };
}
相关推荐
HINOTOR_4 分钟前
DAY 29 复习日:类的装饰器
开发语言·python
黑听人39 分钟前
【力扣 中等 C++】90. 子集 II
开发语言·数据结构·c++·算法·leetcode
Wukong.Sun1 小时前
操作系统的概念,功能和目标
java·linux·开发语言·windows
虾球xz1 小时前
CppCon 2015 学习:Algorithmic Differentiation C++ & Extremum Estimation
开发语言·c++·学习
黑听人1 小时前
【力扣 简单 C】21. 合并两个有序链表
c语言·开发语言·数据结构·算法·leetcode
什么半岛铁盒1 小时前
C++信号处理程序解析与改进
linux·c++·信号处理
白露与泡影1 小时前
Java面试避坑指南:牛客网最新高频考点+答案详解
java·开发语言·面试
@zcc@1 小时前
Java日期格式化
java·开发语言
黑听人2 小时前
【力扣 简单 C】83. 删除排序链表中的重复元素
c语言·开发语言·数据结构·算法·leetcode
钢铁男儿2 小时前
Python内置类型子类化的陷阱与解决方案
开发语言·前端·python