Example #1
0
            /// <inheritdoc />
            public override void OnMouseMove(Float2 location)
            {
                if (_isMoving && Float2.DistanceSquared(ref location, ref _startMovePos) > 25.0f)
                {
                    _startMovePos = Float2.Minimum;
                    var x     = PointToParent(location).X;
                    var frame = (int)((x - Width * 0.5f) / Gradient._scale);
                    Gradient.SetStopFrame(Index, frame);
                }

                base.OnMouseMove(location);
            }
Example #2
0
        /// <summary>
        /// Checks if a point intersects a bezier curve
        /// </summary>
        /// <param name="start">The start location.</param>
        /// <param name="end">The end location.</param>
        /// <param name="point">The point</param>
        /// <param name="distance">Distance at which its an intersection</param>
        public static bool IntersectsConnection(ref Float2 start, ref Float2 end, ref Float2 point, float distance)
        {
            // Pretty much a point in rectangle check
            if ((point.X - start.X) * (end.X - point.X) < 0)
            {
                return(false);
            }

            float offset = Mathf.Sign(end.Y - start.Y) * distance;

            if ((point.Y - (start.Y - offset)) * ((end.Y + offset) - point.Y) < 0)
            {
                return(false);
            }

            // Taken from the Render2D.DrawBezier code
            float squaredDistance = distance;

            var dst      = (end - start) * new Float2(0.5f, 0.05f);
            var control1 = new Float2(start.X + dst.X, start.Y + dst.Y);
            var control2 = new Float2(end.X - dst.X, end.Y + dst.Y);

            var   d1              = control1 - start;
            var   d2              = control2 - control1;
            var   d3              = end - control2;
            float len             = d1.Length + d2.Length + d3.Length;
            int   segmentCount    = Math.Min(Math.Max(Mathf.CeilToInt(len * 0.05f), 1), 100);
            float segmentCountInv = 1.0f / segmentCount;

            Bezier(ref start, ref control1, ref control2, ref end, 0, out var p);
            for (int i = 1; i <= segmentCount; i++)
            {
                var   oldp = p;
                float t    = i * segmentCountInv;
                Bezier(ref start, ref control1, ref control2, ref end, t, out p);

                // Maybe it would be reasonable to return the point?
                CollisionsHelper.ClosestPointPointLine(ref point, ref oldp, ref p, out var result);
                if (Float2.DistanceSquared(point, result) <= squaredDistance)
                {
                    return(true);
                }
            }
            return(false);
        }