www.pudn.com > JingXiang-Design-Jeff.rar > Image_Identify.cpp
// Image_Identify.cpp: implementation of the Image_Identify class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Design.h"
#include "Image_Identify.h"
#include "MainFrm.h"
#include "DesignDoc.h"
#include "DesignView.h"
#include "BmpFile.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#define FIRST_POINT_BUFFER_NUM 40000
#define WUCHA 0.01
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
Image_Identify::Image_Identify()
{
ObjectNum=0;
pBits=NULL;
NowPointNum=0;
BorderFlagGray=1;
//if(!pBorderPositionBuffer)
pBorderPositionBuffer=new BYTE[FIRST_POINT_BUFFER_NUM*sizeof(POINT)];
this->Buffer_Point_Num=FIRST_POINT_BUFFER_NUM;
if(!pBorderPositionBuffer)
{
(AfxGetApp()->m_pMainWnd)->MessageBox("Memory Alloc Error,File--'Image_Identify.cpp',Function--Image_Identify::Image_Identify()","内存分配错误",MB_OK|MB_ICONERROR);
//(CFrameWnd*) (AfxGetApp()->m_pMainWnd)->SendMessage(WM_QUIT);
::AfxPostQuitMessage(0);
}
EndPoint.x=-1;
EndPoint.y=-1;
// Init The Detect Order
Order[0].x=0;
Order[0].y=-1;
Order[1].x=-1;
Order[1].y=-1;
Order[2].x=-1;
Order[2].y=0;
Order[3].x=-1;
Order[3].y=1;
Order[4].x=0;
Order[4].y=1;
Order[5].x=1;
Order[5].y=1;
Order[6].x=1;
Order[6].y=0;
Order[7].x=1;
Order[7].y=-1;
pForProcess=NULL;
pForProcess_bit=NULL;
}
Image_Identify::~Image_Identify()
{
if(pBorderPositionBuffer)
delete[] pBorderPositionBuffer;
if(pForProcess_bit)
delete[]pForProcess_bit;
}
BOOL Image_Identify::GetNormalInfo(BMPInfoHeader Info_In, BYTE *pBitsData)
{
InfoHeader=Info_In;
pBits=pBitsData;
if(!pForProcess_bit)
{ this->ForProcessBufferSize=Info_In.biSizeImage*sizeof(WORD);
this->pForProcess_bit=new BYTE[ForProcessBufferSize];
}
else
{
if((int)(Info_In.biSizeImage*sizeof(WORD))>ForProcessBufferSize)
{
this->ForProcessBufferSize=Info_In.biSizeImage*sizeof(WORD);
BYTE *pTmp=new BYTE[ForProcessBufferSize];
delete[]pForProcess_bit;
pForProcess_bit=pTmp;
}
}
if(!pForProcess_bit)
{
(AfxGetApp()->m_pMainWnd)->MessageBox("Memory Alloc Error,File--'Image_Identify.cpp',Function--Image_Identify::Get_NormalInfo()","内存分配错误",MB_OK|MB_ICONERROR);
//(CFrameWnd*) (AfxGetApp()->m_pMainWnd)->SendMessage(WM_QUIT);
::AfxPostQuitMessage(0);
}
pForProcess=(WORD *) pForProcess_bit;
CopyToForProcess();
return TRUE;
}
BOOL Image_Identify::BorderDetect(RECT *pInput_,int IsFor_Left_Top_Out,int IsDrawing ,int BorderGray,int BkGray)
{
RECT *pInput=pInput_;
int FlagTmp=0;
NowPointNum=0;
BorderFlagGray=1;
ObjectNum=0;
POINT *pPoint=NULL;
if(!pInput_) return FALSE;
int Col,Line;
int Flag=0;
while(1)
{
Flag=0;
for(Line=pInput->top;Line<=pInput->bottom;Line++)
for(Col=pInput->left;Col<=pInput->right;Col++)
{
int GrayBak=PointGray(Col,Line);
if(GrayBak!=BorderGray&&GrayBak!=BkGray)
{
int Flag_=0;
int Bak_ =Col;
for(;Col<=pInput->right;Col++)
if(PointGray(Col,Line)==BkGray)
{ Flag_=1;break;}
if(!Flag_) continue;
//if(Col>pInput->right) continue;
}
/*// For Debug
if(Col==223&&Line==67)
this->NowPointNum=0;
// End
*/
if(PointGray(Col,Line)==BorderGray&&!this->Is_InSidePoint_For_4(Col,Line))
//if(PointGray(Col,Line)==BorderGray&&(Col<=0||Col>=(int)this->InfoHeader.biWidth-1||(PointGray(Col-1,Line)==BkGray||PointGray(Col+1,Line)==BkGray)))
{
Flag=1;
this->NowPointNum=0;
this->Detecting(*pInput_,Col,Line,&FlagTmp,IsFor_Left_Top_Out);
//For Debug
// this->NowPointNum=0;
//if(NowPointNum<=2)
//this->Detecting(Col,Line,&FlagTmp,IsFor_Left_Top_Out);
//Debug End
if(IsDrawing)
if(FlagTmp)
this->DrawBorder();
// Col=pInput->left;
// Line=pInput->top;
Col--;
//return TRUE;
}
}
if(!Flag) break;
}
return TRUE;
}
int Image_Identify::PointGray(int x, int y)
{
/*if(x<0||y<0) return -1;
if(x>(int)InfoHeader.biWidth-1||y>(int)InfoHeader.biHeight-1) return -1;
if (!pBits) return -1;
int TheGray=-1;
int NonCompressLineSize=LINE_BYTE(InfoHeader.biWidth);
BYTE*pTmp=NULL;
pTmp=pBits+y*(int)NonCompressLineSize+x; // Init The Point To The Line
TheGray=*pTmp;*/
if(x<0||y<0) return -1;
if(x>(int)InfoHeader.biWidth-1||y>(int)InfoHeader.biHeight-1) return -1;
if (!pBits) return -1;
int TheGray=-1;
int NonCompressLineSize=LINE_BYTE(InfoHeader.biWidth);
WORD *pTmp=NULL;
pTmp=pForProcess+(y*(int)NonCompressLineSize+x); // Init The Point To The Line
TheGray=*pTmp;
return TheGray;
}
BOOL Image_Identify::Detecting(RECT RectIn_,int Col,int Line,int* pReturnValue// if Some Object Out The Selected Rect You Selected it =0,else =1
,int IsFor_Left_Top_Out,int TheBorderGray,int BkGray)
{
CString StrTmp11;
BYTE *pTmp=NULL;
POINT *pPoint=NULL;
int Tmp=0,Flag=0;;
int x=Col,y=Line,i=0;
int x_=Col,y_=Line;
if(PointGray(x,y)!=TheBorderGray||this->Is_InSidePoint(x,y)) return FALSE;
// For Debug
NowPointNum=0;
CDesignView *pDesignView;
CMainFrame* pMFrame=(CMainFrame*)(AfxGetApp()->m_pMainWnd);
pDesignView=(CDesignView*)pMFrame->GetActiveView();
CClientDC ClDc(pDesignView);
// End
StartNeighbour=0;NowNeighbour=0;
pPoint=(POINT*)(pBorderPositionBuffer);//sizeof(POINT)*NowPointNum);
if(NowPointNum>=Buffer_Point_Num)// Detect Is Memory OverLoad
{
Buffer_Point_Num+=FIRST_POINT_BUFFER_NUM;
pTmp=new BYTE[Buffer_Point_Num*sizeof(POINT)];
if(!pTmp)
{
(AfxGetApp()->m_pMainWnd)->MessageBox("Memory Alloc Error,File--'Image_Identify.cpp',Function--Image_Identify::Detecting()","内存分配错误",MB_OK|MB_ICONERROR);
//(CFrameWnd*) (AfxGetApp()->m_pMainWnd)->SendMessage(WM_QUIT);
::AfxPostQuitMessage(0);
}
::memcpy(pTmp,pBorderPositionBuffer,NowPointNum*sizeof(POINT));
delete[] pBorderPositionBuffer;
pBorderPositionBuffer=pTmp;
pPoint=(POINT*)pBorderPositionBuffer;
}
pPoint[NowPointNum].x=Col;
pPoint[NowPointNum].y=Line;
// SetPointGray(pPoint[NowPointNum].x,pPoint[NowPointNum].y,BorderFlagGray);
/*
StrTmp11.Format("X=%d,Y=%d",pPoint[NowPointNum].x,pPoint[NowPointNum].y);
AfxMessageBox(StrTmp11);
ClDc.SetPixel(pPoint[NowPointNum],RGB(255,0,255));
*/
NowPointNum++;
while(PointGray(Order[StartNeighbour].x+x_,Order[StartNeighbour].y+y_)!=255)
{
StartNeighbour++;
if( StartNeighbour>7) break;
if(Order[StartNeighbour].x+x_<0||
Order[StartNeighbour].y+y_<0||
Order[StartNeighbour].x+x_>(int)InfoHeader.biWidth-1||
Order[StartNeighbour].y+y_>(int)InfoHeader.biHeight-1
)
break;
}
while(1)
{
Flag=0;
for(i=0;i<8;i++)// 8 Neighbour Rule
{
Tmp=StartNeighbour+i;
//NowNeighbour=Tmp-((Tmp>>3)<<3);// Cycle
NowNeighbour=Tmp&0x07;
x=this->Order[NowNeighbour].x+x_;
y=this->Order[NowNeighbour].y+y_;
//For Debug
/*
CString StrTmp2;
StrTmp2.Format("X=%d,Y=%d!",x,y);
AfxMessageBox(StrTmp2);
*/
if(x<0)
continue;
if(y<0)
continue;
if(x>(int)InfoHeader.biWidth-1)
// x=(int)InfoHeader.biWidth-1;
continue;
if(y>(int)InfoHeader.biHeight-1)
continue;
/* // For Debug
if(x==145&&y==104)
x=x;
// End
*/
if(x==Col&&y==Line)
{
/*
// For Debug
CString StrTmp1;
StrTmp1.Format("Closed");
AfxMessageBox(StrTmp1);
*/
break; // If Go To The First Point,then End the cycle--the While Cycle
}
if(PointGray(x,y)==TheBorderGray)
{
if(!Is_InSidePoint_For_4(x,y))
{
//For Debug
/*StrTmp11.Format("X=%d,Y=%d",x,y);
AfxMessageBox(StrTmp11);*/
//End
if(NowPointNum>=Buffer_Point_Num)// Detect Is Memory OverLoad
{
Buffer_Point_Num+=FIRST_POINT_BUFFER_NUM;
pTmp=new BYTE[Buffer_Point_Num*sizeof(POINT)];
if(!pTmp)
{
(AfxGetApp()->m_pMainWnd)->MessageBox("Memory Alloc Error,File--'Image_Identify.cpp',Function--Image_Identify::Detecting()","内存分配错误",MB_OK|MB_ICONERROR);
::AfxPostQuitMessage(0);
}
::memcpy(pTmp,pBorderPositionBuffer,NowPointNum*sizeof(POINT));
delete[] pBorderPositionBuffer;
pBorderPositionBuffer=pTmp;
pPoint=(POINT*)pBorderPositionBuffer;
}
pPoint[NowPointNum].x=x; //BackUp the Border Point
pPoint[NowPointNum].y=y;
// SetPointGray(pPoint[NowPointNum].x,pPoint[NowPointNum].y,BorderFlagGray);
/* //For Debug
StrTmp11.Format("X=%d,Y=%d",pPoint[NowPointNum].x,pPoint[NowPointNum].y);
AfxMessageBox(StrTmp11);
ClDc.SetPixel(pPoint[NowPointNum],RGB(255,0,255));
//End
*/
NowPointNum++;
Flag=1;
x_=x;y_=y;
//StartNeighbour=NowNeighbour+5>7?NowNeighbour-3:NowNeighbour+5;
StartNeighbour=(NowNeighbour+5)&0x07;
break;
}
}
}
if (!Flag)
{
/*
//For Debug
CString StrTmp;
StrTmp.Format("X=%d,Y=%d!",x,y);
AfxMessageBox(StrTmp);
*/
break;
}
}
pPoint[NowPointNum]=EndPoint;
NowPointNum++;
/* //For Debug
if(NowPointNum<=2)
{
CString StrTmp3;
StrTmp3.Format("%d,The Only One Point is X=%d,Y=%d!",NowPointNum,pPoint[0].x,pPoint[0].y);
AfxMessageBox(StrTmp3);
}*/
/*if(BorderFlagGray<255)
{
// Set The Border Flag
for(i=0;iSetPointGray(pPoint[i].x,pPoint[i].y,BorderFlagGray);
}
BorderFlagGray++;
// if(BorderFlagGray==255) BorderFlagGray=256;
}
else
(AfxGetApp()->m_pMainWnd)->MessageBox("Too Many Area Block 'Image_Identify.cpp',Function--Image_Identify::Detecting()","区域太多",MB_OK|MB_ICONERROR);
*/
for(i=0;iSetPointGray(pPoint[i].x,pPoint[i].y,BorderFlagGray);
}
// For Debug
/* CString StrTmp3;
StrTmp3.Format("The Total Point is X=%d",NowPointNum-1);
AfxMessageBox(StrTmp3);
*/
for(i=0;i(int)InfoHeader.biWidth-1||Line>(int)InfoHeader.biHeight-1) return -1;
int NonCompressLineSize=LINE_BYTE(InfoHeader.biWidth);
BYTE *pTmp=NULL;
pTmp=pBits+Line*(int)NonCompressLineSize+Col; // Init The Point To The Line
*pTmp=SetGray;
return TRUE;
*/
if (!pBits) FALSE;
if(Col<0||Line<0) return -1;
if(Col>(int)InfoHeader.biWidth-1||Line>(int)InfoHeader.biHeight-1) return -1;
int NonCompressLineSize=LINE_BYTE(InfoHeader.biWidth);
WORD *pTmp=NULL;
pTmp=pForProcess+(Line*(int)NonCompressLineSize+Col); // Init The Point To The Line
*pTmp=SetGray;
return TRUE;
}
BOOL Image_Identify::Is_InSidePoint(int x, int y, int Out)
{
int i=0;
int x_,y_;
for(i=0;i<8;i++)
{
x_=Order[i].x+x;
y_=Order[i].y+y;
if(x_<0)
return FALSE;
if(y_<0)
return FALSE;
if(x_>(int)InfoHeader.biWidth-1)
// x=(int)InfoHeader.biWidth-1;
return FALSE;
if(y_>(int)InfoHeader.biHeight-1)
//y=(int)InfoHeader.biHeight-1;
return FALSE;
if(PointGray(x_,y_)==Out)
return FALSE;
}
return TRUE;
}
void Image_Identify::DrawBorder()
{
POINT *pPoint=NULL;
CDesignView *pDesignView;
CMainFrame* pMFrame=(CMainFrame*)(AfxGetApp()->m_pMainWnd);
pDesignView=(CDesignView*)pMFrame->GetActiveView();
CClientDC ClDc(pDesignView);
POINT PointTmp[2];
CPoint OrgPoint;
OrgPoint=pDesignView->GetScrollPosition();
pPoint=(POINT*)(pBorderPositionBuffer);
for(int j=0;jmNowRatio>=0)
{
PointTmp[0].x=pPoint[j].x*pDesignView->mNowRatio;
PointTmp[0].y=pPoint[j].y*pDesignView->mNowRatio;
/*if(!j)
StrtPoint=PointTmp[0];*/
if(j+1>=NowPointNum-1)
{
PointTmp[1].x=pPoint[0].x*pDesignView->mNowRatio;
PointTmp[1].y=pPoint[0].y*pDesignView->mNowRatio;
}
else
{
PointTmp[1].x=pPoint[j+1].x*pDesignView->mNowRatio;
PointTmp[1].y=pPoint[j+1].y*pDesignView->mNowRatio;
}
}
else
{
PointTmp[0].x=pPoint[j].x/-pDesignView->mNowRatio;
PointTmp[0].y=pPoint[j].y/-pDesignView->mNowRatio;
if(j+1>=NowPointNum-1)
{
PointTmp[1].x=pPoint[0].x/-pDesignView->mNowRatio;
PointTmp[1].y=pPoint[0].y/-pDesignView->mNowRatio;
}
else
{
PointTmp[1].x=pPoint[j+1].x/-pDesignView->mNowRatio;
PointTmp[1].y=pPoint[j+1].y/-pDesignView->mNowRatio;
}
}
PointTmp[0].x-=OrgPoint.x;
PointTmp[0].y-=OrgPoint.y;
PointTmp[1].x-=OrgPoint.x;
PointTmp[1].y-=OrgPoint.y;
if(pPoint[j].x==EndPoint.x&&pPoint[j].y==EndPoint.y) break;
//ClDc.SetPixel(PointTmp,RGB(255,0,0));
//CPen newPen(PS_SOLID,1,RGB(255,125,100));
CPen newPen(PS_SOLID,1,RGB(255,0,255));
CPen *pOldPen=ClDc.SelectObject(&newPen);
ClDc.MoveTo(PointTmp[0]);
ClDc.LineTo(PointTmp[1]);
ClDc.SelectObject(pOldPen);
//ClDc.SetPixel(PointTmp[0],RGB(255,0,255));
if(NowPointNum<=2)
ClDc.SetPixel(PointTmp[0],RGB(255,0,255));
}
return;
}
BOOL Image_Identify::CopyToForProcess()
{
for(int i=0;i<(int)InfoHeader.biSizeImage;i++)
pForProcess[i]=pBits[i];
return TRUE;
}
BOOL Image_Identify::IsOutOfLeft_Top(RECT RectIn)
{
CDesignView *pDesignView;
CDesignDoc *pDoc;
CMainFrame* pMFrame=(CMainFrame*)(AfxGetApp()->m_pMainWnd);
pDesignView=(CDesignView*)pMFrame->GetActiveView();
pDoc=pDesignView->GetDocument();
POINT *pPoint=NULL;
pPoint=(POINT*)pBorderPositionBuffer;
for(int i=0;i(int)InfoHeader.biWidth-1)
// x=(int)InfoHeader.biWidth-1;
return FALSE;
if(y_>(int)InfoHeader.biHeight-1)
//y=(int)InfoHeader.biHeight-1;
return FALSE;
if(PointGray(x_,y_)==Out)
return FALSE;
}
return TRUE;
}
BOOL Image_Identify::Is_InLine(POINT Start, POINT End)
{
POINT *pPoint=(POINT*)pBorderPositionBuffer;
int i=0;
if (Start.x=End.x&&Start.y==End.y) return FALSE;
if(Start.x==End.x)
{
for(i=0;i=-WUCHA)
return TRUE;
}
return FALSE;
}
}
BOOL Image_Identify::Is_BetweenTwo(int x1, int x2, int in)
{
int max,min;
if(x1>x2)
{max=x1;min=x2;}
else
{max=x2;min=x1;}
if(in>=min&&in<=max)
return TRUE;
else
return FALSE;
}
int Image_Identify::BorderDetect_For_Lizijianju(POINT Start, POINT End, RECT *pInput_,int IsDrawing, int BorderGray, int BkGray)
{
int PointNum=0;
RECT *pInput=pInput_;
int FlagTmp=0;
NowPointNum=0;
BorderFlagGray=1;
ObjectNum=0;
POINT *pPoint=NULL;
if(!pInput_) return FALSE;
int Col,Line;
int Flag=0;
while(1)
{
Flag=0;
for(Line=pInput->top;Line<=pInput->bottom;Line++)
for(Col=pInput->left;Col<=pInput->right;Col++)
{
int GrayBak=PointGray(Col,Line);
if(GrayBak!=BorderGray&&GrayBak!=BkGray)
{
int Flag_=0;
int Bak_ =Col;
for(;Col<=pInput->right;Col++)
if(PointGray(Col,Line)==BkGray)
{ Flag_=1;break;}
if(!Flag_) continue;
//if(Col>pInput->right) continue;
}
/*// For Debug
if(Col==223&&Line==67)
this->NowPointNum=0;
// End
*/
if(PointGray(Col,Line)==BorderGray&&!this->Is_InSidePoint_For_4(Col,Line))
//if(PointGray(Col,Line)==BorderGray&&(Col<=0||Col>=(int)this->InfoHeader.biWidth-1||(PointGray(Col-1,Line)==BkGray||PointGray(Col+1,Line)==BkGray)))
{
Flag=1;
this->NowPointNum=0;
this->Detecting(*pInput_,Col,Line,&FlagTmp,0);
//For Debug
// this->NowPointNum=0;
//if(NowPointNum<=2)
//this->Detecting(Col,Line,&FlagTmp,IsFor_Left_Top_Out);
if(Is_InLine(Start,End))
PointNum++;
//Debug End
if(IsDrawing)
this->DrawBorder();
// Col=pInput->left;
// Line=pInput->top;
Col--;
//return TRUE;
}
}
if(!Flag) break;
}
return PointNum;
}
void Image_Identify::Swap_int(int& x1, int& x2)
{
int Tmp=x1;
x1=x2;
x2=Tmp;
return;
}
int Image_Identify::BorderDetect_For_LiZiZhiJing(RECT *pInput_, int IsFor_Left_Top_Out, int IsDrawing, int BorderGray, int BkGray)
{
CDesignView *pDesignView;
CDesignDoc *pDoc;
CMainFrame* pMFrame=(CMainFrame*)(AfxGetApp()->m_pMainWnd);
pDesignView=(CDesignView*)pMFrame->GetActiveView();
pDoc=pDesignView->GetDocument();
RECT *pInput=pInput_;
int FlagTmp=0;
NowPointNum=0;
BorderFlagGray=1;
ObjectNum=0;
POINT *pPoint=NULL;
if(!pInput_) return FALSE;
int Col,Line;
int Flag=0;
while(1)
{
Flag=0;
for(Line=pInput->top;Line<=pInput->bottom;Line++)
for(Col=pInput->left;Col<=pInput->right;Col++)
{
int GrayBak=PointGray(Col,Line);
if(GrayBak!=BorderGray&&GrayBak!=BkGray)
{
int Flag_=0;
int Bak_ =Col;
for(;Col<=pInput->right;Col++)
if(PointGray(Col,Line)==BkGray)
{ Flag_=1;break;}
if(!Flag_) continue;
//if(Col>pInput->right) continue;
}
/*// For Debug
if(Col==223&&Line==67)
this->NowPointNum=0;
// End
*/
if(PointGray(Col,Line)==BorderGray&&!this->Is_InSidePoint_For_4(Col,Line))
//if(PointGray(Col,Line)==BorderGray&&(Col<=0||Col>=(int)this->InfoHeader.biWidth-1||(PointGray(Col-1,Line)==BkGray||PointGray(Col+1,Line)==BkGray)))
{
Flag=1;
this->NowPointNum=0;
this->Detecting(*pInput_,Col,Line,&FlagTmp,IsFor_Left_Top_Out);
if(ObjectNum>0)
pDesignView->pPara_Detect->AreaPoint[ObjectNum-1]
=GetAcreagePointNum();
//For Debug
// this->NowPointNum=0;
//if(NowPointNum<=2)
//this->Detecting(Col,Line,&FlagTmp,IsFor_Left_Top_Out);
//Debug End
if(IsDrawing)
if(FlagTmp)
this->DrawBorder();
// Col=pInput->left;
// Line=pInput->top;
Col--;
//return TRUE;
}
}
if(!Flag) break;
}
// return GetAcreagePointNum();
return ObjectNum;
}
int Image_Identify::GetAcreagePointNum(void)
{
CDesignView *pDesignView;
CDesignDoc *pDoc;
CMainFrame* pMFrame=(CMainFrame*)(AfxGetApp()->m_pMainWnd);
pDesignView=(CDesignView*)pMFrame->GetActiveView();
pDoc=pDesignView->GetDocument();
CClientDC CcDc(pDesignView);
int PointNum_=0;
int line;//col;
int Start,End;
RECT TheRect;
Get_Left_Top_And_Right_Bottom(TheRect);
pDesignView->pPara_Detect->DrawRect(&CcDc,TheRect,RGB(128,128,128));
for(line=TheRect.top;line<=TheRect.bottom;line++)
{
//for(col=TheRect.left;col<=TheRect.right;col++)
GetLineColRange(Start,End,line);
PointNum_+=End-Start+1;
}
return PointNum_;
}
void Image_Identify::Get_Left_Top_And_Right_Bottom(RECT &L_T_AND_R_B)
{
int i=0;
POINT *pPoint=(POINT*)pBorderPositionBuffer;
L_T_AND_R_B.left=L_T_AND_R_B.right=pPoint[i].x;
L_T_AND_R_B.top=L_T_AND_R_B.bottom=pPoint[i].y;
for(i=0;ipPoint[i].x)
L_T_AND_R_B.left=pPoint[i].x;
if(L_T_AND_R_B.top>pPoint[i].y)
L_T_AND_R_B.top=pPoint[i].y;
if(L_T_AND_R_B.rightpPoint
Start=pPoint[i].x;
End=pPoint[i].x;
break;
}
}
for(;ipPoint[i].x)
Start=pPoint[i].x;
if(End