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

📄 visualobject.cpp

📁 The application wizard has created this SoccerDoctor application for you. This application not onl
💻 CPP
字号:
#include "StdAfx.h"
#include "VisualObject.h"
#include "Displayer.h"
#include <cmath>
#include "Utils.h" // CUtils

/************************************************************************/
/*                       CVisualObject Class                            */
/************************************************************************/
CVisualObject::~CVisualObject(void)
{
}
void CVisualObject::Draw(CDC* pDC)
{
}

void CVisualObject::OnLButtonDown(UINT nFlags,const CPoint& p)
{
}
bool CVisualObject::OnMouseMove(UINT nFlags,const CPoint& p)
{
	return false;
}
bool CVisualObject::Selected()
{
	return _bSelected; 
}
CString CVisualObject::ToString()
{
	return "Should Not Show This Text";
}
/************************************************************************/
/*                        CVisualLine Class                             */
/************************************************************************/
void CVisualLine::Draw(CDC* pDC)
{
	if( _bP2Valid ){
		if( _bSelected ){
			pDC->SelectObject(getDisplayer()->getRedPen());
		}
		else{
			pDC->SelectObject(getDisplayer()->getWhitePen());
		}
		pDC->MoveTo(_p1);
		pDC->LineTo(_p2);
		// CString temp;
		// temp.Format("(%.2f,%.2f)",_dLen,_dAngle);
		// pDC->SelectObject(getDisplayer()->getPlayerFont());
		// pDC->SetTextColor(COLOR_LIGHTBLUE);		
		// pDC->TextOut((_p1.x+_p2.x)/2,(_p1.y+_p2.y)/2,temp);
	}
}
bool CVisualLine::OnLine(const CPoint& p)
{
	if( !_bP2Valid ){
		return false;
	}

	if( p.x < min(_p1.x,_p2.x) - 3 || p.y < min(_p1.y,_p2.y) -3 || 
		p.x > max(_p1.x,_p2.x) + 3 || p.y > max(_p1.y,_p2.y) + 3){
		return false;
	}
	LONG x,y;
	if( std::abs(_p2.x-_p1.x) > std::abs(_p2.y-_p1.y) ){ // 线与x轴夹角小于45
		x = p.x;
		y = _p1.y + (_p2.y - _p1.y)*(x - _p1.x)/(_p2.x - _p1.x);
		if( std::abs( y - p.y) <= 3 ){
			return true;
		}
	}else { // 线与x轴夹角不小于45
		y = p.y;
		x = _p1.x + (_p2.x - _p1.x)*(y - _p1.y)/(_p2.y - _p1.y);
		if( std::abs( x - p.x) <= 3 ){
			return true;
		}
	}
	return false;
}
void CVisualLine::OnLButtonDown(UINT nFlags,const CPoint& p)
{
	if( _bP2Valid ) { // 此线已经有了两个端点
		_bSelected = OnLine(p);
	}else if( p != _p2 ){
		_p2 = p;
		_bP2Valid = true;
		_bSelected = true;
		double x1 = getDisplayer()->ScreenX2FieldX(_p1.x);
		double x2 = getDisplayer()->ScreenX2FieldX(_p2.x);
		double y1 = getDisplayer()->ScreenY2FieldY(_p1.y);
		double y2 = getDisplayer()->ScreenY2FieldY(_p2.y);
		_dLen =  std::sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1));
		_dAngle = CUtils::Rad2Deg(std::asin((y2-y1)/_dLen));
		if( x2 < x1 ){
			_dAngle = (_dAngle > 0 ) ? 180 - _dAngle : -180 - _dAngle ;
		}
	}
}

bool CVisualLine::OnMouseMove(UINT nFlags,const CPoint& p)
{
	if( _bP2Valid ){
		return OnLine(p);
	}
	return false;
}
CString CVisualLine::ToString()
{
	CString result;
	result.Format("(%.2f,%.2f)->(%.2f,%.2f) (L:%.2f) (A:%.2f)",getDisplayer()->ScreenX2FieldX(_p1.x),getDisplayer()->ScreenY2FieldY(_p1.y),
		getDisplayer()->ScreenX2FieldX(_p2.x),getDisplayer()->ScreenY2FieldY(_p2.y),_dLen,_dAngle);
	return result;
}
/************************************************************************/
/*                        CVisualPoint Class                            */
/************************************************************************/
void CVisualPoint::Draw(CDC* pDC)
{
	if( _bSelected ){
		pDC->SelectObject(getDisplayer()->getPurpleBrush());
		pDC->SelectObject(getDisplayer()->getRedPen());
	}else{
		pDC->SelectObject(getDisplayer()->getBlueBrush());
		pDC->SelectObject(getDisplayer()->getWhitePen());
	}
	
	pDC->Ellipse(_pt.x - 3, _pt.y - 3, _pt.x + 3, _pt.y + 3);
	pDC->SetPixel(_pt.x,_pt.y,COLOR_BLACK);
	// pDC->SelectObject(getDisplayer()->getPlayerFont());
	// pDC->SetTextColor(COLOR_LIGHTBLUE);
	// CString temp;
	// temp.Format("(%.2f,%.2f)",getDisplayer()->ScreenX2FieldX(_pt.x),getDisplayer()->ScreenY2FieldY(_pt.y));
	// pDC->TextOut(_pt.x + 3, _pt.y - 3, temp);
}
void CVisualPoint::OnLButtonDown(UINT nFlags,const CPoint& p)
{
	CRect rect(_pt.x - 3, _pt.y - 3, _pt.x + 3, _pt.y + 3);
	_bSelected = (rect.PtInRect(p) == TRUE);
}
bool CVisualPoint::OnMouseMove(UINT nFlags,const CPoint& p)
{
	CRect rect(_pt.x - 3, _pt.y - 3, _pt.x + 3, _pt.y + 3);
	if( rect.PtInRect(p) ){
		return true;
	}
	return false;
	
}
CString CVisualPoint::ToString()
{
	CString result;
	result.Format("(%.2f,%.2f)",getDisplayer()->ScreenX2FieldX(_pt.x),getDisplayer()->ScreenY2FieldY(_pt.y));
	return result;
}

