每隔K个点取一点,或舍去那些比规定距离更近的点,但首、末端点一定要保留。这种方法可大量压缩数字化仪用连续方法获取的点列中的点、曲率变化显著的点,但不一定能恰当地保留方向上曲率显著变化的点。
struct PNT
{
int x;
int y;
};//用于保存点坐标
PNT arr1[100];//保存原始点数据
PNT arr2[100];//保存压缩后的点数据
int num;//arr1中元素数
int num2;//arr2中元素数
void CExperiment1Dlg::OnBnClickedButton1()
{
// 压缩按钮
//K为文本编辑框获取的值
num2 = 0;
CPen pen;
pen.CreatePen(PS_SOLID, 2, RGB(255, 0, 0));
CDC* pDC = GetDC();
pDC->SelectObject(&pen);
UpdateData();
for (int i = 0; i < num; i += k)
{
arr2[num2].x = arr1[i].x;
arr2[num2++].y = arr1[i].y;
}
if ((num-1) % k != 0)
{
arr2[num2].x = arr1[num-1].x;
arr2[num2].y = arr1[num-1].y;
num2++;
}
for (int i = 0; i < num2 - 1; i++)
{
pDC->MoveTo(arr2[i].x, arr2[i].y);
pDC->LineTo(arr2[i + 1].x, arr2[i + 1].y);
}
}
void CExperiment1Dlg::OnLButtonDown(UINT nFlags, CPoint point)
{
//在鼠标左键点击位置画出小圆,用于显示
arr1[num].x = point.x;
arr1[num++].y = point.y;
CDC* pDC = GetDC();
pDC->Ellipse(point.x - 5, point.y - 5, point.x + 5, point.y + 5);
CDialogEx::OnLButtonDown(nFlags, point);
}
void CExperiment1Dlg::OnBnClickedButton2()
{
//画线按钮,将屏幕上的点连接起来
CDC* pDC = GetDC();
for (int i = 0; i < num - 1; i++)
{
pDC->MoveTo(arr1[i].x, arr1[i].y);
pDC->LineTo(arr1[i+1].x, arr1[i+1].y);
}
}
结果展示如下: