平面在数学上的定义是,平面,是指面上任意两点的连线整个落在此面上。

在现实生活中你很容易一眼看出什么平面,但是在计算机的程序里,你将如何表示一个平面的呢?

又是怎么样求点到平面的距离?

判断点在平面的正面还是反面?

线与平面的交点又是怎么求出来的呢?

这篇文章就简单讨论这么几个问题,本文代码有TypeScript所实现,看起来和其他面向对象语言一样,求点积叉积的方法不具体实现,如果有疑惑可以查看我之前的文章。

平面的定义

平面,我们可以通过一条法线和一个点来表示,这个点我们为了方便,就取法线的点, 由于知道法线,所以只有法线单位化,确定这个在法线方向的长度即可。平面方程就用单位长度的法向量和常数表示,在程序上就采用四个浮点数来表示。

我们都知道三个点(不在一条直线上的三个点)可以确定一个平面。下面代码就是输入三个点输出一个平面的表示。

function planeFromePoints(a:Vector3,b:Vector3,c:Vector3):Vector4{

//计算三个点构成的法向量

let normal = Vector3.cross(b-a,c-a).normalize();

//点a在法线上的投影长度

let d = Vector3.dot(normal,a);

let result = new Vector4(normal.x,normal.y,normal.z,d);

return result;

}

通过法线和一个点构造一个平面的代码更简单,我就不重复了。

点到平面的距离与关系

下面就回答问题2和3,这也是经常会出现在我们编码过程的问题。

先进行单位化平面,因为容易计算点到平面的有向距离。其实之前我们的函数已经单位化平面了,平面中的法向量为单位向量,n那么这个向量就称为单位化平面。

然后我们就可以利用如下代码极端三维空间中任意一个点与平面的有向距离:

function planeDistanceFromPoint(plane:Vector4, point:Vector3){

return (point.x*plane.x + point.y*plane.y + point.z*plane.z - plane.w);

}

最后,如果要判断一个点是在平面的正面、反面还是平面上,只要判断有向距离即可:

大于0是正面;

等于0是平面上;

小于0是反面。

线段与平面的关系

线段由起点和终点两个点决定,只要起点和终点到平面的有向距离,一个为正一个为负,就代表线段与平面相交,否则不相交。

射线与平面的交点

最后一个问题也很常见,在光线追踪里就可以碰到。

射线的表示方式为,一个方向单位向量D,还有一个起点O(式1)

p = O → + t ⋅ D → ( t ∈ ( 0 , ∞ ) ) p = \overrightarrow{O} + t\cdot \overrightarrow{D} (t \in(0, \infty))p=O+t⋅D(t∈(0,∞))

如果是直线线放开一下t的取值范围即可。

求射线的与平面的交点:

首先求出射线起点到平面的距离t,这个距离没有方向

t乘以方向向量,得到起点到交点的向量,在加上起点坐标,就是交点的坐标了

function RayIntersectPlane ( plane:Vector4, origin:Vector3, direction:Vector3 ) {

const denominator = plane.normal.dot( direction );

const t = -planeDistanceFromPoint( plane, origin)/denominator;

// denominator为正:代表射线与平面的法向量为同一方向

// 平面与起点的有向距离为正:代表起点在平面的正面

// 这样意味着射线在平面一侧

// 所以 t<0 代表 射线与平面没有交点

if ( t < 0 ) {

return null;

}

let target = new Vector3();

target.copy( direction ).multiplyScalar( t ).add( origin );

return target;

}

更多的信息大家可以去查看threejs数学库中的Plane类。

