private void ValidateCurveLimits(ICurve curve, CurveLimitSides side) { switch (side) { case CurveLimitSides.Left: { IControlPoint firstPt = curve.ControlPoints.Count > 0 ? curve.ControlPoints[0] : null; float left = firstPt != null ? firstPt.X : curve.MaxX - CurveUtils.Epsilone; if (curve.MinX > left) curve.MinX = left; } break; case CurveLimitSides.Right: { IControlPoint lastPt = curve.ControlPoints.Count > 0 ? curve.ControlPoints[curve.ControlPoints.Count-1] : null; float right = lastPt != null ? lastPt.X : curve.MinX + CurveUtils.Epsilone; if (curve.MaxX < right) curve.MaxX = right; } break; case CurveLimitSides.Top: { float top = curve.MinY + CurveUtils.Epsilone; foreach (var cpt in curve.ControlPoints) if (cpt.Y > top) top = cpt.Y; if (curve.MaxY < top) curve.MaxY = top; } break; case CurveLimitSides.Bottom: { float bottom = curve.MaxY - CurveUtils.Epsilone; foreach (var cpt in curve.ControlPoints) if (cpt.Y < bottom) bottom = cpt.Y; if (curve.MinY > bottom) curve.MinY = bottom; } break; } }
private ICurve PickCurveLimits(out CurveLimitSides side) { side = CurveLimitSides.None; if (AutoComputeCurveLimitsEnabled) return null; ICurve hit = null; const float pickTol = 4; RectangleF rect = RectangleF.Empty; for (int i = SelectedCurves.Length - 1; i >= 0; i--) { ICurve curve = SelectedCurves[i]; Vec2F min = new Vec2F(curve.MinX, curve.MinY); Vec2F max = new Vec2F(curve.MaxX, curve.MaxY); min = GraphToClient(min); max = GraphToClient(max); RectangleF limitRect = MakeRect(min, max); RectangleF outerRect = RectangleF.Inflate(limitRect, pickTol, pickTol); if (!curve.Visible || !outerRect.Contains(CurrentPoint)) continue; RectangleF innerRect = RectangleF.Inflate(limitRect, -pickTol, -pickTol); if (!innerRect.Contains(CurrentPoint)) { m_limitHits.Clear(); m_limitHits[Math.Abs(min.X - CurrentPoint.X)] = CurveLimitSides.Left; m_limitHits[Math.Abs(max.X - CurrentPoint.X)] = CurveLimitSides.Right; m_limitHits[Math.Abs(min.Y - CurrentPoint.Y)] = CurveLimitSides.Bottom; m_limitHits[Math.Abs(max.Y - CurrentPoint.Y)] = CurveLimitSides.Top; foreach (KeyValuePair<float, CurveLimitSides> kv in m_limitHits) { if (kv.Key <= pickTol) { side = kv.Value; hit = curve; break; } } break; } } return hit; }