簡體   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