為什麼用齊次座標

2021-10-04 00:21:52 字數 1727 閱讀 8791

定義:齊次座標就是將乙個原本是n維的向量用乙個n+1維向量來表示,是指乙個用於投影幾何裡的座標系統,如同用於歐氏幾何裡的笛卡兒座標一般。

(x, y) -> (x, y, 1)

(x, y, z) -> (x, y, z, 1)

齊次座標的使用能夠大大簡化在三維空間中的點線面表達方式和旋轉平移等操作,具體分如下幾點進行說明。

能非常方便的表達點在直線或在平面上

2d平面上,直線可用方程 ax + by + c = 0 表示,用向量表示一般記為:l = (a, b, c)t

點 p = (x, y) 在直線 l 上的充分必要條件是 ax + by + c = 0

使用齊次座標,點p的齊次座標是:p』 = (x, y, 1)

那麼 ax + by + c = 0 就可以使用兩個向量的內積(點乘)表示:

ax + by + c = (a, b, c)t(x, y, 1) = lt * p』 = 0

因此,點p在直線l上的充分必要條件就是直線l的向量與p的齊次座標p』的內積為零:

lt * p』 = 0

三維空間類似,點p在平面a上的充分必要條件是平面a與向量p的齊次座標p』的內積為零:

at * p』 = 0

方便表達直線與直線,平面與平面的交點

在齊次座標下,可以用兩個點p, q的齊次座標叉乘結果來表達一條直線l,也即是 l = p × q

也可以用兩條直線 l, m 的叉乘表示他們的交點 x,x = l × m

叉乘:兩個向量a和b的叉乘盡在三維空間中有定義,寫作a×b

a×b是與a和b都垂直的向量

其模長等於以兩個向量為邊的平行四邊形的面積

叉乘可以定義為:

a ×b

=∣∣a

∣∣∣∣

b∣∣s

in(θ

)e

→a × b = ||a||||b||sin(θ)\overrightarrow

a×b=∣∣

a∣∣∣

∣b∣∣

sin(

θ)e其中,θ表示a,b的夾角(0。到180。之間),||a||,||b||是向量的模長

e則是乙個與向量a,b所構成的平面垂直的單位向量

根據叉乘定義:

向量自身叉乘結果為0,因為夾角為0。也就是說三維向量 a x a =0, b x b = 0,而點乘(也稱點積,內積)的定義是a * b = ||a||* ||b|| * cos(θ)

根據定義:如果兩個向量垂直,cos(θ) = 0,點積也為0。

能夠區分乙個向量和乙個點

如果(x, y, z)是乙個點,則變為(x, y, z, 1)

如果(x, y, z)是乙個向量,則變為(x, y, z, 0)

能夠表達無窮遠

比如兩條平行的直線 ax + by + c = 0, ax + by + d = 0,

可以分別用向量 l = (a, b, c), m = (a, b, d)表示

根據前面直線交點的計算方法,其交點為 l×m

根據叉乘計算法則,可以得到 l×m = (d - c)( b, -a, 0),忽略標量(d-c),我們的到交點為(b, -a, 0),並且是齊次座標如果要轉化為非齊次座標,那麼會得到(b/0, a/0),座標是無窮大,可以認為該點為無窮遠。符合平行線相交於無窮遠的概念

更簡潔的表達歐式變換

使用非齊次座標

x』 = rx + t

使用齊次座標(x和』為齊次座標)

x』 = tx

為什麼使用齊次座標

按照通常使用的數學知識,二維平面上乙個點可以用它在x y方向上的座標來標示為 p x,y 但是在圖形學中偏偏要 畫蛇添足 的使用齊次座標,這樣我們必須使用乙個三維向量來表示乙個二維點即p x,y,w 最後乙個w就是那個 足 why?首先想像有個絕對不變的座標系,記為w,然後以w為參照,建立兩個座標系...

python為什麼用flask 為什麼用flask

flask是python在web開發領域乙個輕量級的框架,為什麼選擇flask呢?此文可能會給你答案。選擇flask的原因 1.微框架 簡潔 只做它需要做的,給開發展提供了很大的擴充套件性。2.flask和相關的依賴 jinja2 werkzeug 設計得非常優秀,用著簡單。3.開發效率非常高,比如...

為什麼用css sprites

在分析各個 的css時,我們經常可以看到一些 有很多的元素共享了一張背景,而這張背景包含了所有這些元素需要的背景,這種技術就叫做css sprites。例如 的css sprites url是 這樣做有什麼好處呢?顯而易見,瀏覽器在載入每一張的時候都會發起乙個http請求。如果使用css sprit...