[英]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.