计算机图形学数学基础译自 ScratchaPixel 网站,数学基础部分共八篇,本篇为第七篇,感兴趣的同学可以参考我的 GitBook 镜像。

三角函数 Trigonometric Functions

通常用2D坐标中的 单位圆(unit circle) 表示三角函数的性质。在单位圆上绘制一点P,由原点和P点的连线与x轴的夹角为。P点的x坐标对应于 的余弦(cosine)值,同样,其y坐标对应 的正弦(sine)值。需要注意的是C++中计算使用的是 弧度(radians),需要将 角度(degrees) 转换为弧度(radians):

图形学中一个比较重要的函数是 反正切(arctangent),即正切(tangent)的反函数。假如有一点P坐标为(0.707, 0.707),可以得到 的值为 。假如P的坐标为(-0.707, -0.707), 的值应为 。但是tan函数计算-0.707/-0.707的值为1,因此得到的角度仍为 。解决方法是采用C/C++中的atan2函数。下面是我们讨论的公式:

atan2函数计算的结果为正表示 是逆时针角度(y>0的象限),结果为负表示 是顺时针角度(y<0的象限),结果的范围在 之间。

在球面坐标表示向量 Representing Vectors with Spherical Coordinates

目前我们知道在 笛卡尔坐标系(Cartesian Coordinates) 表示向量(三个值,每个值表示一个轴)。同样,在 球面坐标系(Spherical Coordinates) 可以用两个值表示与笛卡尔坐标系相同的向量。如图所示:

向量与球面垂直的平面所成的角称为 。向量的投影与球面横切面所成的角称为 。图形学中 的范围为 的范围为 , 如下图:

球面坐标系的正式定义还包括一些专业术语,如r表示径向距离(radial distance)。

分别被称为 极角(polar angle)方位角(azimuth angle)。 如果不需要考虑向量的长度,球面坐标系是表示向量的另一种方式,这点在 着色(shading) 时非常重要。

z轴向上 Z is up

在数学和物理学中,坐标轴的表示通常采用左手定则,z轴向上,y轴向右,x轴指向自己。如图所示:

笛卡尔坐标系与球面坐标系的转换 Converting Cartesian to Spherical Coordinates

如图所示

单位圆内向量与z轴的夹角为: ,向量在z轴上的坐标为Vz。这里可以容易得到公式:

在C++中可以写为:

float theta = acos(Vz);

对于 角的计算。

根据图中所示,可以方便得到公式:

在C++中可以写为:

float phi = atan2(Vy, Vx);

球面坐标系与笛卡尔坐标系的转换 Spherical Coordinates to Cartesian Coordinates

根据球面坐标系的图,以下公式容易得到:

以下是C++的转换代码:

template<typename T>
Vec3<T> sphericalToCartesian(const T &theta, const T &phi) {return Vec3<T>(cos(phi) * sin(theta), sin(phi) * sin(theta),cos(theta));
}

更多三角函数的技巧 More Tricks with Trigonometric Functions

  • 计算 值,虽然仅需要z轴坐标就可以计算,但是为了安全,使用clamp函数限制z的值在 [-1,1] 之间。
template<typename T>
inline T sphericalTheta(const Vec3<T> &v) {return acos(clamp<T>(v[2], -1, 1));
}
  • 计算 值,C++的atan2函数的返回值在 之间,我们需要将其转换至 之间:
template<typename T>
inline T sphericalPhi(const Vec3<T> &v) {T p = atan2(v[1],v[0]);return (p < 0) ? p + 2 * M_PI : p;
}
  • 大部分场景我们并不需要计算出 的值。我们只需计算出 , , 的值。计算 的值比较直接:
template<typename T>
inline T cosTheta(const Vec3<T> &w) {return w[2];
}

根据 勾股定理(Pythagorean theorem),我们可以得到: 。假如 ,且 。则可以得到:

因此有如下代码:

template<typename T>
inline T sinTheta(const Vec3<T> &w) {return std::max(T(0), 1- cosTheta(w) * cosTheta(w));
}template<typename T>
inline T sinTheta(const Vec3<T> &w) {return sqrt(sinTheta2(w));
}

对于 的计算:

template<typename T>
inline T cosPhi(const Vec3<T> &w) {T sintheta = sinTheta(w);if (sintheta == 0) return 1;return clamp<T>(w[0] / sintheta, -1, 1);
}
template<typename T>
inline T shiPhi(const Vec3<T> &w) {T sintheta = sinTheta(w);if (sintheta) return 0;return clamp<T>(w[1] / sintheta, -1, 1);
}