/************************************************************************/
/*                        CVisualRect Class                             */
/************************************************************************/
void CVisualRect::Draw(CDC* pDC)
{
	if( _bRectValid ){
		if( _bSelected ){
			pDC->SelectObject(getDisplayer()->getRedPen());
		}
		else{
			pDC->SelectObject(getDisplayer()->getWhitePen());
		}
		pDC->MoveTo(_rect.left,_rect.top);
		pDC->LineTo(_rect.right,_rect.top);
		pDC->LineTo(_rect.right,_rect.bottom);
		pDC->LineTo(_rect.left,_rect.bottom);
		pDC->LineTo(_rect.left,_rect.top);

	}
}

void CVisualRect::OnLButtonDown(UINT nFlags,const CPoint& p)
{
	if( _bRectValid ) { // 此线已经有了两个端点
		_bSelected = OnRect(p);
	}else if( p != _p1 ){
		_rect = CRect(min(_p1.x,p.x),min(_p1.y,p.y),max(_p1.x,p.x),max(_p1.y,p.y));
		_bRectValid = true;
		_bSelected = true;
	}
}

bool CVisualRect::OnMouseMove(UINT nFlags,const CPoint& p)
{
	if( _bRectValid ){
		return OnRect(p);
	}
	return false;
}

bool CVisualRect::OnRect(const CPoint& p)
{
	CRect rect(_rect.left - 3,_rect.top - 3,_rect.right + 3,_rect.bottom + 3);
	if( !rect.PtInRect(p) ){
		return false;
	}
	return OnLine(_rect.TopLeft(),CPoint(_rect.right,_rect.top),p) 
		|| OnLine(CPoint(_rect.right,_rect.top),_rect.BottomRight(),p)
		|| OnLine(_rect.BottomRight(),CPoint(_rect.left,_rect.bottom),p)
		|| OnLine(CPoint(_rect.left,_rect.bottom),_rect.TopLeft(),p);
		
}

bool CVisualRect::OnLine(const CPoint& p1,const CPoint& p2,const CPoint& p)
{
	LONG x,y;
	if( std::abs(p2.x-p1.x) > std::abs(p2.y-p1.y) ){ // 线与x轴夹角小于45
		x = p.x;
		y = p1.y + (p2.y - p1.y)*(x - p1.x)/(p2.x - p1.x);
		if( std::abs( y - p.y) <= 3 ){
			return true;
		}
	}else { // 线与x轴夹角不小于45
		y = p.y;
		x = p1.x + (p2.x - p1.x)*(y - p1.y)/(p2.y - p1.y);
		if( std::abs( x - p.x ) <= 3 ){
			return true;
		}
	}
	return false;
}
CString CVisualRect::ToString()
{
	CString result;
	result.Format("(%.2f,%.2f) (%.2f,%.2f) (%.2f*%.2f)",
		getDisplayer()->ScreenX2FieldX(_rect.left),getDisplayer()->ScreenY2FieldY(_rect.top), // Left Top
		getDisplayer()->ScreenX2FieldX(_rect.right),getDisplayer()->ScreenY2FieldY(_rect.bottom), // Right Down
		getDisplayer()->ScreenX2FieldX(_rect.right)-getDisplayer()->ScreenX2FieldX(_rect.left), // Width
		getDisplayer()->ScreenY2FieldY(_rect.bottom)-getDisplayer()->ScreenY2FieldY(_rect.top) // Hight
		);
	return result;
}
/************************************************************************/
/*                        CVisualCircle Class                           */
/************************************************************************/

void CVisualCircle::Draw(CDC* pDC)
{
	if( _bRadiusValid ){
		if( _bSelected ){
			pDC->SelectObject(getDisplayer()->getRedPen());
		}
		else{
			pDC->SelectObject(getDisplayer()->getWhitePen());
		}
		pDC->Arc(_center.x - _radius,_center.y - _radius,_center.x + _radius,_center.y + _radius,_center.x - _radius,_center.y - _radius,_center.x - _radius,_center.y - _radius);
	}
}

void CVisualCircle::OnLButtonDown(UINT nFlags,const CPoint& p)
{
	if( _bRadiusValid ) { // 此线已经有了两个端点
		_bSelected = OnCircle(p);
	}else if( p != _center ){
		_radius = std::sqrt((p.x - _center.x)*(p.x - _center.x) + (p.y - _center.y)*(p.y - _center.y));
		_bRadiusValid = true;
		_bSelected = true;
	}
}

bool CVisualCircle::OnMouseMove(UINT nFlags,const CPoint& p)
{
	if( _bRadiusValid ){
		return OnCircle(p);
	}
	return false;
}

bool CVisualCircle::OnCircle(const CPoint& p)
{
	LONG r = std::sqrt((p.x - _center.x)*(p.x - _center.x) + (p.y - _center.y)*(p.y - _center.y));
	if( std::abs(r - _radius) > 3){
		return false;
	}
	return true;
}
CString CVisualCircle::ToString()
{
	CString result;
	result.Format("(%.2f,%.2f) (%.2f)",getDisplayer()->ScreenX2FieldX(_center.x),getDisplayer()->ScreenY2FieldY(_center.y),
		getDisplayer()->ScreenX2FieldX(_center.x)-getDisplayer()->ScreenX2FieldX(_center.x-_radius));
	return result;
}

⌨️ 快捷键说明

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