void wxRect2DDouble::ConstrainTo( const wxRect2DDouble &rect ) { if ( GetLeft() < rect.GetLeft() ) SetLeft( rect.GetLeft() ); if ( GetRight() > rect.GetRight() ) SetRight( rect.GetRight() ); if ( GetBottom() > rect.GetBottom() ) SetBottom( rect.GetBottom() ); if ( GetTop() < rect.GetTop() ) SetTop( rect.GetTop() ); }
// same as wxPlotRect2DDouble::Contains, but doesn't convert to wxPoint2DDouble inline bool wxPlotRect2DDoubleContains(double x, double y, const wxRect2DDouble &rect) { return ((x>=rect.m_x) && (y>=rect.m_y) && (x<=rect.GetRight()) && (y<=rect.GetBottom())); }
int ClipLineToRect( double &x0, double &y0, double &x1, double &y1, const wxRect2DDouble &rect ) { if (!wxFinite(x0) || !wxFinite(y0) || !wxFinite(x1) || !wxFinite(y1)) return ClippedOut; wxOutCode out0 = wxPlotRect2DDoubleOutCode( x0, y0, rect ); wxOutCode out1 = wxPlotRect2DDoubleOutCode( x1, y1, rect ); if ((out0 & out1) != wxInside) return ClippedOut; // both outside on same side if ((out0 | out1) == wxInside) return ClippedNeither; // both inside int ret = ClippedNeither; if (x0 == x1) // vertical line { if (out0 & wxOutTop) {y0 = rect.GetTop(); ret |= ClippedFirstY;} else if (out0 & wxOutBottom) {y0 = rect.GetBottom(); ret |= ClippedFirstY;} if (out1 & wxOutTop) {y1 = rect.GetTop(); ret |= ClippedSecondY;} else if (out1 & wxOutBottom) {y1 = rect.GetBottom(); ret |= ClippedSecondY;} return ret; } if (y0 == y1) // horiz line { if (out0 & wxOutLeft) {x0 = rect.GetLeft(); ret |= ClippedFirstX;} else if (out0 & wxOutRight) {x0 = rect.GetRight(); ret |= ClippedFirstX;} if (out1 & wxOutLeft) {x1 = rect.GetLeft(); ret |= ClippedSecondX;} else if (out1 & wxOutRight) {x1 = rect.GetRight(); ret |= ClippedSecondX;} return ret; } double x = x0, y = y0; wxOutCode out = out0; int points_out = 2; bool out0_outside = true; if (out0 == wxInside) { out0_outside = false; points_out = 1; out = out1; } else if (out1 == wxInside) points_out = 1; for (int i=0; i<points_out; i++) { if (out & wxOutTop) { y = rect.GetTop(); x = x0 + (x1 - x0) * (y - y0) / (y1 - y0); out = wxPlotRect2DDoubleOutCode( x, y, rect ); } else if (out & wxOutBottom) { y = rect.GetBottom(); x = x0 + (x1 - x0) * (y - y0) / (y1 - y0); out = wxPlotRect2DDoubleOutCode( x, y, rect ); } // check left and right if (out & wxOutRight) { x = rect.GetRight(); y = y0 + (y1 - y0) * (x - x0) / (x1 - x0); out = wxPlotRect2DDoubleOutCode( x, y, rect ); } else if (out & wxOutLeft) { x = rect.GetLeft(); y = y0 + (y1 - y0) * (x - x0) / (x1 - x0); out = wxPlotRect2DDoubleOutCode( x, y, rect ); } // check top and bottom again if (out & wxOutTop) { y = rect.GetTop(); x = x0 + (x1 - x0) * (y - y0) / (y1 - y0); out = wxPlotRect2DDoubleOutCode( x, y, rect ); } else if (out & wxOutBottom) { y = rect.GetBottom(); x = x0 + (x1 - x0) * (y - y0) / (y1 - y0); out = wxPlotRect2DDoubleOutCode( x, y, rect ); } if (!wxFinite(x) || !wxFinite(y)) return ClippedOut; if ((i == 0) && out0_outside) { x0 = x; y0 = y; ret |= ClippedFirst; out = out1; } else { x1 = x; y1 = y; ret |= ClippedSecond; return ret; } } return ret; }
// differs from wxRect2DDouble::Intersects by allowing for 0 width or height inline bool wxPlotRect2DDoubleIntersects(const wxRect2DDouble &a, const wxRect2DDouble &b) { return (wxMax(a.m_x, b.m_x) <= wxMin(a.GetRight(), b.GetRight())) && (wxMax(a.m_y, b.m_y) <= wxMin(a.GetBottom(), b.GetBottom())); }