📄 learnview.cpp
字号:
// LearnView.cpp : implementation of the CLearnView class
//
#include "stdafx.h"
#include "Learn.h"
#include "LearnDoc.h"
#include "LearnView.h"
#include "math.h"
#include "MainFrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CLearnView
IMPLEMENT_DYNCREATE(CLearnView, CView)
BEGIN_MESSAGE_MAP(CLearnView, CView)
//{{AFX_MSG_MAP(CLearnView)
ON_WM_TIMER()
ON_COMMAND(ID_MAP1, OnMap1)
ON_COMMAND(ID_SP, OnSP)
ON_BN_CLICKED(IDC_BUTTON_START, OnButtonStart)
ON_BN_CLICKED(IDC_BUTTON_OK, OnButtonOk)
ON_BN_CLICKED(IDC_BUTTON_PAUSE, OnButtonPause)
ON_BN_CLICKED(IDC_BUTTON_LEFT, OnButtonLeft)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_BN_CLICKED(IDC_BUTTON_RIGHT, OnButtonRight)
ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_SLIDER_YDVELOCITY, OnReleasedcaptureSliderYdvelocity)
ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_SLIDER_ROBOTVELOCITY, OnReleasedcaptureSliderRobotvelocity)
ON_CBN_SELCHANGE(IDC_COMBO_MAP, OnSelchangeComboMap)
ON_EN_CHANGE(IDC_EDIT_INITX, OnChangeEditInitx)
ON_EN_CHANGE(IDC_EDIT_INITY, OnChangeEditInity)
ON_EN_CHANGE(IDC_EDIT_GOALX, OnChangeEditGoalx)
ON_EN_CHANGE(IDC_EDIT_GOALY, OnChangeEditGoaly)
ON_WM_MOUSEMOVE()
ON_UPDATE_COMMAND_UI(IDC_BUTTON_LEFT,OnupdataLeftButton)
ON_UPDATE_COMMAND_UI(IDC_BUTTON_RIGHT,OnupdataRightButton)
ON_UPDATE_COMMAND_UI(IDC_BUTTON_START,OnupdataStartButton)
ON_UPDATE_COMMAND_UI(IDC_BUTTON_PAUSE,OnupdataPauseButton)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CLearnView construction/destruction
CLearnView::CLearnView()
{
// TODO: add construction code here
// Q[17][5]={{10,10,10,10,10},{10,10,10,10,10},{10,10,10,10,10},{10,10,10,10,10},{10,10,10,10,10},
// {10,10,10,10,10},{10,10,10,10,10},{10,10,10,10,10},{10,10,10,10,10},{10,10,10,10,10},
// {10,10,10,10,10},{10,10,10,10,10},{10,10,10,10,10},{10,10,10,10,10},{10,10,10,10,10},
// {10,10,10,10,10},{10,10,10,10,10}};
int i=0,j=0,k=0;
for (k=0;k<100;k++)
{
Q[k]=10;
}
for (i=0;i<17;i++)
{
for (j=0;j<6;j++)
{
Qsa[i][j]=10.0;
}
}
// struct QValue QQ;
// for (int i=0;i<17;i++)
// {
// for (int j=0;j<5;j++)
// {
// QQ->Q[i][j]=0;
// }
// }
Qvamax=0;
qq=0;
dis2=4.0;
trd_numB=16;//状态标志
flag_Timer=0;
first=0;
flag0=0;
flag1=0;
flag_dis=100;
flag_num=0;
num0=0;
bushu0=0;
x=0.0;
y=0.0;
x0=20;//20.0;
y0=50;//50.0;
x1=x0;
y1=y0;
x2=800.0;
y2=500;//500.0;
di=12.0; //探测范围
Pi=3.1415926;
R_k=0.0;
// R_z=atan((y2-y)/(x2-x));
R_Angle=45;
buchang=1.5;
test1=0;
test2=0;
test3=0;
Bit_color=16711680;
MidValue=0.0;
mapnum=0;
ydsign=0;
ydGnum=0;
ydRnum=0;
RedColor=255;
GreenColor=65280;
ColorSignB=0;
ColorSignG=0;
ColorSignR=0;
LeftEnable=true;
RightEnable=true;
StartEnable=true;
PauseEnable=false;
for(i=0;i<50;i++)
{
ydGPoint1[i]=0;
ydGPoint2[i]=0;
ydRPoint1[i]=0;
ydRPoint2[i]=0;
}
}
void CLearnView::OnInitialUpdate()
{
CView::OnInitialUpdate();
// TODO: Add your specialized code here and/or call the base class
// SetTimer(10,5,NULL);
// CClientDC dc(this);
// dc.SetWindowOrg(0,630);
//对对话框进行初始化设置
CString str;
CMainFrame *pw=(CMainFrame *)AfxGetMainWnd();
str.Format("%f",x0);
((CEdit *)(pw->m_wndMyDialogBar.GetDlgItem(IDC_EDIT_INITX)))->SetWindowText(str);
str.Format("%f",y0);
((CEdit *)(pw->m_wndMyDialogBar.GetDlgItem(IDC_EDIT_INITY)))->SetWindowText(str);
str.Format("%f",x2);
((CEdit *)(pw->m_wndMyDialogBar.GetDlgItem(IDC_EDIT_GOALX)))->SetWindowText(str);
str.Format("%f",y2);
((CEdit *)(pw->m_wndMyDialogBar.GetDlgItem(IDC_EDIT_GOALY)))->SetWindowText(str);
((CComboBox *)(pw->m_wndMyDialogBar.GetDlgItem(IDC_COMBO_MAP)))->SetCurSel(0);
//初始化运动障碍物的速度
((CSliderCtrl *)(pw->m_wndMyDialogBar.GetDlgItem(IDC_SLIDER_YDVELOCITY)))->SetPos(50);
ydvelocity=fabs(((CSliderCtrl *)(pw->m_wndMyDialogBar.GetDlgItem(IDC_SLIDER_YDVELOCITY)))->GetPos()-100);
//初始化机器人的速度
((CSliderCtrl *)(pw->m_wndMyDialogBar.GetDlgItem(IDC_SLIDER_ROBOTVELOCITY)))->SetPos(50);
Robotvelocity=(fabs(((CSliderCtrl *)(pw->m_wndMyDialogBar.GetDlgItem(IDC_SLIDER_ROBOTVELOCITY)))->GetPos()-100))/4;
}
CLearnView::~CLearnView()
{
}
BOOL CLearnView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CLearnView drawing
void CLearnView::OnDraw(CDC* pDC)
{
CLearnDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
// *******把位图导入*********************************
//要注意先导入地图,再画其他图形,以免被地图覆盖
CDC memDC;
CBitmap cb;
CRect rect;
GetWindowRect(&rect);
// int bit;
// bit=133;
//根据组合框的不同选择来选择不同的地图
switch(mapnum)
{
case 0: cb.LoadBitmap(IDB_BITMAP1);
break;
case 1: cb.LoadBitmap(IDB_BITMAP2);
break;
case 2: cb.LoadBitmap(IDB_BITMAP3);
break;
case 3: cb.LoadBitmap(IDB_BITMAP4);
break;
case 4: cb.LoadBitmap(IDB_BITMAP5);
break;
case 5: cb.LoadBitmap(IDB_BITMAP6);
break;
case 6: cb.LoadBitmap(IDB_BITMAP7);
break;
case 7: cb.LoadBitmap(IDB_BITMAP8);
break;
case 8: cb.LoadBitmap(IDB_BITMAP9);
break;
case 9: cb.LoadBitmap(IDB_BITMAP10);
break;
case 10: cb.LoadBitmap(IDB_BITMAP11);
break;
default:
break;
}
memDC.CreateCompatibleDC(pDC);
CBitmap* oldbitmap=NULL;
oldbitmap=memDC.SelectObject(&cb);
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&memDC,0,0,SRCCOPY);
memDC.SelectObject(oldbitmap);
CString str;
pDC->TextOut((int)x0+5,(int)y0-25,"出发点");
pDC->TextOut((int)x2,(int)y2,"GOAL");
// pDC->TextOut((int)600,(int)30,"GOAL");
CBrush RedBrush(RGB(255,0,255)),GreenBrush(RGB(255,255,0));
pDC->SelectObject(RedBrush);
pDC->Ellipse((int)x2-5,(int)y2-5,(int)x2+5,(int)y2+5);
pDC->SelectObject(GreenBrush);
pDC->Ellipse((int)x0-5,(int)y0-5,(int)x0+5,(int)y0+5);
// CClientDC cDC(this);
// cDC.SelectObject(GreenBrush);
//
// cDC.Ellipse((int)x0-25,(int)y0-25,(int)x0-5,(int)y0-5);
///////////////////////////////////////////////////////////////////////////////
// for (int i=0;i<100;i++)
// {
// Q[i]=0.0;
// }
/* ///////////////////////////////////////////////////////////////////////////////////////////
HBRUSH hBrush;
hBrush=(HBRUSH)GetStockObject(BLACK_BRUSH); //06777215
CBrush RedBrush(COLORREF(10000215)); //25577215
pDC->SelectObject(RedBrush);
pDC->Rectangle(60,40,90,220);
pDC->Rectangle(140,550,310,580);
pDC->Rectangle(310,150,350,580);
pDC->Rectangle(310,120,700,150);
// pDC->Rectangle(310,150,350,580);
*/
/////////////////////////////////////////////////////////////////////////////
}
/////////////////////////////////////////////////////////////////////////////
// CLearnView printing
BOOL CLearnView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CLearnView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CLearnView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CLearnView diagnostics
#ifdef _DEBUG
void CLearnView::AssertValid() const
{
CView::AssertValid();
}
void CLearnView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CLearnDoc* CLearnView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CLearnDoc)));
return (CLearnDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CLearnView message handlers
void CLearnView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if (nIDEvent==10)
{
CClientDC cDC(this);
CString strtimes;
num0++;
strtimes.Format("运行次数:%d",num0);
cDC.TextOut(80,30,strtimes);
if (flag0==0)
{
DrawPath();
if (x>x2)
{
R_k=Pi+atan((y2-y)/(x2-x));
}
else R_k=atan((y2-y)/(x2-x)); //斜率弧度值
}
else if(flag0==1)
{
Sta2Action(trd_numB);
if (num0>18)
{
//StopTest();
}
}
Robot();
if ((x>=x2-2)&&(x<=x2+2)&&(y>=y2-2)&&(y<=y2+2))
{
x1=x0;
y1=y0;
// KillTimer(10);
}
}
if ((x0==x1)&&(y0=y1)) //当机器人到达目标位置时,停止计时器并使相应按钮及控件好用
{
CMainFrame *pw=(CMainFrame *)AfxGetMainWnd();
((CComboBox *)(pw->m_wndMyDialogBar.GetDlgItem(IDC_COMBO_MAP)))->EnableWindow(TRUE);
((CEdit *)(pw->m_wndMyDialogBar.GetDlgItem(IDC_EDIT_INITX)))->EnableWindow(TRUE);
((CEdit *)(pw->m_wndMyDialogBar.GetDlgItem(IDC_EDIT_INITY)))->EnableWindow(TRUE);
((CEdit *)(pw->m_wndMyDialogBar.GetDlgItem(IDC_EDIT_GOALX)))->EnableWindow(TRUE);
((CEdit *)(pw->m_wndMyDialogBar.GetDlgItem(IDC_EDIT_GOALY)))->EnableWindow(TRUE);
LeftEnable=true;
RightEnable=true;
StartEnable=true;
PauseEnable=false;
KillTimer(10);
}
///加入运动障碍物
CClientDC dc(this);
CBrush GreenBrush(RGB(0,255,0)),RedBrush(RGB(255,0,0));
int ydwidth;//运动障碍物的宽
int ydbuchang=5;//运动障碍物运动步长
CRect lpCrectG,lpCrectR;
//绿色障碍物向左移动
int lsydGnum,lsydRnum;
if (nIDEvent==1)
{
lsydGnum=ydGnum-1;
while (lsydGnum>=0)
{
// ydwidth=ydPoint2[lsydnum].x-ydPoint1[lsydnum].x;
if (ydGPoint2[lsydGnum].x<0)
{
ydGPoint2[lsydGnum].x=1000+ydGPoint2[lsydGnum].x-ydGPoint1[lsydGnum].x;//1000要根据显示器的不同注意修改
ydGPoint1[lsydGnum].x=1000;
}
ydGPoint1[lsydGnum].x=ydGPoint1[lsydGnum].x-ydbuchang;
ydGPoint2[lsydGnum].x=ydGPoint2[lsydGnum].x-ydbuchang;
dc.SelectObject(GreenBrush);
dc.Rectangle(ydGPoint1[lsydGnum].x,ydGPoint1[lsydGnum].y,ydGPoint2[lsydGnum].x,ydGPoint2[lsydGnum].y);
//刷新运动障碍物周围
lpCrectG.left=ydGPoint2[lsydGnum].x;
lpCrectG.top=ydGPoint1[lsydGnum].y;
lpCrectG.right=ydGPoint2[lsydGnum].x+ydbuchang;
lpCrectG.bottom=ydGPoint2[lsydGnum].y;
InvalidateRect(lpCrectG);
lsydGnum--;
}
}
//红色障碍物向右移动
if (nIDEvent==2)
{
lsydRnum=ydRnum-1;
while (lsydRnum>=0)
{
if (ydRPoint1[lsydRnum].x>1100)//根据显示器的不同注意修改
{
ydRPoint1[lsydRnum].x=0-(ydRPoint2[lsydRnum].x-ydRPoint1[lsydRnum].x);
ydRPoint2[lsydRnum].x=0;
}
ydRPoint1[lsydRnum].x=ydRPoint1[lsydRnum].x+ydbuchang;
ydRPoint2[lsydRnum].x=ydRPoint2[lsydRnum].x+ydbuchang;
dc.SelectObject(RedBrush);
dc.Rectangle(ydRPoint1[lsydRnum].x,ydRPoint1[lsydRnum].y,ydRPoint2[lsydRnum].x,ydRPoint2[lsydRnum].y);
//刷新运动障碍物周围
lpCrectR.left=ydRPoint1[lsydRnum].x+ydbuchang;
lpCrectR.top=ydRPoint1[lsydRnum].y;
lpCrectR.right=ydRPoint1[lsydRnum].x-ydbuchang;
lpCrectR.bottom=ydRPoint2[lsydRnum].y;
InvalidateRect(lpCrectR);
lsydRnum--;
}
}
CView::OnTimer(nIDEvent);
}
void CLearnView::DrawPath()
{
/////////////////////////////////////////////////////////////////
CClientDC dc(this);
CString bushu,str_color1,str3,str_k,str_A,str_px,str_py;
COLORREF trd00,trd01,trd02,trd03,trd04,trd05,trd06,trd07,trd08,trd09,trd10,trd11,trd12,trd13,trd14,trd15,trd16;
double dis=0.0,dis1=0.0,dis2=0.0; //传感器感测距离
//ouble xf,yf;//,xs,ys; //传感器感测到障碍物的坐标
for(dis=0.0;dis<20.0;dis=dis+0.5)
{
/////////取得传感器的值/////////
trd00=dc.GetPixel((int)(x+dis*cos(R_k+0.0*Pi/12.0)),(int)(y+dis*sin(R_k+0.0*Pi/12.0)));
trd01=dc.GetPixel((int)(x+dis*cos(R_k-1.0*Pi/12.0)),(int)(y+dis*sin(R_k-1.0*Pi/12.0)));
trd02=dc.GetPixel((int)(x+dis*cos(R_k+1.0*Pi/12.0)),(int)(y+dis*sin(R_k+1.0*Pi/12.0)));
trd03=dc.GetPixel((int)(x+dis*cos(R_k-2.0*Pi/12.0)),(int)(y+dis*sin(R_k-2.0*Pi/12.0)));
trd04=dc.GetPixel((int)(x+dis*cos(R_k+2.0*Pi/12.0)),(int)(y+dis*sin(R_k+2.0*Pi/12.0)));
trd05=dc.GetPixel((int)(x+dis*cos(R_k-3.0*Pi/12.0)),(int)(y+dis*sin(R_k-3.0*Pi/12.0)));
trd06=dc.GetPixel((int)(x+dis*cos(R_k+3.0*Pi/12.0)),(int)(y+dis*sin(R_k+3.0*Pi/12.0)));
trd07=dc.GetPixel((int)(x+dis*cos(R_k-4.0*Pi/12.0)),(int)(y+dis*sin(R_k-4.0*Pi/12.0)));
trd08=dc.GetPixel((int)(x+dis*cos(R_k+4.0*Pi/12.0)),(int)(y+dis*sin(R_k+4.0*Pi/12.0)));
trd09=dc.GetPixel((int)(x+dis*cos(R_k-5.0*Pi/12.0)),(int)(y+dis*sin(R_k-5.0*Pi/12.0)));
trd10=dc.GetPixel((int)(x+dis*cos(R_k+5.0*Pi/12.0)),(int)(y+dis*sin(R_k+5.0*Pi/12.0)));
trd11=dc.GetPixel((int)(x+dis*cos(R_k-6.0*Pi/12.0)),(int)(y+dis*sin(R_k-6.0*Pi/12.0)));
trd12=dc.GetPixel((int)(x+dis*cos(R_k+6.0*Pi/12.0)),(int)(y+dis*sin(R_k+6.0*Pi/12.0)));
trd13=dc.GetPixel((int)(x+dis*cos(R_k-7.0*Pi/12.0)),(int)(y+dis*sin(R_k-7.0*Pi/12.0)));
trd14=dc.GetPixel((int)(x+dis*cos(R_k+7.0*Pi/12.0)),(int)(y+dis*sin(R_k+7.0*Pi/12.0)));
trd15=dc.GetPixel((int)(x+dis*cos(R_k-8.0*Pi/12.0)),(int)(y+dis*sin(R_k-8.0*Pi/12.0)));
trd16=dc.GetPixel((int)(x+dis*cos(R_k+8.0*Pi/12.0)),(int)(y+dis*sin(R_k+8.0*Pi/12.0)));
////////判断是否有障碍物////////////////////////////////////////////////////////////////
if (((int)trd00==Bit_color)||((int)trd00==RedColor)||((int)trd00==GreenColor))//&&((int)trd01==Bit_color)) //(0,1)
{
trd_numB=0;
dis1=dis;
flag0=1;
// Sta2Action(trd_num);
break;
}
else if (((int)trd01==Bit_color)||((int)trd01==RedColor)||((int)trd01==GreenColor))//&&((int)trd03==Bit_color))//(1,3)
{
trd_numB=1;
dis1=dis;
flag0=1;
// Sta2Action(trd_num);
break;
}
else if (((int)trd03==Bit_color)||((int)trd03==RedColor)||((int)trd03==GreenColor))//&&((int)trd05==Bit_color))
{
trd_numB=2;
dis1=dis;
flag0=1;
// Sta2Action(trd_num);
break;
}
else if (((int)trd05==Bit_color)||((int)trd05==RedColor)||((int)trd05==GreenColor))//&&((int)trd07==Bit_color))
{
trd_numB=3;
dis1=dis;
// KillTimer(10);
// AfxMessageBox("111");
// R_k=+37.5*Pi/180.0;
flag0=1;
// Sta2Action(trd_num);
break;
}
else if (((int)trd07==Bit_color)||((int)trd07==RedColor)||((int)trd07==GreenColor))//&&((int)trd09==Bit_color))
{
trd_numB=4;
dis1=dis;
// KillTimer(10);
// AfxMessageBox("111");
// R_k=+22.5*Pi/180.0;
flag0=1;
// Sta2Action(trd_num);
break;
}
else if (((int)trd09==Bit_color)||((int)trd09==RedColor)||((int)trd09==GreenColor))//&&((int)trd11==Bit_color))
{
trd_numB=5;
dis1=dis;
// KillTimer(10);
// AfxMessageBox("111");
// R_k=+7.5*Pi/180.0;
flag0=1;
// Sta2Action(trd_num);
break;
}
else if (((int)trd11==Bit_color)||((int)trd11==RedColor)||((int)trd11==GreenColor))//&&((int)trd13==Bit_color))
{
trd_numB=6;
dis1=dis;
// KillTimer(10);
// AfxMessageBox("6");
// R_k=-7.5*Pi/180.0;
flag0=1;
// Sta2Action(trd_num);
break;
}
else if (((int)trd13==Bit_color)||((int)trd13==RedColor)||((int)trd13==GreenColor))//&&((int)trd15==Bit_color))
{
trd_numB=7;
dis1=dis;
// KillTimer(10);
// AfxMessageBox("13");
// R_k=-7.5*Pi/180.0;
flag0=1;
// Sta2Action(trd_num);
break;
}
// else if (((int)trd00==Bit_color))//&&((int)trd02==Bit_color))
// {
// trd_num=8;
//// KillTimer(10);
//// AfxMessageBox("111");
// R_k=-82.5*Pi/180.0;
// flag0=1;
//// Sta2Action(trd_num);
// break;
//
// }
else if (((int)trd02==Bit_color)||((int)trd02==RedColor)||((int)trd02==GreenColor))//&&((int)trd04==Bit_color))
{
trd_numB=9;
dis1=dis;
// KillTimer(10);
// AfxMessageBox("111");
// R_k=-67.5*Pi/180.0;
flag0=1;
// Sta2Action(trd_num);
break;
}
else if (((int)trd04==Bit_color)||((int)trd04==RedColor)||((int)trd04==GreenColor))//&&((int)trd06==Bit_color))
{
trd_numB=10;
dis1=dis;
// KillTimer(10);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -