[英]Good way to represent a vertical lines in computational geometry?
我最近一直在用 C++ 做一个计算几何相关的项目,并决定尝试编写我自己的几何类/结构和函数,作为理解计算几何如何工作的实践。
刚开始时,我用斜率和 y 截距表示一条线(记住一般方程y = mx + c
)。 很快我意识到像这样表示垂直线并不能真正奏效。 作为一种快速修复,我决定包含一个布尔值is_vertical
以及另一个字段vertical_x
(用于垂直线的 x 轴上的位置),它只被使用is_vertical
为真。
虽然这种方法目前有效,但在使用上面指定的 2d 线表示时,必须编写额外的代码来处理垂直条件,这变得非常乏味。 有没有一种好的/更好的方法来表示计算几何中的垂直线或一般的线?
有很多方法可以表示计算机几何中的线。
两种主要方法:
正如评论中所说,线的一般方程是
a * x + b * y - c = 0
如果你有两个点来定义一条线,那么系数是
a = (y1 - y2)
b = (x2 - x1)
c = (x2 * y1 - x1 * y2)
这种形式也便于确定 - 某个点属于线的哪一侧,以及用于查找线点距离。
参数方法也被广泛使用。 线由基点和方向向量定义
Base = P1
Dir = P2 - P1 (mignt be normalized to get unit length)
请注意,归一化方向矢量的分量本质上是 Fi 的余弦和正弦 - OX 和线之间的角度。
线上的任何点都可以使用参数t
来描述
X(t) = X1 + t * Dir.X
Y(t) = Y1 + t * Dir.Y
还有一个较少使用的Rho-Theta定义,它只需要两个标量参数来定义任何线 - 从坐标原点到线的法线距离以及 OX 与该法线之间的角度:
x * Sin(Theta) - y * Cos(Theta) + p = 0
正如 Mbo 在他们的回答中指出的那样,有几种不同的方法可以用方程来表示直线。
一条线的一般方程的形式为A * x + B * y = C
。
如果您知道一条线不是垂直的,那么您可以使用简化形式y = a * x + C
(通过注意到B
非零并让a = - A/B
从前面的等式中获得)。
如果您知道一条线是垂直的,则可以使用简化形式x = c
(注意B = 0
且A
非零并让c = C/A
)。
如果您知道一条线不是水平线,那么您可以使用简化形式x = b * y + C
。
如果您知道一条线是水平的,那么您可以使用简化形式y = c
。
由于您可以拥有所有这些不同的表示,因此在面向对象的程序中处理 line 的一种方法是编写一个虚拟类Line
,然后编写几个子类 GeneralEquationLine、VerticalLine、NonVerticalLine、ParametricRepresentationLine 等。
大多数处理线条的函数不需要知道线条在内部是如何表示的,因此它们需要一个Line
类的对象。 一些函数可能特定于非垂直线,因此需要类 NonVerticalLine 的对象(或者,类Line
可能有一个返回 true 或 false 的方法isVertical
)。
如果可能,您还可以编写函数将子类的实例转换为另一个实例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.