2010-07-18 30 views
0

我問關於碧線性變換一個問題和接收這樣的回答:幫助瞭解這些方程?

從你發帖說非常頁,有對源代碼 的鏈接。我會解釋雙線性變換中

http://www.antigrain.com/__code/include/agg_trans_bilinear.h.html

這裏的想法是找到形式的轉變:

output_x = a * input_x + b * input_x * input_y + c * input_y + d 
output_y = e * input_x + f * input_x * input_y + g * input_y + h 

術語「雙線性」來自每個這些方程是線性的 其中任一個輸入座標本身。我們想要解決 a,b,c和d的正確值。假設您想要映射到的(0,0),(1,0),(0,1), (1,1)(或某個圖像座標系)。

對於,B,C,d:

0 = a * r1_x + b * r1_x * r1_y + c * r1_y + d 
1 = a * r2_x + b * r2_x * r2_y + c * r2_y + d 
0 = a * r3_x + b * r3_x * r3_y + c * r3_y + d 
1 = a * r4_x + b * r4_x * r4_y + c * r4_y + d 

爲E,F,G,H:

0 = e * r1_x + f * r1_x * r1_y + g * r1_y + h 
0 = e * r2_x + f * r2_x * r2_y + g * r2_y + h 
1 = e * r3_x + f * r3_x * r3_y + g * r3_y + h 
1 = e * r4_x + f * r4_x * r4_y + g * r4_y + h 

可以解決這個問題,但是你最喜歡的。 (如果你熟悉 矩陣符號,這些矩陣方程的矩陣 是相同的,然後你只需要找到LU分解 一次,並解決兩個未知的向量)。然後應用係數 將矩形的內部映射到矩形的 中的位置。


的問題是,我有input_x和input_y藏漢爲R1,R2,R3,R4,但我不知道如何實現output_x和output_y。我如何解決這樣一個等式?我只熟悉用兩個變量求解方程。

謝謝

回答

5

這是你找到的一個可怕的解釋。希望我能幫助你理解發動機蓋下發生了什麼。

你想要做的是將矩形區域(一個四邊形)映射到另一個(任意形狀)的四邊形。讓我們先從一個簡單的情況:直線​​插補(發現沿騙值)

如果你有從線到B,那麼你可以用這個公式計算髮現該線路上的任何一點「C」 :

c = ((1 - p) * a) + (p * b); 

這個'混合'(插值)兩個位置之間的直線(線性)的值。如果使用p = 0,則方程變爲

c = (1 * a) + (0 * b) = a 

因此在p = 0時,等式給出點'a'。

當p = 1時,該方程變爲:

c = (0 * a) + (1 * b) = b 

所以在P = 1時,方程給你點 'B'。

在p的中間值處,可以得到a和b之間的直線上的點。 (所以在p = 0.5時,你得到的點恰好在a和b之間)

因此,要將屏幕上的一行像素複製到屏幕上的另一行,我們可以使用線性插值來查找位置在讀取和寫入的行上。

for (float p = 0.0; p <= 1.0; p += 0.1) // copy 10 pixels from line 1 to line 2 
    DrawPixelOnLine2(p, GetPixelFromLine1(p)); 

這兩種方法只是將使用線性插值計算正確的位置讀取和繪製像素,這樣的:

int ax = 0, ay = 100, bx = 50, by = 170; // line a-b goes from (0,100) to (50,170) 

int px = ((1-p) * ax) + (p * bx);   // calc the x and y values separately 
int py = ((1-p) * ay) + (p * by); 

(請注意,我必須使用計算兩次做2D位置,我可以通過簡單地爲az/bz/pz座標添加相同的計算值來插入3D)

因此,現在您可以將點從一條任意直線複製到另一條直線。

雙線性插值是完全一樣的,只是我們想找到一個矩形內,而不是行內的一個點,所以我們需要兩個維度來描述,其中一點是在矩形(沿底部PX矩形的邊,並且在矩形的邊上)。現在,您可以使用(px,py)座標對定位矩形中的任意點。

要做上面的映射,我們只需要在兩個維度上進行線性插值計算:首先我們沿着底部和沿着頂部插入,以找到垂直通過矩形中間的一條線的兩個端點。然後我們沿着這條垂直線進行插值,找到矩形中間的最後一個點。

「矩形」不需要是矩形。這兩個尺寸可用於任何四邊形(即,您可以將矩形的角點移動到任意位置,並且方程仍然會找到角之間的位置以填充形狀所包圍的區域)

在你找到的例子中,作者用四個點來描述源的形狀(a,b,c,d),另外四個點用來描述目標形狀(e,f,g,h)

In此外,他們通過求解方程組來填充變換矩陣,使得計算更加高效,該變換矩陣可以與點相乘以進行映射過程。但是,效果與我上面描述的相同。希望我的解釋能讓你更容易「看到」方程式在做什麼。

0

如果要將矩形映射到另一個矩形,則需要進行簡單的線性變換。要將點r映射到點q,您需要:

qx = arx + bry + c 
qy = drx + ery + f

有6個變量,您需要6個方程(3分)。到矩形r映射到矩形問:

q1x = a*r1x + b*r1y + c 
q1y = d*r1x + e*r1y + f 
q2x = a*r2x + b*r2y + c 
q2y = d*r2x + e*r2y + f 
q3x = a*r3x + b*r3y + c 
q3y = d*r3x + e*r3y + f

從上面你必須解決2個系統3個的線性方程組,每3個變量。只要點不同並且不共線(只要矩形拐角滿足),它們就會有1個解。