Algorithm 在计算几何中表示垂直线的好方法? 我最近一直在从事C++计算几何相关的项目,并决定尝试编写我自己的几何类/结构和函数,作为理解计算几何中的事物的一种实践。

Algorithm 在计算几何中表示垂直线的好方法? 我最近一直在从事C++计算几何相关的项目,并决定尝试编写我自己的几何类/结构和函数,作为理解计算几何中的事物的一种实践。,algorithm,geometry,structure,line,Algorithm,Geometry,Structure,Line,当我第一次开始时,我用斜率和y截距表示一条线,记住一般方程y=mx+c。很快我就意识到用这样的方式表示垂直线是行不通的。作为一种快速修复方法,我决定包括一个布尔值is_vertical以及另一个字段vertical_x,用于垂直线x轴上的位置,该位置仅用于is_vertical为true 虽然这种方法目前仍然有效,但在使用上述指定的二维线表示法时,必须编写额外的代码来处理垂直条件会变得相当乏味。有没有更好的方法来表示垂直线,或者计算几何中的一般线?在计算机几何中有很多方法来表示线 两种主要方法:

当我第一次开始时,我用斜率和y截距表示一条线,记住一般方程y=mx+c。很快我就意识到用这样的方式表示垂直线是行不通的。作为一种快速修复方法,我决定包括一个布尔值is_vertical以及另一个字段vertical_x,用于垂直线x轴上的位置,该位置仅用于is_vertical为true


虽然这种方法目前仍然有效,但在使用上述指定的二维线表示法时,必须编写额外的代码来处理垂直条件会变得相当乏味。有没有更好的方法来表示垂直线,或者计算几何中的一般线?

在计算机几何中有很多方法来表示线

两种主要方法:

如评论中所述,直线的一般方程为

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)
请注意,归一化方向向量的分量基本上是OX和直线之间Fi角的余弦和正弦

直线上的任何点都可以使用参数t来描述

还有一种使用较少的ρθ定义,它只需要两个标量参数来定义任何直线-从坐标原点到直线的法线距离以及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

由于可以有所有这些不同的表示,在面向对象程序中处理行的一种方法是编写一个虚拟类行,然后编写几个子类GeneralEquationLine、VerticalLine、NonVerticalLine、ParameterRepresentationLine等

大多数处理行的函数不需要知道行在内部是如何表示的,所以它们需要类Line的对象。一些函数可能特定于非垂直线,因此需要非垂直线类的对象,或者,类线可能有一个返回true或false的isVertical方法


如果可能的话,您还可以编写函数将子类的实例转换为另一个实例。

使用一般公式ax+by=c,a²+b²≠ 0?嗯?对于Ax+Buby=C,如果A=0,则行为水平,如果B=0,则垂直为直线。问题不涉及C++、算法或类。如果你用笔和纸做数学,你会面临同样的问题
x * Sin(Theta) - y * Cos(Theta) + p = 0