visionview-1.cpp

来自「FIRA 3对3 机器人足球PC端控制程序。」· C++ 代码 · 共 2,053 行 · 第 1/5 页

CPP
2,053 行
字号
		// Calculate robot size
		SizeXofRobot = abs(point.x - SelectedRectInZoom.left) / ZOOM_SCALE;
		SizeYofRobot = abs(point.y - SelectedRectInZoom.top) / ZOOM_SCALE;
		if(SizeXofRobot==0)		SizeXofRobot = DEF_SIZE_X_ROBOT;
		if(SizeYofRobot==0)		SizeYofRobot = DEF_SIZE_Y_ROBOT;
		SizeXofRobot = (SizeXofRobot + SizeYofRobot)/2;
		SizeYofRobot = SizeXofRobot;
		char tmp[40];
		sprintf(tmp, "robot size = %d x %d ", SizeXofRobot, SizeYofRobot); 
		MessageBox(tmp);
		// get robot size
		DistanceBetweenBigTeamAndSmallID = (short)(sqrt(2) / 2. * SizeXofRobot);
		// Clear pixels of zoom area		
		//Invalidate();
		bSetRobotSize =	FALSE;
		bBeginZoom	=	FALSE;
		bEndZoom	=	FALSE;
	}
	else if( bSetColor && bEndZoom && point.x >= (DispSizeX + ZOOM_OFFX) && point.x < (DispSizeX + ZOOM_OFFX + ZOOM_SIZE * ZOOM_SCALE)
		&& point.y >= ZOOM_OFFY && point.y < (ZOOM_OFFY + ZOOM_SIZE * ZOOM_SCALE)){ 
		// Determine ranges of RGB in selected rectangle in zoom window
		MinMaxOfRGB(point);
		// Initialize values of SetColor Dialog
		ptrSetColor->bSetColor = TRUE;
		InitSetColorDlg();
		if(ptrSetColor->DoModal() == IDOK)
			SetColorUpdate();
		bSetColor	=	FALSE;
		bBeginZoom	=	FALSE;
		bEndZoom	=	FALSE;
	}
	
	CFormView::OnLButtonDown(nFlags, point);
}

// 祸 汲沥矫 急琶等 康开 犬措窍咯 弊府扁 
void CVisionView::Zoom(CPoint point)
{   
	short w, h, x, y, remainder;
	BYTE *pZoomBuffer;
	CClientDC objDC(this);

	// Determine zoom window with the size ZOOM_SIZE x ZOOM_SIZE
	if(point.x < ZOOM_HALFSIZE && point.y < ZOOM_HALFSIZE){
		ZoomLeft = 0;
		ZoomTop = 0;
	}
	else if(point.x > (DispSizeX-1-ZOOM_HALFSIZE) && point.y < ZOOM_HALFSIZE){
		ZoomLeft = DispSizeX-1-ZOOM_SIZE;
		ZoomTop = 0;
	}
	else if(point.x < ZOOM_HALFSIZE && point.y > (DispSizeY-1-ZOOM_HALFSIZE)){
		ZoomLeft = 0;
		ZoomTop = DispSizeY-1-ZOOM_SIZE;
	}
	else if(point.x > (DispSizeX-1-ZOOM_HALFSIZE) && point.y > (DispSizeY-1-ZOOM_HALFSIZE)){
		ZoomLeft = DispSizeX-1-ZOOM_SIZE;
		ZoomTop = DispSizeY-1-ZOOM_SIZE;
	}
	else if(point.x < ZOOM_HALFSIZE){
		ZoomLeft = 0;
		ZoomTop = point.y-ZOOM_HALFSIZE;
	}
	else if(point.x > (DispSizeX-1-ZOOM_HALFSIZE) ){
		ZoomLeft = DispSizeX-1-ZOOM_SIZE;
		ZoomTop = point.y-ZOOM_HALFSIZE;
	}
	else if(point.y < ZOOM_HALFSIZE){
		ZoomLeft = point.x-ZOOM_HALFSIZE;
		ZoomTop = 0;
	}
	else if(point.y > (DispSizeY-1-ZOOM_HALFSIZE)){
		ZoomLeft = point.x-ZOOM_HALFSIZE;
		ZoomTop = DispSizeY-1-ZOOM_SIZE;
	}
	else {
		ZoomLeft = point.x-ZOOM_HALFSIZE;
		ZoomTop = point.y-ZOOM_HALFSIZE;
	}
	remainder = ZoomLeft % 4;	// trivial
	ZoomLeft -= remainder;
	// Get color data to ZoomBuffer
	MbufGetColor2d(MilImageBufferId, M_RGB32+M_PACKED, M_ALL_BAND, ZoomLeft, ZoomTop, ZOOM_SIZE, ZOOM_SIZE, ZoomBuffer);
	pZoomBuffer = ZoomBuffer;
	// draw the selected object area at Zoom Window
	for(h = 0;h < ZOOM_SIZE*ZOOM_SCALE;h += ZOOM_SCALE){
		for(w = 0;w < ZOOM_SIZE*ZOOM_SCALE;w += ZOOM_SCALE){             
			for(x = 0;x < ZOOM_SCALE;x++)
				for(y = 0;y < ZOOM_SCALE;y++)
					objDC.SetPixel(DispSizeX+ZOOM_OFFX+w+x, ZOOM_OFFY+h+y, RGB(*pZoomBuffer, *(pZoomBuffer+1), *(pZoomBuffer+2)));
			pZoomBuffer += 4;
		}
	}
}

