透视和双线性变换

时间:2010-07-17 20:30:38

标签: c++ c algorithm graphics vector

我正在制作矢量绘图应用程序并注意到Anti Grain Geometry有一个例子可以完全符合我的要求。 http://www.antigrain.com/demo/index.html然后在下面有一个关于Win32透视的示例。我不明白他们的cpp文件。基于这个例子。如果我有一堆顶点形成一个对象,就像他们的狮子一样,然后我有4个顶点作为控制点,我怎么能实现它们的效果呢?那么,我对每个点应用什么转换?

由于

2 个答案:

答案 0 :(得分:1)

你在谈论从2D平面到空间正方形的透视转换我认为。

嗯 - 这个并不难。数学在论文中解释:

  赫克伯特,保罗,基本原理   纹理映射和图像变形,   硕士论文,UCB / CSD 89/516,CS   英国分部伯克利,1989年6月。

(由于版权原因,我没有链接到论文。它可以在网上找到,但你不应该在找到它时遇到任何问题)

这为您提供了数学和一些随时可用的方程式。

如果您正在寻找一些“易于翻录”的代码,我建议您下载OpenVG参考实现并仔细查看函数“vguComputeWarpQuadToSquare”,“vguComputeWarpSquareToQuad”和“vguComputeWarpQuadToQuad”:-)它们涵盖了您需要的所有内容

在此处下载:http://www.khronos.org/registry/vg/ri/openvg-1.1-ri.zip

这些函数将计算进行转换的3x3矩阵。要使用此矩阵,您必须将2D坐标扩展为2D同质坐标。那不是那个很难但超出了问题的范围。如果您需要帮助来与他们合作,我建议您在另一个问题中提出这个问题。

答案 1 :(得分:1)

从您发布的那个页面,有一个指向源的链接 码。我将在

中解释双线性变换

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值。说你有参考 矩形r1,r2,r3,r4,你要映射到(0,0),(1,0),(0,1), (1,1)(或某些图像坐标系)。

对于a,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分解 一次,并解决两个未知的向量)。那么系数就是 应用于将矩形的内部映射到中的位置 矩形。

如果你有任何机会寻找逆变换,那就是 如果你想知道给定像素落在哪里,你只需切换 输入和输出:

对于a,b,c,d:

r1_x = a * 0 + b * 0 * 0 + c * 0 + d
r2_x = a * 1 + b * 1 * 0 + c * 0 + d
r3_x = a * 0 + b * 0 * 1 + c * 1 + d
r4_x = a * 1 + b * 1 * 1 + c * 1 + d

对于e,f,g,h:

r1_y = e * 0 + f * 0 * 0 + g * 0 + h
r2_y = e * 1 + f * 1 * 0 + g * 0 + h
r3_y = e * 0 + f * 0 * 1 + g * 1 + h
r4_y = e * 0 + f * 0 * 1 + g * 1 + h