VB/C#形状跟随光标但约束边界



我很难模拟"眼球"效果。我有一个OvalShape(如PowerPack形状),可以将移动限制为特定的x,y。然而,我需要一双新的眼睛来帮助我,我想我已经看了太久了,无法理解它

目标:

通过跟随光标位置模拟眼球运动体验。

规格:

光标位置是PointToClient类型的,因此,它是相对于形式的。对象/形状相对于ShapeContainer,因此鼠标位置10,10将转换为EyePupil位置10,110,因为该位置基于其父

这里有一个简介:

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

您需要考虑到鼠标光标的角度,然后根据该角度计算单位圆上的位置,并根据"瞳孔移动区域"的半径进行缩放,以调整鼠标在眼睛/瞳孔内的位置。

我用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 

最新更新