www.pudn.com > 44757463.rar > GlobalFunction.cpp


#include "GlobalFunction.h" 
#include "stdafx.h" 
#include "math.h" 
#include "GraphDefines.h" 
///////////////////////////////////////////////////////// 
CRect GetRectFromPoint(CPoint pt1,CPoint pt2) 
{ 
	CRect rect; 
	rect.left=(pt1.x<=pt2.x?pt1.x:pt2.x); 
	rect.right=(pt1.x<=pt2.x?pt2.x:pt1.x); 
	rect.top=(pt1.y<=pt2.y?pt1.y:pt2.y); 
	rect.bottom=(pt1.y<=pt2.y?pt2.y:pt1.y); 
	//TRACE("%d,%d|%d,%d\n",rect.left,rect.right,rect.top,rect.bottom); 
	return rect; 
} 
/////////////////////////////////////////////////////////// 
//function      GetAngleFromPoints(...) 
// 
//            ptCenter 
//            \----/--------------------------|ptStart 
//             \  /flRlt 
//              \/ 
//               \ 
//                \ 
//                 \ 
//                  \  
//                   \|ptEnd 
// 
////////////////////////////////////////////////////////////// 
float GetAngleFromPoints(CPoint ptCenter,CPoint ptStart,CPoint ptEnd) 
{ 
	float flRlt,flAtanA,flAtanB; 
	if(ptStart.x==ptCenter.x){ 
		if(ptStart.x>ptCenter.x){ 
			flAtanA=PI/2; 
		}else if(ptStart.xptCenter.x){ 
			flAtanB=PI/2; 
		}else if(ptEnd.x0&&ptStart.x-ptCenter.x<0){ 
			flAtanA+=PI; 
		} 
		if(ptStart.y-ptCenter.y<=0&&ptStart.x-ptCenter.x<0){ 
			flAtanA+=PI; 
		} 
		if(ptEnd.y-ptCenter.y>0&&ptEnd.x-ptCenter.x<0){ 
			flAtanB+=PI; 
		} 
		if(ptEnd.y-ptCenter.y<=0&&ptEnd.x-ptCenter.x<0){ 
			flAtanB+=PI; 
		}				 
	} 
	flRlt=flAtanB-flAtanA; 
	TRACE("%f\n",flRlt); 
	return flRlt; 
} 
float GetAngleFromPoints(float x2,float y2,float x1,float y1,float x3,float y3) 
{ 
	float flRlt,flAtanA,flAtanB; 
	if(x1==x2){ 
		if(x1>x2){ 
			flAtanA=PI/2; 
		}else if(x1x2){ 
			flAtanB=PI/2; 
		}else if(x30&&x1-x2<0){ 
			flAtanA+=PI; 
		} 
		if(y1-y2<=0&&x1-x2<0){ 
			flAtanA+=PI; 
		} 
		if(y3-y2>0&&x3-x2<0){ 
			flAtanB+=PI; 
		} 
		if(y3-y2<=0&&x3-x2<0){ 
			flAtanB+=PI; 
		}				 
	} 
	flRlt=flAtanB-flAtanA; 
	TRACE("%f\n",flRlt); 
	return flRlt; 
} 
/////////////////////////////////////////////////////////////////////// 
float GetDistance(CPoint ptStart, CPoint ptEnd) 
{ 
	float flRlt; 
	flRlt=(ptStart.x-ptEnd.x)*(ptStart.x-ptEnd.x)+(ptStart.y-ptEnd.y)*(ptStart.y-ptEnd.y); 
	flRlt=sqrt(flRlt); 
	return flRlt; 
} 
float GetDistance(float flStartx,float flStarty,float flEndx,float flEndy) 
{ 
	float flRlt; 
	flRlt=(flStartx-flEndx)*(flStartx-flEndx)+(flStarty-flEndy)*(flStarty-flEndy); 
	flRlt=sqrt(flRlt); 
	return flRlt; 
} 
/////////////////////////////////////////////////////////////////////// 
////////////////////////////////////////////////////// 
//function-----GetPointStateToRect 
//return value  rtval 
//reval = 0------------in 
//reval & 1 != 0-------left 
//reval & 2 != 0-------right 
//reval & 4 != 0-------top 
//reval & 8 != 0-------bottom 
////////////////////////////////////////////////////// 
int GetPointStateToRect(float x,float y,CRect rectRes) 
{ 
    int val=0; 
	if(xrectRes.right) val=2; 
	if(yrectRes.bottom) val=val+8; 
	return val; 
} 
////////////////////////////////////////////////////// 
///////////////////////////////////////////// 
//function------GetLineStateToRect 
//return value 
//0----------out 
//1----------cut 
//2----------in 
///////////////////////////////////////////// 
//////// 
int GetLineStateToRect(float flStartx,float flStarty,float flEndx,float flEndy,CRect rect) 
{ 
	int nRtVal=0; 
	int nPtStartState,nPtEndState;      
	 
	nPtStartState = GetPointStateToRect(flStartx,flStarty, rect); 
	nPtEndState = GetPointStateToRect(flEndx,flEndy,rect); 
    if(nPtStartState == 0 && nPtEndState == 0){//in 
		nRtVal=2; 
    } 
	else if(nPtStartState == 0 || nPtEndState == 0){//cut 
		nRtVal=1; 
    } 
	else if((nPtStartState & nPtEndState) != 0){	//out  
		nRtVal=0; 
	}else{ 
		//中点对分法 
		int nTemp; 
		float Startx,Starty,Endx,Endy,Tempx,Tempy;		 
		Startx=flStartx; 
		Starty=flStarty; 
		Endx=flEndx; 
		Endy=flEndy; 
		Tempx=(flStartx+flEndx)/2; 
		Tempy=(flStarty+flEndy)/2; 
		 
		nTemp=GetPointStateToRect(Tempx,Tempy,rect);         
		while(1){ 
			if(nTemp == 0){ 
				nRtVal=1; 
				break; 
			}			 
			if(nTemp&nPtStartState){ 
				Startx=Tempx; 
				Starty=Tempy; 
				nPtStartState=nTemp; 
				Tempx=(Startx+Endx)/2; 
				Tempy=(Starty+Endy)/2;				 
				nTemp=GetPointStateToRect(Tempx,Tempy,rect);				 
			} 
			if(nTemp&nPtEndState){ 
                Endx=Tempx; 
				Endy=Tempy; 
				nPtEndState=nTemp; 
				Tempx=(Startx+Endx)/2; 
				Tempy=(Starty+Endy)/2;				 
				nTemp=GetPointStateToRect(Tempx,Tempy,rect);				 
			} 
			if(abs(Startx-Endx)<1 && abs(Starty-Endy)<1){ 
				nRtVal=0; 
				break; 
			} 
		}//while(1) 
	}//else 
    return nRtVal; 
} 
///////// 
int GetLineStateToRect(CPoint ptStart,CPoint ptEnd,CRect rect) 
{ 
	return GetLineStateToRect(ptStart.x,ptStart.y,ptEnd.x,ptEnd.y,rect); 
} 
/////////////////// 
void DrawLine(CDC* pDC,CPoint ptStart,CPoint ptEnd,COLORREF color,int penWidth,UINT nStyle ) 
{ 
	CPen pen,*poldPen; 
	LOGBRUSH logbr; 
	//logbr.lbStyle=BS_SOLID; 
	logbr.lbStyle=nStyle; 
	logbr.lbColor=color;	 
	pen.CreatePen(PS_GEOMETRIC,penWidth, &logbr);	  
	poldPen=pDC->SelectObject(&pen);       
	 
	pDC->MoveTo(ptStart); 
	pDC->LineTo(ptEnd); 
	 
	pDC->SelectObject(poldPen); 
} 
void DrawLine(CDC* pDC,float flSX,float flSY,float flEX,float flEY,COLORREF color,int penWidth,UINT nStyle ) 
{ 
	CPoint ptS(flSX,flSY); 
	CPoint ptE(flEX,flEY); 
	DrawLine(pDC,ptS,ptE,color,penWidth,nStyle); 
} 
////////////////////////////////////////// 
////////////////////////////////////////////////////////////// 
// 
// 
//                     o     o 
//   ptCenter ----------->o 
//                     o     o 
// 
////////////////////////////////////////////////////////////// 
void DrawOutRectPoint(CDC *pDC,CPoint ptCenter,COLORREF color) 
{	 
	pDC->SetPixel(ptCenter.x-1,ptCenter.y-1,color); 
	pDC->SetPixel(ptCenter.x-1,ptCenter.y+1,color); 
	pDC->SetPixel(ptCenter.x+1,ptCenter.y-1,color); 
	pDC->SetPixel(ptCenter.x+1,ptCenter.y+1,color); 
	return; 
} 
void DrawOutRectPoint(CDC *pDC,float flx,float fly,COLORREF color) 
{ 
	CPoint pt(flx,fly); 
	DrawOutRectPoint(pDC,pt,color); 
} 
/////////////////////////////////////////////////////////////// 
int BezierCurve(CDC *pDC,CPoint ptArray[],int n) 
{	 
	float *pflX,*pflY;  
	float flTempx,flTempy,flU;//flu-------u参数	 
	int i,j;  	 
 
	if(n<2) return 0;  
	 
	pflX=new float[n]; 
	pflY=new float[n]; 
	 
	flTempx=ptArray[0].x; 
	flTempy=ptArray[0].y; 
	for(i=0;iMoveTo(flTempx,flTempy); 
		pDC->LineTo(pflX[0],pflY[0]); 
		flTempx=pflX[0]; 
		flTempy=pflY[0]; 
	} 
	 
	delete[] pflX; 
	delete[] pflY; 
	 
	return 1; 
} 
///////////////////////////// 
//////////////// 
//辅助函数 
//return value 
//0------out 
//1------on line 
/////////////// 
int GetPtStateToBigLine(float flSx,float flSy,float flEx,float flEy,float flEnlarge,float x,float y) 
{ 
	//on the outline 
	float flFirstx,flFirsty,flSecondx,flSecondy,flThirdx,flThirdy,flForthx,flForthy; 
     
	flFirstx=flSx-flEnlarge; 
	flFirsty=flSy; 
	flSecondx=flSx+flEnlarge; 
	flSecondy=flSy; 
	flThirdx=flEx+flEnlarge; 
	flThirdy=flEy; 
	flForthx=flEx-flEnlarge; 
	flForthy=flEy;		 
	if(fabs(flSy-flEy)<15){ 
		flFirsty+=2*flEnlarge;	 
		flSecondy-=2*flEnlarge;	 
		flThirdy-=2*flEnlarge;	 
		flForthy+=2*flEnlarge;	 
	} 
	int nRltVal=0;	 
	if(y>min(flFirsty,flSecondy)&&y=x){ 
			nRltVal+=1; 
		} 
	} 
	if(y>min(flThirdy,flSecondy)&&y=x){ 
			nRltVal+=1; 
		} 
	} 
	if(y>min(flThirdy,flForthy)&&y=x){ 
			nRltVal+=1; 
		} 
	} 
	if(y>min(flFirsty,flForthy)&&y=x){ 
			nRltVal+=1; 
		} 
	} 
	if(nRltVal==1){		  
		return 1; 
	} 
	return 0; 
} 
///////////////////////////////////////////// 
 
