gpt4 book ai didi

c++ 改变坐标(像素 1920 x 1080 到 640 x 480)

转载 作者:行者123 更新时间:2023-11-30 01:50:42 26 4
gpt4 key购买 nike

我正在开发一个小程序,可以在不同的视频模式下绘制一个矩形(例如 1920 x 1080 -> 640 x 480)。我可以调整矩形的大小。但是我被卡住了,因为我找不到一个明确的方法来解决这个问题。我目前正在尝试创建一个矩阵来对像素执行缩放操作,但我无法得到正确的答案。部分问题似乎是 TransformMatrix::transform 未正确缩放。

#include <iostream>


typedef struct _Pixel
{
_Pixel():X(1920)
,Y(1080)
{}
unsigned X;
unsigned Y;
}Pixel;

typedef struct TransformMatrix
{
constexpr TransformMatrix(const float aWeigth = 0.3f
,const float aHeigth = 0.225f):W(aWeigth)
,H(aHeigth)
{}
void transform( const Pixel & aPixel)
{
auto x_value=static_cast<float>(aPixel.X)*W;
auto y_value=static_cast<float>(aPixel.Y)*H;

std::cout<<"x_value: "<<x_value<<std::endl;
std::cout<<"y_value: "<<y_value<<std::endl;

}
const float W;
const float H;

}TransformMatrix;

int main()
{
Pixel aPixel;
TransformMatrix _TransformMatrix;
_TransformMatrix.transform(aPixel);
return 0;
}

实际结果:

x_value: 576
y_value: 243

预期结果:

x_value: 640
y_value: 480

我怎样才能执行正确的操作?只是基础的改变吗?我应该只扩展还是同时进行转换操作?

最佳答案

好吧,既然有人催我,我就在这里解释一下最重要的样式改进:

  • 命名:不要以下划线开头:这是非法的,程序会调用未定义的行为
  • 结构标签:它们属于 C ,并且从 C++98 开始就在 C++ 中过时了
  • 单一职责原则 - 不要让转换函数打印东西
  • 使 Pixel 结构能够自行打印(对 iostream 使用 operator<<)
  • 纯函数:make transform返回修改后的值,而不是改变参数。一般来说,这会使代码更安全,并且可以启用一类优化。在极少数情况下,您想就地更新像素,您只需编写

    pixel = transform(pixel); // the optimizer will see right through this
  • 制作TransformMatrix一个可调用对象(通过将 transform 实现为 operator() 而不是。这样,您可以简单地将它用作函数,例如在算法中:

     std::vector<Pixel> poly1, poly2;
    std::transform(poly1.begin(), poly1.end(),
    back_inserter(poly2), TransformMatrix());

    它只是将 poly1 中的所有像素转换为 poly2。

读者练习:姓名TransformMatrix所以它照它说的去做。现在,它更像是 ScalePixel

Live On Coliru

#include <iostream>

struct Pixel {
Pixel(unsigned x = 1920, unsigned y = 1080) : X(x), Y(y) {}
unsigned X;
unsigned Y;

friend std::ostream& operator<<(std::ostream& os, Pixel const& p) {
return os << "Pixel(" << p.X << ", " << p.Y << ")";
}
};

struct TransformMatrix {
constexpr TransformMatrix(float aWidth = 640/1920.f, float aHeigth = 480/1080.f) : W(aWidth), H(aHeigth) {}

Pixel operator()(const Pixel &aPixel) const {
return { static_cast<unsigned>(aPixel.X * W), static_cast<unsigned>(aPixel.Y * H) };
}
float W;
float H;
};

int main() {
Pixel aPixel;
TransformMatrix xfrm;

std::cout << aPixel << " -> " << xfrm(aPixel) << "\n";
}

打印:

Pixel(1920, 1080) -> Pixel(640, 480)

关于c++ 改变坐标(像素 1920 x 1080 到 640 x 480),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27112867/

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