浏览量:567

3.1. 线性对象简介

本篇文章禁止用于任何商业目的,版权申明、版本说明等见《前言》。

PDF文档和源码下载地址:https://github.com/twinklingstar20/Programmers_Computational_Geometry

3.1. 线性对象简介

3.1.1. 二维空间

二维空间下的线性对象包括:直线、射线、线段。直线可以用参数方程表示:

\[L(t) = P + t\vec d,t \in \left( { – \infty , + \infty } \right) \tag{3.1}\]

\(P\)表示直线上的点,向量\(\vec d = ({d_x},{d_y})\)表示直线的方向,通常情况下,直线参数方程采用这种方法来定义。如图3.1(a)所示,将直线的方向沿着逆时针方向旋转90度,就得到法向量\(\vec n = ( – {d_y},{d_x})\),另外一种采用法向量的直线定义方法,称为法线形式,表达式是

\[\vec n \cdot X + d = 0 \tag{3.2}\]

其中,\(d = – \vec n \cdot P\),把向量\(\vec n\)和变量\(X\)分解开来,就是我们最常看到的直线的表达式了

\[{\rm{a}}x + by + d = 0 \tag{3.3}\]

直线把二维空间分为两半,直线的法线所在的半平面称为直线的正半面(Positive Side),正半面上的点可以满足不等式(3.4);另一个半平面叫做直线的负半面(Negative Side),负半面上的点满足不等式(3.5):

\[\vec n \cdot P + d \succ 0 \tag{3.4}\]

\[\vec n \cdot P + d \prec 0 \tag{3.5}\]

求直线的法向量,采用顺时针旋转90,还是逆时针旋转90,得根据具体的情况而定。如果是顺时针旋转90,则采用等式(3.6);如果是逆时针旋转90,则采用等式(3.7)。

\[\vec n = ({d_y}, – {d_x}) \tag{3.6}\]

\[\vec n = ( – {d_y},{d_x}) \tag{3.7}\]

2015-3-22 15-27-31

图3.1 二维直线、射线和线段

射线的参数方程也可以使用等式(3.1)来表示,只是对\(t\)的限制范围不同,射线的参数方程式中,要求\(t \in [0, + \infty )\),如图3.1(b)所示。

线段用两个端点\({P_0},{P_1}\)来表示,如图3.1(c)所示,它的参数方程可以用(3.8)表示,与等式(3.1)类似。

\[S(t) = {P_0} + ({P_1} – {P_0})t,t \in \left[ {0,1} \right] \tag{3.8}\]

对于线性对象的实现,可以参见方程(3.1),用一个基点和方向向量来表示二维直线和二维射线,根据需要确定向量是否需要进行归一化处理。个人建议,采用归一化更合适些,主要有两个原因:

  1. 很多与直线、射线相关算法,都需要除以方向向量的长度,归一化的方向向量长度为1,可以避免除法运算;
  2. 在判断两个向量的夹角是否为0的问题中,归一化的方向向量可以很好的避免由于向量长度过小引起的错误,具体可以参见第3.5.1节。

3.1.2. 三维空间

三维空间下的线性对象包括:直线、射线、线段。与二维直线类似,三维直线也可以用参数方程表示为:

\[L(t) = P + t\vec d,t \in ( – \infty , + \infty ) \tag{3.9}\]

向量\(\vec d = ({d_x},{d_y},{d_z})\)表示直线的方向。三维射线也可以采用等式(3.9)来表示,不同的是对参数\(t\)的限制,\(t \in [0, + \infty )\]。线段也可以采用参数方程的形式来表示,例如线段\(\overline {{P_0}{P_1}} \)就可以采用等式(3.10)所示的参数方程:

\[L(t) = {P_0} + t\vec d,\vec d = {P_1} – {P_0},t \in [0,1] \tag{3.10}\]

spacer

Leave a reply