////////////////////////////////////////////////////////////////////// 
// MODULE   :GetCutPtFrom2Line 
// ABSTRACT :取得两相交直线的交点 
// FUNCTION :在编辑图形时,组成边的移动 
// NOTE     : 
// RETURN   :返回是否成功得到交点,1--成功 
// ARGUMENTS: 
//              I/O           TYPE      NAME       EXPLANATION 
//               O            CPoint*   pPtRtn     返回交点           
// CREATE   :  FNST)handwolf  2004-4-13 
// UPDATE   :   
//          : Modify reason 
////////////////////////////////////////////////////////////////////// 
 
int GetCutPtFrom2Line(CPoint pt1,CPoint pt2,CPoint pt3,CPoint pt4,CPoint* pPtRtn) 
{ 
	float x1,x2,x3,x4,y1,y2,y3,y4; 
	float a1,b1,a2,b2; 
 
	x1=pt1.x; 
	x2=pt2.x; 
	x3=pt3.x; 
	x4=pt4.x; 
	y1=pt1.y; 
	y2=pt2.y; 
	y3=pt3.y; 
	y4=pt4.y; 
 
	if(x1==x2&&x3==x4){ 
		return 0; 
	}	 
 
	if(x1 == x2 ){ 
		a2=(y3-y4)/(x3-x4); 
		b2=y3-a2*x3; 
		((CPoint*)pPtRtn)->x=x1; 
        ((CPoint*)pPtRtn)->y=a2*x1+b2; 
		return 1; 
	} 
	if(x3 == x4 ){ 
		a1=(y1-y2)/(x1-x2); 
		b1=y1-a1*x1; 
		((CPoint*)pPtRtn)->x=x3; 
        ((CPoint*)pPtRtn)->y=a1*x3+b1; 
		return 1; 
	} 
 
	a1=(y1-y2)/(x1-x2); 
	b1=y1-a1*x1; 
	a2=(y3-y4)/(x3-x4); 
	b2=y3-a2*x3; 
	if(a1==a2){ 
		return 0; 
	} 
	((CPoint*)pPtRtn)->x=(b2-b1)/(a1-a2); 
	((CPoint*)pPtRtn)->y=a1*(b2-b1)/(a1-a2)+b1; 
 
	return 1; 
} 
int GetCutPtFrom2Line(float x[],float y[],float *xR,float *yR) 
{ 
	 
	float a1,b1,a2,b2; 
	 
	 
	if(fabs(x[0]-x[1])<0.001&&abs(x[2]-x[3])<0.001){ 
		return 0; 
	}		 
	if(fabs(x[0]-x[1])<0.001 ){ 
		a2=(y[2]-y[3])/(x[2]-x[3]); 
		b2=y[2]-a2*x[2]; 
		*xR=x[0]; 
        *yR=a2*x[1]+b2; 
		return 1; 
	} 
	if(fabs(x[2]-x[3])<0.001 ){ 
		a1=(y[0]-y[1])/(x[0]-x[1]); 
		b1=y[0]-a1*x[0]; 
	    *xR=x[2]; 
        *yR=a1*x[2]+b1; 
		return 1; 
	} 
	 
	a1=(y[0]-y[1])/(x[0]-x[1]); 
	b1=y[0]-a1*x[0]; 
	a2=(y[2]-y[3])/(x[2]-x[3]); 
	b2=y[2]-a2*x[2]; 
	if(a1==a2){ 
		return 0; 
	} 
	*xR=(b2-b1)/(a1-a2); 
	*yR=a1*(b2-b1)/(a1-a2)+b1;	 
	return 1; 
} 
////////////////////////////////////////////////////////////////////// 
// MODULE   :GetDisFromPtToLine 
// ABSTRACT :取得点到直线的距离 
// FUNCTION :在编辑图形时,椭圆 
// NOTE     : 
// RETURN   :距离 
// ARGUMENTS: 
//              I/O           TYPE      NAME       EXPLANATION 
//                
// CREATE   :  FNST)handwolf  2004-4-13 
// UPDATE   :  
//          : Modify reason 
////////////////////////////////////////////////////////////////////// 
 
