c ++更改坐标(像素1920 x 1080至640 x 480)

里卡多

我正在开发一个小程序,可以在不同的视频模式下绘制矩形(例如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值:576
y值:243

预期结果:

x值:640
y值:480

如何执行正确的操作?只是在改变基础吗?我应该只扩展还是进行转换操作?

哇,既然有人督促我,让我在这里解释最重要的风格改进:

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

    pixel = transform(pixel); // the optimizer will see right through this
    
  • 创建TransformMatrix一个可调用对象(通过代替transformasoperator()实现。这样,您可以简单地将其用作函数,例如在算法中:

     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)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

已更新至Ubuntu 14.04 LTS。屏幕尺寸在Dell Dimension C521上停留在640x480

来自分类Dev

640x480 JPEG的最大尺寸是多少?

来自分类Dev

Ubuntu中的低分辨率VGA显示器(640x480或480p)

来自分类Dev

Android:MediaCodec:在Nexus上以480x480分辨率生成的视频质量不好,而640x640效果很好

来自分类Dev

5.7英寸640x480 LCD GUI设计安卓

来自分类Dev

Android:摄像头帧分辨率大于640x480

来自分类Dev

如何在Wine中正常运行仅640x480的游戏?

来自分类Dev

即使安装了来宾添加,VM分辨率也不能超过640x480

来自分类Dev

为什么Nvidia的最大分辨率为640x480?

来自分类Dev

Ubuntu 14.04卡在640x480分辨率下

来自分类Dev

为什么关闭游戏时屏幕分辨率仍为640x480?

来自分类Dev

IMFMediaEngine始终使用DirectComposition在640x480中运行

来自分类Dev

Ubuntu桌面安装在640x480显示器上

来自分类Dev

无法强制Debian以640x480帧分辨率启动

来自分类Dev

卡在640x480上-并排运行Nouveau和nVidia图形驱动程序?

来自分类Dev

安装时显示分辨率停留在 640x480

来自分类Dev

卡在 640x480 - 并排运行 Nouveau 和 nVidia 图形驱动程序?

来自分类Dev

Ubuntu 20.04 640x480 Radeon 5700 xt 上的 AOC G2460PG

来自分类Dev

在 Ubuntu 20.0.4.1 LTS 上重新启动后卡在 640x480

来自分类Dev

安装Windows XP SP2后无法将视频分辨率设置为640x480以上

来自分类Dev

Nvidia 驱动程序在更新后重置,现在监视器“未知”并停留在 640x480

来自分类Dev

Google Chrome 1920x1080问题?

来自分类Dev

psd 转 html 1920X1080

来自分类Dev

如果我的笔记本电脑有 1280x800p,为什么可用的最大分辨率是 640x480?

来自分类Dev

如何将分辨率更改为1920 x 1080?

来自分类Dev

facebook4j如何获取PictureURL尺寸为480x480?

来自分类Dev

为WVGA(480 x 800)mdpi屏幕设计

来自分类Dev

了解相机,使其适合480x800

来自分类Dev

iOS视图停留在320 x 480

Related 相关文章

  1. 1

    已更新至Ubuntu 14.04 LTS。屏幕尺寸在Dell Dimension C521上停留在640x480

  2. 2

    640x480 JPEG的最大尺寸是多少?

  3. 3

    Ubuntu中的低分辨率VGA显示器(640x480或480p)

  4. 4

    Android:MediaCodec:在Nexus上以480x480分辨率生成的视频质量不好,而640x640效果很好

  5. 5

    5.7英寸640x480 LCD GUI设计安卓

  6. 6

    Android:摄像头帧分辨率大于640x480

  7. 7

    如何在Wine中正常运行仅640x480的游戏?

  8. 8

    即使安装了来宾添加,VM分辨率也不能超过640x480

  9. 9

    为什么Nvidia的最大分辨率为640x480?

  10. 10

    Ubuntu 14.04卡在640x480分辨率下

  11. 11

    为什么关闭游戏时屏幕分辨率仍为640x480?

  12. 12

    IMFMediaEngine始终使用DirectComposition在640x480中运行

  13. 13

    Ubuntu桌面安装在640x480显示器上

  14. 14

    无法强制Debian以640x480帧分辨率启动

  15. 15

    卡在640x480上-并排运行Nouveau和nVidia图形驱动程序?

  16. 16

    安装时显示分辨率停留在 640x480

  17. 17

    卡在 640x480 - 并排运行 Nouveau 和 nVidia 图形驱动程序?

  18. 18

    Ubuntu 20.04 640x480 Radeon 5700 xt 上的 AOC G2460PG

  19. 19

    在 Ubuntu 20.0.4.1 LTS 上重新启动后卡在 640x480

  20. 20

    安装Windows XP SP2后无法将视频分辨率设置为640x480以上

  21. 21

    Nvidia 驱动程序在更新后重置,现在监视器“未知”并停留在 640x480

  22. 22

    Google Chrome 1920x1080问题?

  23. 23

    psd 转 html 1920X1080

  24. 24

    如果我的笔记本电脑有 1280x800p,为什么可用的最大分辨率是 640x480?

  25. 25

    如何将分辨率更改为1920 x 1080?

  26. 26

    facebook4j如何获取PictureURL尺寸为480x480?

  27. 27

    为WVGA(480 x 800)mdpi屏幕设计

  28. 28

    了解相机,使其适合480x800

  29. 29

    iOS视图停留在320 x 480

热门标签

归档