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

📄 circleobj.cpp

📁 参数化车间设备资源绘制程序
💻 CPP
字号:

//Circle.cpp 图形元圆类的实现文档
#include "StdAfx.h"
#include ".\circleobj.h"
#include "visdrawview.h"
#include "visdrawdoc.h"

#include <math.h>

IMPLEMENT_SERIAL(CCircleObj, CFigureObj, 0)

CCircleObj::CCircleObj(void)
{
}

CCircleObj::~CCircleObj(void)
{
}
CCircleObj::CCircleObj(const CRect& position)
		: CFigureObj(position)
{
	ASSERT_VALID(this);	
	m_CenterPointx = 0.0;
	 m_CenterPointy = 0.0;
	m_Radium = 0.0;//半径
	
}

void CCircleObj::Draw(CVisDrawView* pView, CDC* pDC)
{
	ASSERT_VALID(this);

	//创建画刷
	CBrush brush;
	if (!brush.CreateBrushIndirect(&m_logbrush))
		return;
	//创建画笔
	CPen pen;
	if (!pen.CreatePenIndirect(&m_logpen))
		return;

	//设置DC
	CBrush* pOldBrush;
	CPen* pOldPen;

	if (m_bBrush)
		pOldBrush = pDC->SelectObject(&brush);
	else
		pOldBrush = (CBrush*)pDC->SelectStockObject(NULL_BRUSH);

	if (m_bPen)
		pOldPen = pDC->SelectObject(&pen);
	else
		pOldPen = (CPen*)pDC->SelectStockObject(NULL_PEN);

	//用圆的外接矩形绘制圆
	
	CRect rect = CalcBounds(pView);
		
	pDC->Ellipse(rect);

	//恢复DC
	pDC->SelectObject(pOldBrush);
	pDC->SelectObject(pOldPen);
}

void CCircleObj::Serialize(CArchive& ar)
{
	ASSERT_VALID(this);
	//调用基类串行化
	CFigureObj::Serialize(ar);
 
	if (ar.IsStoring())
	{
		ar << m_CenterPointx << m_CenterPointy << m_Radium;		
	}
	else
	{
//		WORD wTemp;
		ar >>  m_CenterPointx >> m_CenterPointy >> m_Radium;			
	}
}

//设定圆心坐标,为世界坐标
void CCircleObj::SetCenterPoint(double ptx, double pty)
{
	m_CenterPointx = ptx;
	m_CenterPointy = pty;	
}

//获得圆心坐标
void CCircleObj::GetCenterPoint(double& ptx, double& pty)
{
	ptx = m_CenterPointx;
	pty = m_CenterPointy;
}

//计算矩形图形元边界矩形,以逻辑坐标表示
CRect CCircleObj::CalcBounds(CVisDrawView* pView)
{
	long Radium;
	CPoint nPoint;
	CRect rect;
	//把圆心坐标转化为逻辑坐标
	pView->WorldToClient(nPoint, m_CenterPointx, m_CenterPointy);
	//把半径转化为逻辑半径
	Radium = (long)pView->WorldToClient(m_Radium);

	//计算外接矩形
	rect.top = nPoint.y + Radium;
	rect.left = nPoint.x - Radium;
	rect.bottom = nPoint.y - Radium;
	rect.right = nPoint.x + Radium;

	m_position = rect;
	return rect;
}

//计算圆的半径,以世界坐标表示
double CCircleObj::CalcRadium(double ptx, double pty)
{
	double radium;
	double dx,dy;
	dx = ptx - m_CenterPointx;
	dy = pty - m_CenterPointy;
    radium =sqrt(dx*dx + dy*dy);
	return radium;
}

void CCircleObj::SetRadium(double radium)
{
	m_Radium = radium;
}
double CCircleObj::GetRadium(void)
{
	return m_Radium;
}

BOOL CCircleObj::IsSelected(CVisDrawView* pView, const CPoint& point)
{
	//参数point是鼠标的逻辑坐标
	double distance,radium;
	int nSelectDistance;

	CPoint local;
	local = point;
	//鼠标点的设备坐标
	pView->DocToClient(local);

	//识别精度值
	nSelectDistance = pView->GetDocument()->GetSetectDistance()/2;
	
	CPoint pt;
	//把圆心坐标转化为逻辑坐标
	pView->WorldToClient(pt, m_CenterPointx, m_CenterPointy);

	//把圆心坐标由逻辑坐标转化为设备坐标
	pView->DocToClient(pt);

	//计算鼠标点point与圆心之间的像素距离

	distance = PointToPoint(pt,local);

	radium = pView->WorldToClient(m_Radium);

	distance = fabs(distance - radium);

	//根据拾取条件判断图元是否被拾取
	return (distance < nSelectDistance);

}

//返回手柄个数
int CCircleObj::GetHandleCount()
{
	ASSERT_VALID(this);
	
	return 5;
}

// 返回手柄中心逻辑坐标
CPoint CCircleObj::GetHandle(CVisDrawView* pView, int nHandle)
{
	ASSERT_VALID(this);
	
	if(nHandle < 5)
		nHandle = 2*nHandle;
	else
		nHandle = 9;

	//调整手柄号后调用基类成员函数

	return CFigureObj::GetHandle(pView, nHandle);
}
//移动手柄
void CCircleObj::MoveHandleTo(int nHandle, CPoint point, CVisDrawView* pView)
{
	ASSERT_VALID(this);

	//把鼠标逻辑坐标转化为世界坐标
	double pointx,pointy;
	pView->ClientToWorld(point, pointx, pointy);

	double radium = CalcRadium(pointx,pointy);
	SetRadium(radium);
	CalcBounds(pView);
}

// delta为逻辑坐标
void CCircleObj::MoveTo(CPoint delta, CVisDrawView* pView)
{
	ASSERT_VALID(this);	

	//把delta转化为世界坐标
	double pointx,pointy;
	pointx = pView->ClientToWorld(delta.x);
	pointy = -pView->ClientToWorld(delta.y);

	//修改圆心坐标
	m_CenterPointx = m_CenterPointx + pointx;
	m_CenterPointy = m_CenterPointy + pointy;

	//重新计算边界矩形
	CalcBounds(pView);

	//修改文档标志	
	m_pDocument->SetModifiedFlag();
	
}

⌨️ 快捷键说明

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