| //+------------------------------------------------------------------+
|
| //| 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;
|
| }
|
| }
|
| //+------------------------------------------------------------------+
|