保存点序列的方法

MFC的图像控件上点击鼠标左键获得的坐标序列,通过内存容器保存。

1.容器<vector>

动态地向容器内部添加数据。

vector容易需要添加头文件:

#include<vecror>

using namespace std;  这个是比较容易忘记和忽略的。

容器变量定义:vector<类型>变量名,如  vector<Point> point_vec;

保存数据到容器里:point_vec.pushback(点变量);//把数据添加到容器的尾部,即“先进先出”

   point_vec.pushfront(点变量);//把数据添加到容易的头部,即“后进先出”

容器的大小:point_vec.size();返回容器内的数据个数,如容器内有10个点数据。

2.变量和常量显示到MFC编辑框内

首先得把变量和常量整合到数组或者字符串中:

char str[50]={0};
sprintf(str,"y = %f x+ %f",a,b);

设置编辑框的内容:SetDlgItemText(IDC_EDIT3,CString(str));

3.获取图像控件方形的大小

CRect rect_ctr;
(this->GetDlgItem(IDC_PIC))->GetWindowRect(&rect_ctr);//此处是相对于屏幕的坐上角的坐标

ScreeenToClient(rect_ctl);//使坐标为相对于对话框左上角的坐标

图像控件的坐标:rect_ctl的信息,(left,top)  (right,buttom)

4.MFC控件上画线及圆

CWnd* pWND = GetDlgItem(IDC_PIC);//获取控件的句柄
CDC* pDC = pWND->GetDC();//控件的画板
pDC->MoveTo(linePt1.x,linePt1.y);//画笔开始的坐标
pDC->LineTo(linept2.x,linept2.y);//画笔终点坐标
ReleaseDC(pDC); //释放画板

MoveTo的作用相当于拿起笔并下笔,LineTo就是移动笔,画出直线.

5.LMS最小二乘直线拟合

float av_x=0,av_y=0;
float sum_x=0,sum_y=0,sum_xx=0,sum_yy=0,sum_xy=0;
float b=0,a=0;

int i=0;
num = PointArr.size();
for (i=0;i<num;i++)
{
sum_x += PointArr[i].x;
sum_y += PointArr[i].y;
sum_xx +=PointArr[i].x*PointArr[i].x;
sum_yy +=PointArr[i].y*PointArr[i].y;
sum_xy +=PointArr[i].x*PointArr[i].y;
}
av_x = sum_x/num;
av_y = sum_y/num;
a = (num*sum_xy-sum_x*sum_y)/(num*sum_xx-sum_x*sum_x);
b = av_y-a*av_x;

最后拟合的直线方程为 Y = aX+b;a,b分别为斜率和截距;

6.改变图像控件的背景颜色

首先得改变拖动形成的图像控件的属性,<type>改为Enhanced Metafile,

并添加消息响应:HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);

在响应函数内科改变背景颜色:

pDC->SetBkColor(RGB(0,0,0));
static CBrush gbrush(RGB(0,0,255));
return gbrush;




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值