float GetDisFromPtToLine(CPoint point,CPoint ptLineS,CPoint ptLineE) 
{ 
	if(point==ptLineS||point==ptLineE||ptLineE==ptLineS){ 
		return 0; 
	} 
 
	if(ptLineS.x==ptLineE.x){ 
		return fabs(point.x-ptLineS.x); 
	} 
	float a,b; 
	float x1,y1,x2,y2; 
	//y=a*x+b; 
	x1=ptLineS.x; 
	x2=ptLineE.x; 
	y1=ptLineS.y; 
	y2=ptLineE.y; 
	a=(y2-y1)/(x2-x1); 
    b=y1-a*x1; 
	//ax-y+b=0; 
	float flRlt; 
	flRlt=fabs(point.y-a*point.x-b)/sqrt(1+a*a); 
 
	TRACE("Dis=%f\n",flRlt); 
	return flRlt; 
} 
float GetDisFromPtToLine(float x,float y,float Sx,float Sy,float Ex,float Ey) 
{ 
	if((fabs(x-Sx)<0.5&&fabs(y-Sy)<0.5)||(fabs(x-Ex)<0.5&&fabs(y-Ey)<0.5)||(fabs(Ex-Sx)<0.5&&fabs(Ey-Sy)<0.5)){ 
		return 0; 
	} 
	 
	if(Sx==Ex){ 
		return fabs(x-Sx); 
	}  
	float a,b; 
	float x1,y1,x2,y2; 
	//y=a*x+b; 
	x1=Sx; 
	x2=Ex; 
	y1=Sy; 
	y2=Ey; 
	a=(y2-y1)/(x2-x1); 
    b=y1-a*x1; 
	//ax-y+b=0; 
	float flRlt; 
	flRlt=fabs(y-a*x-b)/sqrt(1+a*a); 
	 
	TRACE("Dis=%f\n",flRlt); 
	return flRlt; 
} 
//////////////////////////////////////////////////////////////////////////////// 
float GetLineRate(float flx1,float fly1,float flx2,float fly2) 
{ 
	if(fabs(flx1-flx2)<0.1){ 
		return 1000;// 
	} 
	TRACE("Rate=%f\n",(fly1-fly2)/(flx1-flx2)); 
	return (fly1-fly2)/(flx1-flx2); 
} 
 
