C++折线数据压缩

C++折线数据压缩

说明

采集软件中使用折线图显示采集的信息,如果折线是自己绘制的,就需要不断向折线的数组中写入数据,然后再刷新到页面上。但采样的点过多就会导致折线绘制速度过慢,所以需要对折线中的部分数据进行剔除,保障数据刷新的速度。
数据压缩过程中需要剔除掉其中的一些特征不太明显的点,如连续的串点在同一条直线上,那么除去直线头尾以外的所有点,绘制的效果依然差不多,即梯度变化不大的点就是特征不明显的点,应该被剔除,所以基本的方法就是剔除掉二阶导绝对值较小的点。

效果展示

折线压缩过程中保持着8192个点,压缩的过程中折线会不可避免的出现一定的变形,但折线中特征最明显一些点会全部保留下来。另外点在压缩的需要零点几秒的时间,无法立刻完成显示的。
在这里插入图片描述

程序

    struct comPoint {
		comPoint()
		{
			x = 0.0f;
			y = 0.0f;
		}
		float x;
		float y;
	};
	struct Diff2Point
	{
		Diff2Point()
		{
			diff2 = 0.0f;
			point.x = 0.0f;
			point.y = 0.0f;
		}
		float diff2;
		comPoint point;
	};
	enum Direction
	{
		POSITIVE=1,       //从小到大排序
		REVERSE         //从大到小排序
	};
	float diff(comPoint point1,comPoint point2)         //求point2处的梯度
	{
		return (point2.y - point1.y) / (point2.x - point1.x);
	}

	float diff2(comPoint point1, comPoint point2,comPoint point3)         //求point2处的二阶导
	{
		return (diff(point3, point2) - diff(point2, point1)) / ((point3.x -point1.x)/2);
	}
	//快速排序法
	void quicksortHelper(std::vector<Diff2Point>& a,  int start,  int end, Direction direction)
	{
		if (start >= end ||start<0) return;
		unsigned int l = start, r = end;
		float pivot = a[(end - start) / 2 + start].diff2;
		if(direction==POSITIVE)
		{ 
			while (l <= r)
			{
				while (l <= r && a[r].diff2 > pivot)  r--;
				while (l <= r && a[l].diff2 < pivot)  l++;
				if (l <= r) std::swap(a[l++], a[r--]);
			}
		}
		
		else
		{
			while (l <= r)
			{
				while (l <= r && a[r].diff2 < pivot)  r--;
				while (l <= r && a[l].diff2 > pivot)  l++;
				if (l <= r) std::swap(a[l++], a[r--]);
			}
		}
		
		quicksortHelper(a, start, r,direction);
		quicksortHelper(a, l, end,direction);
	}
	//快速排序,使得梯度从大到小进行排序
	void quicksort(std::vector<Diff2Point>& arry, Direction direction)
	{
		quicksortHelper(arry, 0, arry.size() - 1,direction);
	}

	void quicksortHelper(std::vector<comPoint>& a, int start, int end, Direction direction)
	{
		if (start >= end ||start<0) return;
		unsigned int l = start, r = end;
		float pivot = a[(end - start) / 2 + start].x;
		if (direction == POSITIVE)
		{
			while (l <= r)
			{
				while (l <= r && a[r].x > pivot)  r--;
				while (l <= r && a[l].x < pivot)  l++;
				if (l <= r) std::swap(a[l++], a[r--]);
			}
		}
		else
		{
			while (l <= r)
			{
				while (l <= r && a[r].x < pivot)  r--;
				while (l <= r && a[l].x > pivot)  l++;
				if (l <= r) std::swap(a[l++], a[r--]);
			}
		}
		
		quicksortHelper(a, start, r,direction);
		quicksortHelper(a, l, end, direction);
	}
	//快速排序,将点按照从小到大的方式进行排序
	void quicksort(std::vector<comPoint>& arry, Direction direction)
	{
		quicksortHelper(arry, 0, arry.size() - 1,direction);
	}
	/******************************************
	将数据信息vec数组压缩到count个数据 
	大致原理是根据二阶导数计算判断数值的变化幅度,
	二阶导绝对值过小则意味变化不明显,该处的特征可以删除,根据二阶导来尽可能地保留数据中地有效信息
	*****************************************/
	
	
	std::vector<comPoint> DataCompress(std::vector<comPoint> vec, int count)        
	{
		if (vec.empty())
		{
			return std::vector<comPoint>();   //返回一个空的值
		}
		if (vec.size() <= count)              //数据量过小,达不到压缩的标准
		{
			return vec;
		}
		std::vector<Diff2Point> diff2points;
		unsigned int vecsize = vec.size();   //参与计算二阶导的点为vecsize-2个点
		for (unsigned int i = 1; i < vecsize - 1; i++)
		{
			Diff2Point diffpoint;
			diffpoint.diff2 =abs( diff2(vec[i - 1], vec[i], vec[i + 1]));
			diffpoint.point = vec[i];
		}
		quicksort(diff2points, REVERSE);      //按照从大到小的排序方法进行排序
		std::vector<comPoint> vec2;
		vec2.push_back(vec[0]);
		for (unsigned int i = 0; i < count - 2; i++)     //此处需要从diffpoint中读取count-2个点到vec2中,二阶导过小则不添加到
		{
			vec2.push_back(diff2points[i].point);
		}
		vec2.push_back(vec[vec.size() - 1]);
		quicksort(vec2,POSITIVE);
		return vec2;
	}

最后

这部分程序是按照这个想法写的,程序中可能会存在些BUG,绘制折线时点的数量不易太少,否则很快便会出现折线变形。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
c 连续数据压缩算法是一种用于压缩连续数据的算法。连续数据是指存储在计算机中的一系列具有一定规律的数据,比如时间序列数据、图像数据等。 该算法通过利用连续数据的特性,减少数据存储所需的空间。它的基本原理是将连续的数据序列转化为一组较小的数据,以更高的效率进行存储和传输。 c 连续数据压缩算法的步骤如下: 1. 首先,对连续数据进行预处理,将不连续的数据序列转化为有序的连续序列。这一步可以通过排序、滤波、采样等方式实现。 2. 然后,采用差分编码的方法,将连续数据转化为差分数据。差分数据指的是当前数据与前一个数据之间的差值,这样可以减少存储空间。 3. 接下来,采用霍夫曼编码或者算术编码的方法对差分数据进行压缩。这些编码方法可以根据数据的出现频率来赋予短的编码序列给出现频率较高的数据。 4. 最后,将压缩后的数据进行存储或者传输。在解压缩的过程中,使用相应的解压缩算法压缩数据恢复为原始的连续数据。 c 连续数据压缩算法的优势在于它可以更高效地压缩和存储连续数据,减少存储空间的占用。同时,由于连续数据具有一定的规律性,算法可以利用这些规律来进一步提高压缩的效率。这种算法在处理大规模的连续数据时,能够显著减少存储和传输的成本。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值