gpt4 book ai didi

c++ - 问题反转二维矩阵

转载 作者:行者123 更新时间:2023-11-30 03:48:28 28 4
gpt4 key购买 nike

我正在研究类中的一个函数来存储图像。此函数的目的是使用 2D 矩阵执行线性变换(我不打算支持翻译)。我想做的是测试转换原始图像角的坐标,并使用极值来计算生成的转换图像的必要大小。

我有一张新图像,我想遍历新图像中的所有像素并使用逆变换计算新像素应从原始图像的何处获取颜色(使用双线性插值)。

我开始编写以下函数。它还没有对图像做任何事情。问题是,当我通过变换函数传递一组坐标,然后通过反函数传递这些新坐标时,我希望得到原始值。但是我没有取回原始值。

Image Image::matrix_transform(float m11, float m12, float m21, float m22) const
{
float det = m11 * m22 - m12 * m21;
img_assert(det, "Matrix not invertible.");

//inverse matrix values
float im11 = m22 / det;
float im22 = m11 / det;
float im21 = -m21 / det;
float im12 = -m12 / det;

//transformation
const auto t = [m11, m12, m21, m22](float& x, float& y)
{
x = x * m11 + y * m12;
y = x * m21 + y * m22;
};

//inverse
const auto ti = [im11, im12, im21, im22](float& x, float& y)
{
x = x * im11 + y * im12;
y = x * im21 + y * im22;
};

float x00 = 0.0f, y00 = 0.0f;
float x11 = w, y11 = h;
float x10 = 0.0f, y10 = h;
float x01 = w, y01 = 0.0f;

std::cout << x00 << " " << y00 << std::endl;
std::cout << x01 << " " << y01 << std::endl;
std::cout << x10 << " " << y10 << std::endl;
std::cout << x11 << " " << y11 << std::endl;

t(x00, y00);
t(x11, y11);
t(x10, y10);
t(x01, y01);

ti(x00, y00);
ti(x11, y11);
ti(x10, y10);
ti(x01, y01);

std::cout << x00 << " " << y00 << std::endl;
std::cout << x01 << " " << y01 << std::endl;
std::cout << x10 << " " << y10 << std::endl;
std::cout << x11 << " " << y11 << std::endl;

return *this;
}

这是我调用函数的方式(一个简单的旋转矩阵)。

img.matrix_transform(cos(angle), -sin(angle), sin(angle), cos(angle));

这是我得到的输出...

0 0
2500 0
0 1655
2500 1655


0 0
1975.95 -722.386
-743.978 629.455
1231.97 -92.9314

我期望顶部的一组坐标与底部的坐标相匹配。

最佳答案

这里

    x = x * m11 + y * m12;
y = x * m21 + y * m22;

第二个赋值使用已经修改过的 x 值。改成

    auto newx = x * m11 + y * m12;
y = x * m21 + y * m22;
x = newx;

关于c++ - 问题反转二维矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33217882/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com