void CVisionView::MinMaxOfRGB(CPoint point)
{
	long w, h, left, top, width, height;
	BYTE *pZoomBuffer;
	int y, u, v;
	int r, g, b;

	if(SelectedRectInZoom.left < point.x){
		left = SelectedRectInZoom.left;
		width = point.x - left;
	}
	else{
		left = point.x;
		width = SelectedRectInZoom.left - left;
	}
	if(SelectedRectInZoom.top < point.y){
		top = SelectedRectInZoom.top;
		height = point.y - top;
	}
	else{
		top = point.y;
		height = SelectedRectInZoom.top - top;
	}
	
	left = (left - (DispSizeX + ZOOM_OFFX)) / ZOOM_SCALE;
	top	= (top - ZOOM_OFFY) / ZOOM_SCALE;
	width /= ZOOM_SCALE;
	height /= ZOOM_SCALE;

	pZoomBuffer = ZoomBuffer;
		
	Rmin = Gmin = Bmin = 255;
	Rmax = Gmax = Bmax = 0;
	for(h=0;h<ZOOM_SIZE;h++) {
		if(h >= top && h <= (top + height) ) {
			for(w=0;w<ZOOM_SIZE;w++){
				if(w >= left && w <= (left + width) ) {
					r = *pZoomBuffer;
					g = *(pZoomBuffer+1);
					b = *(pZoomBuffer+2);
					
					y = (int)(0.299*r + 0.587*g + 0.114*b);
					y = min(255,max(y,0));
					u = (int)(0.565*(b-y) + 128);
					u = min(255,max(u,0));
					v = (int)(0.713*(r-y) + 128);
					v = min(255,max(v,0));

					
					if(y > Rmax)
						Rmax = y;
					if(y < Rmin)
						Rmin = y;
					if(u > Gmax)
						Gmax = u;
					if(u < Gmin)
						Gmin = u;
					if(v > Bmax)
						Bmax = v;
					if(v < Bmin)
						Bmin = v;
					
					
					/*
					if(r > Rmax)
						Rmax = r;
					if(r < Rmin)
						Rmin = r;
					if(g > Gmax)
						Gmax = g;
					if(g < Gmin)
						Gmin = g;
					if(b > Bmax)
						Bmax = b;
					if(b < Bmin)
						Bmin = b;
					*/
				
				}
				pZoomBuffer += 4;
			}
		}
		else 
			pZoomBuffer += 4*ZOOM_SIZE;
	}
}

// 矫府倔 器飘 檬扁拳
void CVisionView::OnCom1() 
{
	// TODO: Add your control notification handler code here
	m_pComm.DestroyComm();
	UpdateData(TRUE);
	m_pComm.DestroyComm();
	m_pComm.SetComPort(1,19200,8,0,0);
	m_pComm.CreateCommInfo();
	m_pComm.OpenComPort();
	UpdateData(FALSE);		
	
}

