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 + -
显示快捷键?