www.pudn.com > DrawVector.rar > Arc.cpp


// Arc.cpp: implementation of the CArc class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
//#include "Draw.h" 
#include "Arc.h" 
#include "math.h" 
//#include "DrawDoc.h" 
#define pi 3.1415926 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
extern IsRectCross(float minx,float miny,float maxx,float maxy); 
//extern  CGraphPara *p_GraphPara; 
 
//CArc::CArc(); 
 
//float xMinScreen,yMinScreen,xMaxScreen,yMaxScreen; 
 
//BOOL IsRectCross(float minx,float miny,float maxx,float maxy); 
//BOOL IsRectCross(float minx,float miny,float maxx,float maxy) 
//{ 
//	if(minx>xMaxScreen||maxxyMaxScreen||maxyGetColor(ColorPen)); 
	CPen* pOldPen=pDC->SelectObject(&pen); 
	if(m_DrawMode==0) 
		pDC->SetROP2(R2_COPYPEN); 
	else if(m_DrawMode==1) 
		pDC->SetROP2(R2_NOT); 
	DPtoVP(m_CircleX,m_CircleY,&x,&y); 
	rr=DLtoVL(m_CircleR); 
	x1=(int)(x+(DLtoVL(m_CircleR*cos(m_Angle1)))); 
	y1=(int)(y-DLtoVL(m_CircleR*sin(m_Angle1))); 
	x2=(int)(x+DLtoVL(m_CircleR*cos(m_Angle2))); 
	y2=(int)(y-DLtoVL(m_CircleR*sin(m_Angle2))); 
 //   Invalidate(); 
 
	pDC->Arc(x-rr,y-rr,x+rr,y+rr,x1,y1,x2,y2); 
	pDC->SelectObject(pOldPen); 
} 
 
void CArc::GetRect(float* minX,float* minY,float* maxX,float* maxY) 
{ 
	float x,y,x1,y1,x2,y2; 
	int i,pb; 
	//得到圆弧的起点坐标 
	x=m_CircleX+(float)(cos(m_Angle1)*m_CircleR); 
	y=m_CircleY+(float)(sin(m_Angle1)*m_CircleR); 
	//用圆弧起点坐标来初始化边界矩形 
	x1=x;y1=y; 
	x2=x;y2=y; 
	//得到圆弧的中终点坐标 
	x=m_CircleX+(float)(cos(m_Angle2)*m_CircleR); 
	y=m_CircleY+(float)(sin(m_Angle2)*m_CircleR); 
	//得到最小和最大坐标 
	x1=min(x,x1);x2=max(x,x2); 
	y1=min(y,y1);y2=max(y,y2); 
	for(i=0;i<4;i++) 
	{ 
		if(IsInArc(pi/2*i)) 
		{ 
			if(i==0) 
			{ 
				x=m_CircleX+m_CircleR; 
				y=m_CircleY; 
			} 
			else if(i==1) 
			{ 
				x=m_CircleX; 
				y=m_CircleY+m_CircleR; 
			} 
			else if(i==2) 
			{ 
				x=m_CircleX-m_CircleR; 
				y=m_CircleY; 
			} 
			else if(i==3) 
			{ 
				x=m_CircleX; 
				y=m_CircleY-m_CircleR; 
			} 
			x1=min(x,x1);x2=max(x,x2); 
			y1=min(y,y1);y2=max(y,y2); 
		} 
	} 
	*minX=x1;*maxX=x2;*minY=y1;*maxY=y2; 
 
} 
 
void CArc::CalLong() 
{ 
	float angle=m_Angle2; 
	if(this->m_Angle2m_Angle1) 
		angle+=pi*2; 
	CCircle::CalLong(); 
	m_fLong=m_fLong*(angle-m_Angle1)/(pi*2); 
} 
BOOL CArc::IsInArc(float angle) 
{ 
	if((m_Angle1=m_Angle1)|| 
		m_Angle1>m_Angle2&&(!(angle<=m_Angle1&&angle>=m_Angle2))) 
		return TRUE; 
	else 
		return FALSE; 
} 
BOOL CArc::IsPoint(float x,float y,float j1,float blc) 
{ 
	if(CCircle::IsPoint(x,y,j1,blc))//调用CCircle类的IsPoint函数判断是否选中了圆 
	{ 
		float xx=CalDisp(x,y,m_CircleX,m_CircleY); 
		float ang=(float)acos((x-m_CircleX)/xx); 
		if(y-m_CircleY<0) 
			ang=(float)pi*2-ang; 
		if(IsInArc(ang)) 
			return TRUE; 
	} 
	return FALSE; 
} 
 
void CArc::Move(float x_Move,float y_Move) 
{ 
	CCircle::Move(x_Move,y_Move); 
} 
 
void CArc::Rotate(float baseX,float baseY,float angle) 
{ 
	RotatePoint(baseX,baseY,angle,&this->m_CircleX,&this->m_CircleY); 
	this->m_Angle1+=angle; 
	this->m_Angle2+=angle; 
} 
 
CArc::~CArc() 
{ 
 
}