279 lines
11 KiB
MQL5
279 lines
11 KiB
MQL5
//+------------------------------------------------------------------+
| |||
//| Rect.mqh |
| |||
//| Copyright 2000-2025, MetaQuotes Ltd. |
| |||
//| https://www.mql5.com |
| |||
//+------------------------------------------------------------------+
| |||
//+------------------------------------------------------------------+
| |||
//| Structure CPoint |
| |||
//| Usage: point of chart in Cartesian coordinates |
| |||
//+------------------------------------------------------------------+
| |||
struct CPoint
| |||
{
| |||
int x; // horizontal coordinate
| |||
int y; // vertical coordinate
| |||
};
| |||
//+------------------------------------------------------------------+
| |||
//| Structure CSize |
| |||
//| Usage: size of area of chart in Cartesian coordinates |
| |||
//+------------------------------------------------------------------+
| |||
struct CSize
| |||
{
| |||
int cx; // horizontal size
| |||
int cy; // vertical size
| |||
};
| |||
//+------------------------------------------------------------------+
| |||
//| Structure CRect |
| |||
//| Usage: area of chart in Cartesian coordinates |
| |||
//+------------------------------------------------------------------+
| |||
struct CRect
| |||
{
| |||
int left; // left coordinate
| |||
int top; // top coordinate
| |||
int right; // right coordinate
| |||
int bottom; // bottom coordinate
| |||
| |||
//--- methods
| |||
CPoint LeftTop(void) const;
| |||
void LeftTop(const int x,const int y);
| |||
void LeftTop(const CPoint& point);
| |||
CPoint RightBottom(void) const;
| |||
void RightBottom(const int x,const int y);
| |||
void RightBottom(const CPoint& point);
| |||
CPoint CenterPoint(void) const;
| |||
int Width(void) const { return(right-left); }
| |||
void Width(const int w) { right=left+w; }
| |||
int Height(void) const { return(bottom-top); }
| |||
void Height(const int h) { bottom=top+h; }
| |||
CSize Size(void) const;
| |||
void Size(const int cx,const int cy);
| |||
void Size(const CSize& size);
| |||
void SetBound(const int l,const int t,const int r,const int b);
| |||
void SetBound(const CRect& rect);
| |||
void SetBound(const CPoint& point,const CSize& size);
| |||
void SetBound(const CPoint& left_top,const CPoint& right_bottom);
| |||
void Move(const int x,const int y);
| |||
void Move(const CPoint& point);
| |||
void Shift(const int dx,const int dy);
| |||
void Shift(const CPoint& point);
| |||
void Shift(const CSize& size);
| |||
bool Contains(const int x,const int y) const;
| |||
bool Contains(const CPoint& point) const;
| |||
void Normalize(void);
| |||
};
| |||
//+------------------------------------------------------------------+
| |||
//| Get parameters of area |
| |||
//+------------------------------------------------------------------+
| |||
CPoint CRect::LeftTop(void) const
| |||
{
| |||
CPoint point;
| |||
//--- action
| |||
point.x=left;
| |||
point.y=top;
| |||
//--- result
| |||
return(point);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Set parameters of area |
| |||
//+------------------------------------------------------------------+
| |||
void CRect::LeftTop(const int x,const int y)
| |||
{
| |||
left=x;
| |||
top =y;
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Set parameters of area |
| |||
//+------------------------------------------------------------------+
| |||
void CRect::LeftTop(const CPoint& point)
| |||
{
| |||
left=point.x;
| |||
top =point.y;
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Get parameters of area |
| |||
//+------------------------------------------------------------------+
| |||
CPoint CRect::RightBottom(void) const
| |||
{
| |||
CPoint point;
| |||
//--- action
| |||
point.x=right;
| |||
point.y=bottom;
| |||
//--- result
| |||
return(point);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Set parameters of area |
| |||
//+------------------------------------------------------------------+
| |||
void CRect::RightBottom(const int x,const int y)
| |||
{
| |||
right =x;
| |||
bottom=y;
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Set parameters of area |
| |||
//+------------------------------------------------------------------+
| |||
void CRect::RightBottom(const CPoint& point)
| |||
{
| |||
right =point.x;
| |||
bottom=point.y;
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Get parameters of area |
| |||
//+------------------------------------------------------------------+
| |||
CPoint CRect::CenterPoint(void) const
| |||
{
| |||
CPoint point;
| |||
//--- action
| |||
point.x=left+Width()/2;
| |||
point.y=top+Height()/2;
| |||
//--- result
| |||
return(point);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Get parameters of area |
| |||
//+------------------------------------------------------------------+
| |||
CSize CRect::Size(void) const
| |||
{
| |||
CSize size;
| |||
//--- action
| |||
size.cx=right-left;
| |||
size.cy=bottom-top;
| |||
//--- result
| |||
return(size);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Set parameters of area |
| |||
//+------------------------------------------------------------------+
| |||
void CRect::Size(const int cx,const int cy)
| |||
{
| |||
right =left+cx;
| |||
bottom=top+cy;
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Set parameters of area |
| |||
//+------------------------------------------------------------------+
| |||
void CRect::Size(const CSize& size)
| |||
{
| |||
right =left+size.cx;
| |||
bottom=top+size.cy;
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Set parameters of area |
| |||
//+------------------------------------------------------------------+
| |||
void CRect::SetBound(const int l,const int t,const int r,const int b)
| |||
{
| |||
left =l;
| |||
top =t;
| |||
right =r;
| |||
bottom=b;
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Set parameters of area |
| |||
//+------------------------------------------------------------------+
| |||
void CRect::SetBound(const CRect& rect)
| |||
{
| |||
left =rect.left;
| |||
top =rect.top;
| |||
right =rect.right;
| |||
bottom=rect.bottom;
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Set parameters of area |
| |||
//+------------------------------------------------------------------+
| |||
void CRect::SetBound(const CPoint& point,const CSize& size)
| |||
{
| |||
LeftTop(point);
| |||
Size(size);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Set parameters of area |
| |||
//+------------------------------------------------------------------+
| |||
void CRect::SetBound(const CPoint& left_top,const CPoint& right_bottom)
| |||
{
| |||
LeftTop(left_top);
| |||
RightBottom(right_bottom);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Absolute movement of area |
| |||
//+------------------------------------------------------------------+
| |||
void CRect::Move(const int x,const int y)
| |||
{
| |||
right +=x-left;
| |||
bottom+=y-top;
| |||
left =x;
| |||
top =y;
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Absolute movement of area |
| |||
//+------------------------------------------------------------------+
| |||
void CRect::Move(const CPoint& point)
| |||
{
| |||
right +=point.x-left;
| |||
bottom+=point.y-top;
| |||
left =point.x;
| |||
top =point.y;
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Relative movement of area |
| |||
//+------------------------------------------------------------------+
| |||
void CRect::Shift(const int dx,const int dy)
| |||
{
| |||
left +=dx;
| |||
top +=dy;
| |||
right +=dx;
| |||
bottom+=dy;
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Relative movement of area |
| |||
//+------------------------------------------------------------------+
| |||
void CRect::Shift(const CPoint& point)
| |||
{
| |||
left +=point.x;
| |||
top +=point.y;
| |||
right +=point.x;
| |||
bottom+=point.y;
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Relative movement of area |
| |||
//+------------------------------------------------------------------+
| |||
void CRect::Shift(const CSize& size)
| |||
{
| |||
left +=size.cx;
| |||
top +=size.cy;
| |||
right +=size.cx;
| |||
bottom+=size.cy;
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Check if a point is within the area |
| |||
//+------------------------------------------------------------------+
| |||
bool CRect::Contains(const int x,const int y) const
| |||
{
| |||
//--- check and return the result
| |||
return(x>=left && x<=right && y>=top && y<=bottom);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Check if a point is within the area |
| |||
//+------------------------------------------------------------------+
| |||
bool CRect::Contains(const CPoint& point) const
| |||
{
| |||
//--- check and return the result
| |||
return(point.x>=left && point.x<=right && point.y>=top && point.y<=bottom);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Standardizes the height and width |
| |||
//+------------------------------------------------------------------+
| |||
void CRect::Normalize(void)
| |||
{
| |||
if(left>right)
| |||
{
| |||
int tmp1=left;
| |||
left=right;
| |||
right=tmp1;
| |||
}
| |||
if(top>bottom)
| |||
{
| |||
int tmp2=top;
| |||
top=bottom;
| |||
bottom=tmp2;
| |||
}
| |||
}
| |||
//+------------------------------------------------------------------+
|