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