基于基线的翻转和平移

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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值