繁体   English   中英

在计算几何中表示垂直线的好方法?

[英]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 = 0A非零并让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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM