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