Example #1
0
        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;
            }
        }
Example #2
0
        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;
        }