📄 visualobject.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 + -