【问题标题】:Perspective and Bilinear transformations透视和双线性变换
【发布时间】:2010-07-17 20:30:38
【问题描述】:

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

谢谢

【问题讨论】:

    标签: c++ c algorithm graphics vector


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      我认为您是在谈论从 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 齐次坐标。这不是那么困难,但超出了问题的范围。如果您在与他们合作时需要帮助,我建议您在另一个问题中提出。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-06
        • 2018-03-02
        • 2012-12-20
        • 2014-09-07
        • 2019-01-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多