⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 circle.cpp

📁 绘完直线、矩形、圆和圆弧后
💻 CPP
字号:
#include "stdafx.h"
#include "math.h"

#include "VCad.h"
#include "VCadDoc.h"
#include "VCadView.h"

#include "Entity.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

//////////////////////////
//	CLASS	CCircle

IMPLEMENT_SERIAL(CCircle, CEntity, 0)

CCircle::CCircle()
{
	Init();
}

CCircle::CCircle(const CCircle& circle)
	: CEntity(circle)
{
	m_center = circle.m_center ;
	m_dRadius = circle.m_dRadius ;
}
CCircle::CCircle(const Position& center,const double& radius)
{
	Init();
	m_center = center ;
	m_dRadius = radius ;
}
CCircle::CCircle(const Position& center,const Position& around)
{
	Init();
	m_center = center ;

	m_dRadius = m_center.Distance(around) ;
}

CCircle::~CCircle()
{
}

CEntity*	CCircle::Copy()
{
	CCircle*	pEntity = new CCircle(m_center, m_dRadius);
	return pEntity;
}

void CCircle::Init()
{
	CEntity::Init();
	m_type = etCircle;
	m_center.Init();
	m_dRadius = 0 ;
}

int	CCircle::GetType()
{
	return etCircle;
}

Position CCircle::GetCenterPos()
{
	return m_center;
}

double CCircle::GetRadius()
{
	return m_dRadius;
}
///////////
///////////////

void CCircle::Draw(CDC * pDC, int drawMode /* = dmNormal */)
{
	Position ltpos(m_center.x - m_dRadius, m_center.y + m_dRadius ) ;
	Position rbpos(m_center.x + m_dRadius, m_center.y - m_dRadius ) ;
	CPoint ssp, sep, scenp;

	g_pView->WorldtoScreen(ltpos,ssp) ;
	g_pView->WorldtoScreen(rbpos,sep) ;
	g_pView->WorldtoScreen(m_center, scenp) ;	

	int		n = GetROP2(pDC->GetSafeHdc());
	// create a pen by following rules:
	// if in normal draw mode, create a pen by its member variables 
	// if else, create a pen using global funtion "SetDrawEnvir"
	CPen	pen; 
	if( drawMode == dmNormal ) 
		pen.CreatePen(m_lineStyle,m_lineWidth,m_color) ;
	else
		::SetDrawEnvir(pDC, drawMode, &pen);

	CPen* pOldPen = pDC->SelectObject(&pen) ;
	pDC->SetMapMode(MM_LOENGLISH); 
	pDC->SelectStockObject(NULL_BRUSH) ;
	pDC->Ellipse(ssp.x, ssp.y, sep.x, sep.y) ;
	pDC->SelectObject(pOldPen) ;
	pDC->SetROP2(n);
}
BOOL CCircle::Pick(const Position& pos, const double pick_radius) 
{
	Position objPos = pos;
	BOX2D sourceBox,desBox;
	GetBox(&sourceBox); // 得到直线段的最小包围盒
	// 将最小包围盒向四周放大,得到测试包围盒
	desBox.min[0] = sourceBox.min[0] - pick_radius;
	desBox.min[1] = sourceBox.min[1] - pick_radius;
	desBox.max[0] = sourceBox.max[0] + pick_radius;
	desBox.max[1] = sourceBox.max[1] + pick_radius;
	// 判断拾取点是否在测试包围盒中,如果不是,则图元未被选中
	if( !objPos.IsInBox(desBox) )
		return FALSE;

	double r = m_center.Distance(pos) ;
	if(fabs(r - m_dRadius) <= 50 * pick_radius)
		return TRUE ;
	return FALSE ;
}

void CCircle::Move(const Position& basePos,const Position& desPos) 
{
	m_center = m_center.Offset(desPos - basePos);
}

void CCircle::Rotate(const Position& basePos, const double angle)
{
	m_center = m_center.Rotate(basePos, angle) ;
}

void CCircle::Mirror(const Position& pos1, const Position& pos2)
{
	m_center = m_center.Mirror(pos1, pos2) ;
}
	
void CCircle::GetBox(BOX2D* pBox)
{
	pBox->min[0] = ( m_center.x -  m_dRadius );
	pBox->min[1] = ( m_center.y -  m_dRadius );
	pBox->max[0] = ( m_center.x +  m_dRadius );
	pBox->max[1] = ( m_center.y +  m_dRadius );
}

void CCircle::Serialize(CArchive& ar) 
{
	CEntity::Serialize(ar);
	m_center.Serialize(ar);
	if(ar.IsStoring())
		ar<<m_dRadius ;
	else
		ar>>m_dRadius ;
}

⌨️ 快捷键说明

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