计算机图形数学知识,平面----计算机图形学的基础几何知识相关推荐

  1. 平面----计算机图形学的基础几何知识

    平面在数学上的定义是,平面,是指面上任意两点的连线整个落在此面上. 在现实生活中你很容易一眼看出什么平面,但是在计算机的程序里,你将如何表示一个平面的呢? 又是怎么样求点到平面的距离? 判断点在平面的 ...

  2. Games101计算机图形学入门基础之一:向量变换、矩阵变换、视图变换、欧拉角与四元数

    Games101计算机图形学入门基础之一:向量变换.矩阵变换.齐次坐标.欧拉角与四元数 目录 Games101计算机图形学入门基础之一:向量变换.矩阵变换.齐次坐标.欧拉角与四元数 前言 向量 向量加 ...

  3. Games101计算机图形学入门基础之二:光栅化

    Games101计算机图形学入门基础之二:光栅化 引言 三角形的离散化 采样 走样 走样带来的瑕疵 反走样 先模糊再采样 傅里叶变换 低通滤波 卷积 多重采样抗锯齿(超采样) 深度缓存 可见性与遮挡( ...

  4. [计算机图形学入门]9.几何

    目录 一.隐式几何 1.隐函数(一个简单的理解) 2.隐式几何 3.一些隐式的几何表示法 二.显式几何 1.显函数(一个简单的理解) 2.显式几何 3.一些显示表示的几何 三.曲线  --显示几何表示 ...

  5. 计算机所需要的数学基础知识,学计算机需要什么基础 数学不好能学计算机吗...

    计算机专业现在是非常热门的专业,那么学习计算机专业需要什么基础呢,数学不好能不能学习计算机呢,下面小编为大家分析一下,仅供大家参考. 学计算机需要的基础有什么 首先,先从打字开始,熟悉键盘,快速的打字 ...

  6. 计算机图形图像知识梳理,计算机图形学知识点总结

    第一章 计算机图形学概论 1. 比较计算机图形学与图象处理技术相同点和不同点. Computer Graphics(计算机图形学)和Computer Vision(计算机图像识别)是同一过程的两个方向 ...

  7. 计算机图形学应用基础考试,计算机图形学基础期末考试试题.docx

    计算机图形学基础期末考试试 题 一. 填空 1.将多 形外部一点 A 与某一点 B 用 段 接,若此 段与多 形 界相交的次数 ??????????, 点 B在多 形外部.若此 段与多 形 界相交的次 ...

  8. 计算机二级公共基础知识证书,计算机二级公共基础知识

    计算机二级公共基础知识 下面是小编收集整理的计算机二级公共基础知识,希望对您有所帮助!如果你觉得不错的话,欢迎分享! 第一章 数据结构与算法 1.1算法 算法:是指解题方案的准x而完整的描述. 算法不 ...

  9. 计算机二级基础知识 文库,计算机二级公共基础知识(全)

    计算机二级公共基础知识(全) 1.1 算法 考点1 算法的基本概念 计算机解题的过程实际上是在实施某种算法,这种算法称为计算机算法. 算法(algorithm)是一组严谨地定义运算顺序的规则,并且每一 ...

最新文章

  1. html5转apicloud,使用APICloud编写优雅的HTML5代码
  2. 面试准备3——相关知识
  3. git解决“failed to push some refs to“问题
  4. 零信任模型_关于信任模型
  5. php判断 二维数组中 是否 存在某个一维数组
  6. Selenium Web 自动化 - 项目实战(三)
  7. Sublime Text 常用环境和插件配置
  8. OpenResity + nginx + mysq配置
  9. html span 文字垂直居中,p标签中的span标签文字垂直居中对齐
  10. 思岚雷达rplidar S1配置调试全纪录
  11. 休闲娱乐 - 如何打坐
  12. 阿里企业邮箱产品优势、功能、版本介绍
  13. 手机显示服务器维护是啥意思,手机系统维护怎么解除_手机显示系统维护是什么意思_游戏吧...
  14. wgs84坐标格式转换度分秒_WGS84经纬度坐标转换到西安80高斯投影坐标。
  15. 2012年2月51CTO壁纸点评活动获奖名单【已结束】
  16. 计算机网络-学习笔记
  17. 昨天,我的大学学习[5]--转载自:www.cstc.net.cn
  18. Android数据存储(二)----PreferenceFragment详解
  19. Eigenvalue of random matrix
  20. postgresql 授权某个数据库的权限给test 账号 使该账号 只能操作指定DB 不能操作其他DB

热门文章

  1. 如何用Vue实现一个全选指令
  2. Firefox 检测到该服务器正在将此地址的请求循环重定向。     此问题可能是因为禁用或拒绝 Cookie 导致。...
  3. iOS中MVC等设计模式详解
  4. 转贴:匹配中文的正则表达式及其他
  5. ZZULIOJ 1109: 数根(函数专题)
  6. jq判断html加载完成,jquery – 检测页面是否已完成加载
  7. 信息学奥赛一本通 1100:金币 | 1969:【15NOIP普及组】金币 | OpenJudge NOI 1.5 45 | 洛谷 P2669 [NOIP2015 普及组] 金币
  8. 图论 —— 图的搜索
  9. 4.4.1 数据赋值
  10. python所有实验_python列表的小实验