float GetLineRate(CPoint ptS,CPoint ptE) 
{ 
	return  GetLineRate(ptS.x , ptS.y ,ptE.x ,ptE.y ); 
 
} 
 
/////////////////////////////////////////////////////////////// 
bool IsPtInRect(float left,float top,float right,float bottom,float x,float y) 
{	  
	if(xright) 
		return false; 
	if(ybottom) 
		return false; 
	return true; 
} 
///////////////////////////////////////////////////////////////////////////////// 
 
////////////////////////////////////////////////////////////////////// 
// MODULE   :GetShapeClass 
// ABSTRACT :Get a pointer point to a CShape type object By ClassName 
// FUNCTION :File->Import... 
// NOTE     : 
// RETURN   : a pointer point to a CShape type object 
// ARGUMENTS: 
//              I/O           TYPE      NAME           EXPLANATION 
//               I             char*    pChClassName   name of class 
// CREATE   :  FNST)handwolf  2004-4-14 
// UPDATE   :  
//          :  
////////////////////////////////////////////////////////////////////// 
class CShape; 
CShape* GetShapeClass(CString strClassName) 
{ 
	CRuntimeClass *pClass; 
	CShape *pShape=NULL; 
	AFX_MODULE_STATE* pModuleState = AfxGetModuleState(); 
//	AfxLockGlobals(CRIT_RUNTIMECLASSLIST);    
	for(pClass = pModuleState->m_classList;pClass!=NULL;pClass=pClass->m_pNextClass){ 
		if(strClassName.Compare(pClass->m_lpszClassName)==0){ 
			pShape=(CShape*)(pClass->CreateObject()); 
		} 
	} 
	return pShape; 
} 
///////////////////////////////////////////////////////////////////////////////////