void CVisionView::OnCom2() 
{
	// TODO: Add your control notification handler code here
	m_pComm.DestroyComm();
	UpdateData(TRUE);
	m_pComm.DestroyComm();
	m_pComm.SetComPort(2,19200,8,0,0);
	m_pComm.CreateCommInfo();
	m_pComm.OpenComPort();
	UpdateData(FALSE);	
	
}


// 权评狼 榜措 困摹 (哭率, 坷弗率) 沥窍扁 
void CVisionView::OnLeftHome() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	bFlagIsOurHomeLeft = TRUE;
	UpdateData(FALSE);
}

void CVisionView::OnRightHome() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	bFlagIsOurHomeLeft = FALSE;
	UpdateData(FALSE);
}

// 惑炔喊 傈贱 急琶窍扁 
void CVisionView::OnKickOff() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	m_nGame = 0;
	MODE=m_nGame;
	//MODE = 0;
	UpdateData(FALSE);

}

void CVisionView::OnPenalityKick() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	m_nGame = 1;
	MODE=m_nGame;
	UpdateData(FALSE);

}

void CVisionView::OnFreeKick() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	m_nGame = 2;
	MODE=m_nGame;
	UpdateData(FALSE);

}

void CVisionView::OnFreeBall() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	m_nGame = 3;
	MODE=m_nGame;
	UpdateData(FALSE);

}

void CVisionView::OnGoalieKick() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	m_nGame = 4;
	MODE=m_nGame;
	UpdateData(FALSE);
	
}

void CVisionView::OnDefense() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	m_nGame = 5;
	MODE=m_nGame;
	UpdateData(FALSE);

}


void CVisionView::OnKickOff2() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	m_nSetting = 0;
	MODE1=m_nSetting;
	UpdateData(FALSE);
	
}

void CVisionView::OnPenalityKick2() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	m_nSetting = 1;
	MODE1=m_nSetting;
	UpdateData(FALSE);
	
}

void CVisionView::OnFreeKick2() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	m_nSetting = 2;
	MODE1=m_nSetting;
	UpdateData(FALSE);
	
}

void CVisionView::OnFreeBall2_1() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	m_nSetting = 3;
	MODE1=m_nSetting;
	UpdateData(FALSE);

}

void CVisionView::OnFreeBall2_2() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	m_nSetting = 6;
	MODE1=m_nSetting;
	UpdateData(FALSE);
	
}

void CVisionView::OnFreeBall2_3() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	m_nSetting = 7;
	MODE1=m_nSetting;
	UpdateData(FALSE);
	
}

void CVisionView::OnFreeBall2_4() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	m_nSetting = 8;
	MODE1=m_nSetting;
	UpdateData(FALSE);
	
}

void CVisionView::OnGoalieKick2() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	m_nSetting = 4;
	MODE1=m_nSetting;
	UpdateData(FALSE);
	
}

void CVisionView::OnDefense2() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	m_nSetting = 5;
	MODE1=m_nSetting;
	UpdateData(FALSE);
	
}


void CVisionView::OnDemo() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	m_nSetting = 9;
	MODE1=m_nSetting;
	UpdateData(FALSE);
	
}

// 飘发欧 扩档快狼 哭率, 困 困摹 沥窍扁 
// rx, ry : 捞傈 橇饭烙狼 拱眉 困摹 
// size : 飘发欧 扩档快 农扁 
// *offx, *offy : 飘发欧 扩档快狼 哭率, 困 困摹  
void CVisionView::DetermineOffsetXY(short rx, short ry, short size, long *offx, long *offy)
{
	short halfsize;
	halfsize = size/2;
	// Determine zoom window with the size size x size
	if(rx < halfsize && ry < halfsize + rectBoundary.top){
		*offx = 0;
		*offy = rectBoundary.top;
	}
	else if(rx > (DispSizeX-1-halfsize) && ry < (halfsize+rectBoundary.top)){
		*offx = DispSizeX-1-size;
		*offy = rectBoundary.top;
	}
	else if(rx < halfsize && ry > (rectBoundary.bottom-1-halfsize)){
		*offx = 0;
		*offy = rectBoundary.bottom-1-size;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?