球面坐标系与三角函数 Spherical Coordinates and Trigonometric Functions相关推荐

  1. 解析几何:第一章坐标系与坐标变换:平面直角坐标系、空间直角坐标系及其变换、极坐标系,圆柱面坐标系,球面坐标系

    §1 平面直角坐标系及其变换 1.直角坐标系(笛卡儿坐标系) 坐标系:O-XY 点M(x,y),x为横坐标,y为纵坐标. 在Ⅰ.Ⅱ.Ⅲ.Ⅳ四个象限中坐标x,y的符号为: 象限 Ⅰ Ⅱ Ⅲ Ⅳ x + ...

  2. 球面坐标系下的三重积分

    涉及知识点 三重积分 球面坐标系 点火公式 一些常见积分处理手法 球面坐标系定义 球面坐标系由方位角φ\varphiφ.仰角θ\thetaθ和距离rrr构成 直角坐标系(x,y,z)(x,y,z)(x ...

  3. mysql象限和投影_PostGIS空间数据库SRID背景知识 - 地理坐标系(球面坐标系)和投影坐标系(平面坐标系) - GIS开发者...

    背景 背景知识和坐标系有关. 什么是地理坐标系,什么是投影坐标系? 参考此文: 原文 1.首先理解地理坐标系(Geographic coordinate system),Geographic coor ...

  4. python计算球坐标系的积分_python – n球面坐标系到笛卡尔坐标系

    您可以通过记忆中间产品来加速您的原始代码,即 def ct_dynamic(r,alpha): """alpha: the n-2 values between [0,2 ...

  5. python笛卡尔坐标系_python – n球面坐标系到笛卡尔坐标系

    您可以通过记忆中间产品来加速您的原始代码,即 def ct_dynamic(r, alpha): """alpha: the n-2 values between [0, ...

  6. 三重积分的球面坐标系的体积元素表示

  7. 三角函数(trigonometric function)

    三角函数定义(摘自维基百科): 三角函数(英语:Trigonometric functions)是数学中常见的一类关于角度的函数.三角函数将直角三角形的内角和它的两个边的比值相关联,也可以等价地用与单 ...

  8. c+ +三角函数_C ++中的三角函数

    c+ +三角函数 C ++三角函数 (C++ Trigonometric functions) Trigonometric functions are also called circular fun ...

  9. [转载] python中三角函数_Python中的三角函数

    参考链接: Python | type()函数 python中三角函数 Python三角函数/方法 (Python Trigonometric functions/methods) In python ...

  10. android 球面 旋转 坐标系,天球坐标系和地球坐标系-GPS定位原理及应用-电子发烧友网站...

    2.1.1天球坐标系 天球坐标系是利用基本星历表的数据把基本坐标系固定在天球上,星历表中列出一定数量的恒星在某历元的天体赤道坐标值,以及由于岁差和自转共同影响而产生的坐标变化.常用的天球坐标系:天球赤 ...

最新文章

  1. 前端JavaScripts基础知识点讲义代码
  2. JS-事件内置对象event
  3. 数据结构实验之栈三:后缀式求值
  4. 浏览器与硬件交互的方法_【第2058期】现代浏览器内部揭秘之一
  5. 80-600-020-原理-存储引擎-简介
  6. Linux系统、版本、CPU、内存查看、硬盘空间
  7. swift5 decimal 转换为String 并制定小数点位数
  8. [5-24]绿色精品软件每天更新[uc23整理]
  9. Windows 安装redis 教程
  10. ES6新语法-day02
  11. 致远V8.1 协同 最新版
  12. Ubertooth one“蓝牙扫描嗅探”使用教程
  13. Ubuntu 老版本下载
  14. 1016C. Vasya And The Mushrooms
  15. 计算机网络共经历了四代,计算机经历了四代的发展,其中第三代计算机的主要组成部件是...
  16. VMware15安装MAC 解锁
  17. 西瓜书读书笔记整理(二)—— 第一章 绪论
  18. 如何抓取豆瓣网电影海报信息及重命名
  19. linux pwm 调屏_PWM调光方法在LED亮度调节中的应用
  20. anydesk远程计算机,利用AnyDesk远程协助解决问题

热门文章

  1. c++ primer plus 第十四章 C++中的代码重用
  2. 企业管理系统各主要模块简介
  3. 用拉格朗日插值法,牛顿插值和分段线性插值计算近似值
  4. Iptables实现 DMZ 区域的服务器简单的发布策略
  5. special effects - 樱花飘落背景特效
  6. 智能泊车技术及现状详解
  7. html如何解决412问题,网站412怎么解决?
  8. r语言如何计算t分布临界值_医学统计与R语言:四格表卡方还需要连续校正吗?...
  9. 理解直推式学习和归纳式学习
  10. ArcGIS学习笔记-1.功能-1.1裁剪