2010-07-17 30 views
2

我正在做一个矢量绘图应用程序,并注意到反谷物几何有不正是我想要的例子。 http://www.antigrain.com/demo/index.html然后下面是Win32的透视示例。我不明白他们的cpp文件。基于这个例子。如果我有一堆顶点来形成一个对象,就像他们的狮子一样,然后我有4个顶点作为控制点,我怎么才能达到它们的效果?例如,我适用于每个点的转换是什么?视角和双线性变换

感谢

回答

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)(或图像坐标系)。

对于,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 
1

你说的是从2D平面在太空“我觉得透视变换到一个正方形。

好 - 这一个并不难。

Heckbert,保罗, 纹理映射的基本原理和图像变形, 硕士论文,UCB/CSD516分之89,CS 司,U.C.:数学在该文件解释伯克利,1989年6月

(我不链接到纸由于版权的原因,它是可在网络上,你不应该有任何问题,但发现它)

这给你数学和一些准备使用方程来做到这一点。

如果你正在寻找一些“易撕”的代码,我建议下载OpenVG的参考实现,并采取在功能“vguComputeWarpQuadToSquare”仔细看,“vguComputeWarpSquareToQuad”和“vguComputeWarpQuadToQuad” :-)他们涵盖了所有你需要。

这里下载:http://www.khronos.org/registry/vg/ri/openvg-1.1-ri.zip

这些功能将计算3x3矩阵,做了改造。要使用此矩阵,必须将2D坐标扩展为2D均匀坐标。这不是困难,但超出了问题的范围。如果您需要帮助与他们合作,我建议您以另一个问题提问。