VB/C# Shape следует за курсором, но ограничивает границы

Мне трудно подражать эффекту "глазного яблока". у меня есть OvalShape (как в форме PowerPack) и может ограничить движение к определенному x,y. Тем не менее, мне нужны свежие глаза, чтобы выручить меня, я думаю, что смотрю на это слишком долго, чтобы понять это.

Цель:

Подражайте движению глазного яблока, следуя позиции курсора.

Особенности:

Положение курсора PointToClient типа, эрго, это относительно формы. Объект / форма относительно ShapeContainer поэтому MousePosition 10,10 переведет в EyePupil позицию 10,10, потому что местоположение основано на его родителе

Вот краткий обзор:

Class

Dim MousePosition As Drawing.Point

.....Handles MyBase.Load

    Dim ctrl As System.Windows.Forms.Control
    For Each ctrl In Me.Controls
        AddHandler ctrl.MouseMove, AddressOf OnMouseMoveHandler
    Next

    Dim canvas As New ShapeContainer
    canvas.Parent = Me.EyeIcon

    Me.EyePupilShape.Parent = canvas

Обработка событий:

....OnMouseMoveHandler(..) 

    MousePosition = Me.PointToClient(Cursor.Position)
    Debug.Print("Mouse position : X = " & MousePosition.X & ", " & MousePosition.Y)

    Me.EyePupilShape.Location = New Drawing.Point(Clamp(MousePosition.X, 32, 50), Clamp(MousePosition.Y, 31, 50))

Где Clamp - это просто пользовательская версия MathHelper.clamp, а минимальные / максимальные значения - это то место, где "зрачок" глаза должен быть ограничен родительским элементом.

Это работает, так как в нем ученик ограничен определенными границами x, y

Тем не менее, он не "следует" за курсором как таковым. Например, если курсор находится в левом нижнем углу, он не распознает это, он просто основан на значениях x, y, вот где мне нужна помощь с тем, что я имею до сих пор. Для чего это стоит, я получил большую часть моей информации от MSDN

1 ответ

Решение

Вам необходимо принять во внимание угол наклона курсора мыши, затем рассчитать положение на единичной окружности на основе этого угла и масштабировать по радиусу вашей "области движения зрачка" с учетом положения мыши внутри глаза / зрачка.

Я написал образец в VB.NET, размещенный на Github.

Расчеты в пределах Eyeball.Pupil.Update(Point mouse) функция, которая получает координаты мыши, переведенные с помощью PointToClient() функция, как в вашем случае. Вот код:

Public Sub Update(ByVal mouse As Point)
    'Calculate angle to mouse position
    Dim distanceVector = New PointF(mouse.X - _center.X, mouse.Y - _center.Y)
    Dim angleToMouse = Math.Atan2(distanceVector.Y, distanceVector.X)

    'If the mouse is within the movement radius, restrict movement
    Dim absDistanceVector As PointF = distanceVector
    If absDistanceVector.X < 0 Then absDistanceVector.X *= -1
    If absDistanceVector.Y < 0 Then absDistanceVector.Y *= -1

    'Calculate scale
    Dim scale = New PointF(Math.Min(absDistanceVector.X, _movementRadius.X),
                               Math.Min(absDistanceVector.Y, _movementRadius.Y))

    'Adjust X and Y of the pupil based on scaled vector to mouse cursor, offset by pupil origin
    X = CType(Math.Cos(angleToMouse), Single) * scale.X + _center.X - BoundingBox.Width / 2
    Y = CType(Math.Sin(angleToMouse), Single) * scale.Y + _center.Y - BoundingBox.Height / 2

End Sub 
Другие вопросы по тегам