相对于给定行坐标翻转像素集

Posted

技术标签:

【中文标题】相对于给定行坐标翻转像素集【英文标题】:flip set of pixels with respect to a given row coordinate 【发布时间】:2021-01-03 20:23:41 【问题描述】:

我正在尝试编写一个相对于给定行坐标翻转区域(表示为一组段)的程序。 我不太了解 C++,所以我遇到了一些错误,我不知道它们为什么会出现以及如何修复它们。 这是我到目前为止得到的:

struct Segment

    int row;
    int colStart;
    int colStop;
;

std::vector<Segment> FlipVertically(const std::vector<Segment>& region, const int flipRow)
    std::vector<Segment> vec, more, less;
    for (std::vector<Segment>::reverse_iterator it = region.rbegin(); it != region.rend(); ++it)
        if ((*it).row > flipRow)
                more.insert(more.begin(), *it);
            
        elseless.insert(less.begin(), *it);
        ;
    std::sort(more.begin(), more.end(), [](Segment const &a, Segment const &b)
        return a.row > b.row;
        );
    std::sort(less.begin(), less.end(), [](Segment const &a, Segment const &b)
        return a.row > b.row;
        );
    vec.insert(vec.end(), more.begin(), more.end());
    vec.insert(vec.end(), less.begin(), less.end());
    int counter = 1;
    int i = 0;
    while(i + 1 < vec.size())
        if (vec[i].row == vec[i + 1].row)
            vec[i].row = counter;
            
        else
            vec[i].row = counter;
            counter++;
        i++;
        
    vec.back().row = counter;    
    return vec;
    

该函数应返回从上到下行存储的段,并且从左到右列在同一行中。 它说while循环中有一个错误:有符号和无符号整数表达式之间的比较[-Wsign-compare]。 另外,我正在寻找改进算法的技巧,因为我觉得它不好,因为我在划分数据后做了两种分类。我在考虑是否可以在第一次迭代期间迭代区域并按照我想要的顺序放置 Segments,但无法找到方法。

【问题讨论】:

【参考方案1】:

这一行

   for (std::vector<Segment>::reverse_iterator it = region.rbegin(); it != region.rend(); ++it)

需要改成

   for (std::vector<Segment>::const_reverse_iterator it = region.rbegin(); it != region.rend(); ++it)

因为region 是一个const 容器。因此,在 const 容器上调用 begin/rbegin/end/rend 将为这些容器返回 const_...iterator_type...

但是,更好的是,使用auto 来简化。

for(auto it = region.rbegin(); it != region.rend(); ++it)

但是可以通过向前循环来修改整个第一个循环以加快速度

   for(auto const& value : region)
   
      if(value.row > flipRow)
      
         more.push_back(value);
      
      else
      
         less.push_back(value);
      
   

最后一点。你算法的第一部分

    std::vector<Segment> vec, more, less;
    for (std::vector<Segment>::reverse_iterator it = region.rbegin(); it != region.rend(); ++it)
        if ((*it).row > flipRow)
                more.insert(more.begin(), *it);
            
        elseless.insert(less.begin(), *it);
        ;
    std::sort(more.begin(), more.end(), [](Segment const &a, Segment const &b)
        return a.row > b.row;
        );
    std::sort(less.begin(), less.end(), [](Segment const &a, Segment const &b)
        return a.row > b.row;
        );
    vec.insert(vec.end(), more.begin(), more.end());
    vec.insert(vec.end(), less.begin(), less.end());

可以压缩成

   auto vec = region;
   std::sort(vec.begin(), vec.end(), [](Segment const& a, Segment const& b) 
      return a.row > b.row;
   );

此渲染使用flipRow 已过时。如果您认为需要 那么实施中可能存在另一个缺陷。

【讨论】:

第一个循环有一个标准库算法,称为std::partition_copy 我正在考虑提议std::partial_sort_copy,但代码看起来更混乱。

以上是关于相对于给定行坐标翻转像素集的主要内容,如果未能解决你的问题,请参考以下文章

如何从鼠标坐标转换为 TransformedBitmap 的像素坐标?

从坐标参考系中的多边形边界获取栅格中的像素坐标

给定一个图像,一个像素点和一个以像素为单位的半径。如何找到它创建的圆形边框的像素坐标

棋子翻转

给定相机参数,我如何找到从视图空间到像素坐标的转换?我的矩阵有啥问题?

jquery几种获取元素left方式的异同