球面坐标系与三角函数 Spherical Coordinates and Trigonometric Functions
计算机图形学数学基础译自 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.直角坐标系(笛卡儿坐标系) 坐标系:O-XY 点M(x,y),x为横坐标,y为纵坐标. 在Ⅰ.Ⅱ.Ⅲ.Ⅳ四个象限中坐标x,y的符号为: 象限 Ⅰ Ⅱ Ⅲ Ⅳ x + ...
- 球面坐标系下的三重积分
涉及知识点 三重积分 球面坐标系 点火公式 一些常见积分处理手法 球面坐标系定义 球面坐标系由方位角φ\varphiφ.仰角θ\thetaθ和距离rrr构成 直角坐标系(x,y,z)(x,y,z)(x ...
- mysql象限和投影_PostGIS空间数据库SRID背景知识 - 地理坐标系(球面坐标系)和投影坐标系(平面坐标系) - GIS开发者...
背景 背景知识和坐标系有关. 什么是地理坐标系,什么是投影坐标系? 参考此文: 原文 1.首先理解地理坐标系(Geographic coordinate system),Geographic coor ...
- python计算球坐标系的积分_python – n球面坐标系到笛卡尔坐标系
您可以通过记忆中间产品来加速您的原始代码,即 def ct_dynamic(r,alpha): """alpha: the n-2 values between [0,2 ...
- python笛卡尔坐标系_python – n球面坐标系到笛卡尔坐标系
您可以通过记忆中间产品来加速您的原始代码,即 def ct_dynamic(r, alpha): """alpha: the n-2 values between [0, ...
- 三重积分的球面坐标系的体积元素表示
- 三角函数(trigonometric function)
三角函数定义(摘自维基百科): 三角函数(英语:Trigonometric functions)是数学中常见的一类关于角度的函数.三角函数将直角三角形的内角和它的两个边的比值相关联,也可以等价地用与单 ...
- c+ +三角函数_C ++中的三角函数
c+ +三角函数 C ++三角函数 (C++ Trigonometric functions) Trigonometric functions are also called circular fun ...
- [转载] python中三角函数_Python中的三角函数
参考链接: Python | type()函数 python中三角函数 Python三角函数/方法 (Python Trigonometric functions/methods) In python ...
- android 球面 旋转 坐标系,天球坐标系和地球坐标系-GPS定位原理及应用-电子发烧友网站...
2.1.1天球坐标系 天球坐标系是利用基本星历表的数据把基本坐标系固定在天球上,星历表中列出一定数量的恒星在某历元的天体赤道坐标值,以及由于岁差和自转共同影响而产生的坐标变化.常用的天球坐标系:天球赤 ...
最新文章
- 前端JavaScripts基础知识点讲义代码
- JS-事件内置对象event
- 数据结构实验之栈三:后缀式求值
- 浏览器与硬件交互的方法_【第2058期】现代浏览器内部揭秘之一
- 80-600-020-原理-存储引擎-简介
- Linux系统、版本、CPU、内存查看、硬盘空间
- swift5 decimal 转换为String 并制定小数点位数
- [5-24]绿色精品软件每天更新[uc23整理]
- Windows 安装redis 教程
- ES6新语法-day02
- 致远V8.1 协同 最新版
- Ubertooth one“蓝牙扫描嗅探”使用教程
- Ubuntu 老版本下载
- 1016C. Vasya And The Mushrooms
- 计算机网络共经历了四代,计算机经历了四代的发展,其中第三代计算机的主要组成部件是...
- VMware15安装MAC 解锁
- 西瓜书读书笔记整理(二)—— 第一章 绪论
- 如何抓取豆瓣网电影海报信息及重命名
- linux pwm 调屏_PWM调光方法在LED亮度调节中的应用
- anydesk远程计算机,利用AnyDesk远程协助解决问题
热门文章
- c++ primer plus 第十四章 C++中的代码重用
- 企业管理系统各主要模块简介
- 用拉格朗日插值法,牛顿插值和分段线性插值计算近似值
- Iptables实现 DMZ 区域的服务器简单的发布策略
- special effects - 樱花飘落背景特效
- 智能泊车技术及现状详解
- html如何解决412问题,网站412怎么解决?
- r语言如何计算t分布临界值_医学统计与R语言:四格表卡方还需要连续校正吗?...
- 理解直推式学习和归纳式学习
- ArcGIS学习笔记-1.功能-1.1裁剪