图形学初识--多边形剪裁算法

前言

前面一些章节主要针对各种矩阵变换,模型变换、视图变换、投影变换、屏幕空间变换等等!这一节咱们补充一下多边形剪裁算法的内容,主要讲解一下为什么需要,以及介绍二、三维下三角形裁剪的基本思路。

正文

为什么需要多边形剪裁算法?

以三角形为例,经过了视图变换和投影变换后,咱们已经将三角形所有的顶点坐标转换成了裁剪空间的坐标,咱们得目标只是为了获得 [ − 1 , 1 ] 3 [-1,1]^3 [1,1]3 包围盒内的顶点构成的三角形,但是必定有些三角形的顶点既有在立方体内部的,也有在外部的,这时候必定需要对其进行转化,从而变成内部的!

以二维举例:以下为三角形裁剪的示意图:

在这里插入图片描述

我们发现,其实二维下的三角形的顶点分支大致分为三类情况:

  • (1)三角形的三个顶点都在可视坐标范围内。这种情况不需要裁剪
  • (2)三角形的三个顶点既有可视坐标范围内,也有可视范围外。这种情况就是裁剪算法发挥的地方!
  • (3)三角形的三个顶点都不在可视坐标范围内。这种情况不需要裁剪

我们发现上述的绿色三角形在可视范围内是一个类似楔形的四边形,这时候需要对其分割成两个三角形才行!其他更多情况,大家可自行画示意图理解即可!

前置知识

二维直线

直线方程:

二维空间下,直线方程一般有几种表达形式,如: y = k x + b , a x + b y − c = 0 y = kx+b, ax + by - c = 0 y=kx+b,ax+byc=0 等等,但是为了工程方面的应用,可以用向量进行表达,如下:
a x + b y = d ( a b ) ⋅ ( x y ) = d \begin{align} ax +by &= d\\ \begin{pmatrix} a\\b \end{pmatrix} \cdot \begin{pmatrix} x\\y \end{pmatrix}&=d \end{align} ax+by(ab)(xy)=d=d
n ⃗ = ( a b ) \vec{n} = \begin{pmatrix}a\\b\end{pmatrix} n =(ab) 且它为单位向量, p ⃗ = ( x y ) \vec{p}=\begin{pmatrix}x\\y\end{pmatrix} p =(xy),则带入上式可得: n ⃗ ⋅ p ⃗ = d \vec{n} \cdot \vec{p} = d n p =d

上式表达的本质,可理解为:所有满足向 n ⃗ \vec{n} n ​ 投影长度为d的点集合,示意图如下:

在这里插入图片描述

距离本质:

当d值变化时,表达的是沿着 n ⃗ \vec n n 方向滑动的变化情况,当 d > 0 d>0 d>0,往 n ⃗ \vec n n 指向的方向进行滑动,当 d < 0 d<0 d<0,往反方向滑动,当 d = = 0 d==0 d==0​ 时,则表达过原点的直线!如下图所示:

在这里插入图片描述

点和直线距离关系:

当我们将空间中任一点 p 0 = ( x 0 , y 0 ) p_0 = (x_0,y_0) p0=(x0,y0),带入上述方程,究竟代表什么含义呢?

其实我们得到的就是 p 0 p_0 p0 n ⃗ \vec n n 上的一个投影,具体如下:
n ⃗ ⋅ p ⃗ 0 − d > 0 ,则表示该点在直线的 n ⃗ 方向正侧 n ⃗ ⋅ p ⃗ 0 − d < 0 ,则表示该点在直线的 n ⃗ 方向反侧 n ⃗ ⋅ p ⃗ 0 − d = 0 ,则表示该点就在直线上 \vec n \cdot \vec p_0 - d > 0,则表示该点在直线的\vec n 方向正侧\\ \vec n \cdot \vec p_0 - d < 0,则表示该点在直线的\vec n 方向反侧\\ \vec n \cdot \vec p_0 - d = 0,则表示该点就在直线上\\ n p 0d>0,则表示该点在直线的n 方向正侧n p 0d<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值