1. 翻转
如上所示一根线,其中红色位置表示的是baseLine位置,上面是一根线baseLine不同的时候进行翻转的情况,
代码上怎么处理,当前想到的一种比较好的方式,下面是代码片段:
if (bInvert != m_bInverFlag)
{
m_bInverFlag = bInvert;
int i_base_up_pt_num = iBaseLineLoc;
int i_base_dn_pt_num = iPointNum - iBaseLineLoc;
std::vector<uint8_t> v_base_up_pts(i_base_up_pt_num, 0);
std::vector<uint8_t> v_base_dn_pts(i_base_dn_pt_num, 0);
for (int i = 0; i < iLineNum; ++i)
{
auto p_cur_line = pu8Src + i * iPointNum;
// 基线上面数据
memcpy(v_base_up_pts.data(), p_cur_line, v_base_up_pts.size());
// 基线下面数据
memcpy(v_base_dn_pts.data(), p_cur_line + iBaseLineLoc, v_base_dn_pts.size());
// 逆序数据
std::reverse(v_base_up_pts.begin(), v_base_up_pts.end());
std::reverse(v_base_dn_pts.begin(), v_base_dn_pts.end());
std::vector<uint8_t> v_inver_line = v_base_up_pts;
v_inver_line.insert(v_inver_line.end(), v_base_dn_pts.begin(), v_base_dn_pts.end());
int i_start = iBaseLineLoc + 1;
int i_end = i_start + iPointNum;
for (int i = i_start; i < i_end; ++i)
{
p_cur_line[i % iPointNum] = v_inver_line[i - i_start];
}
}
}
2. 平移
平移类似上图所示,在一个基线位置的基础上再进行平移处理,处理逻辑代码片段:
// 基线处理
if (iBaseLineLoc != m_iBaseLineLoc)
{
std::vector<uint8_t> v_tmp;
std::vector<uint8_t> v_src_line(iPointNum, 0);
if (iBaseLineLoc > m_iBaseLineLoc) // 向下平移时
{
int i_move_size = iBaseLineLoc - m_iBaseLineLoc;// 平移距离
int i_data_size = iPointNum - i_move_size;
v_tmp.resize(i_move_size);
for (int i = 0; i < iLineNum; ++i)
{
auto p_cur_line = pu8Src + i * iPointNum;
memcpy(v_tmp.data(), p_cur_line + i_data_size, v_tmp.size());
memcpy(v_src_line.data(), p_cur_line, iPointNum);
memcpy(p_cur_line + i_move_size, v_src_line.data(), i_data_size);
memcpy(p_cur_line, v_tmp.data(), v_tmp.size());
}
}
else // 向上平移
{
int i_move_size = m_iBaseLineLoc - iBaseLineLoc;// 平移距离
int i_data_size = iPointNum - i_move_size;
v_tmp.resize(i_move_size);
for (int i = 0; i < iLineNum; ++i)
{
auto p_cur_line = pu8Src + i * iPointNum;
memcpy(v_tmp.data(), p_cur_line, v_tmp.size());
memmove(p_cur_line, p_cur_line + i_move_size, i_data_size);
memcpy(p_cur_line + i_data_size, v_tmp.data(), v_tmp.size());
}
}
m_iBaseLineLoc = iBaseLineLoc;
}