【问题标题】:Push object away from another object将物体推离另一个物体
【发布时间】:2013-05-22 14:48:55
【问题描述】:

我试图每秒调用一个方法 20 次以将 A 点推离 B 点。 该方法应使用以下变量:

  • 点 A (X)
  • 点 A (Y)
  • 点 B (X)
  • 点 B (Y)
  • 实力

A 点和 B 点越靠近,它们彼此远离的速度就越快。 强度变量控制每个刻度的距离以及不再推动 A 点的点之间的距离...

基本上我正在尝试将光标慢慢推离指定点。

有什么想法可以实现吗?

这是我的尝试,不幸的是,如果距离增加,光标移动得更快......

    'PosX and PosY are the percentage of the screen width/height

    'Calculate the real position
    Dim ScreenPosX As Integer = Screen.PrimaryScreen.WorkingArea.Width * (PosX / 100)
    Dim ScreenPosY As Integer = Screen.PrimaryScreen.WorkingArea.Height * (PosY / 100)

    Dim PointOffsetX As Integer = Cursor.Position.X - ScreenPosX
    Dim PointOffsetY As Integer = Cursor.Position.Y - ScreenPosY

    If PointOffsetX > -Strength And PointOffsetX < Strength Then
        Dim StrengthFactorX As Integer = Strength - ScreenOffsetX
        Dim StrengthFactorY As Integer = Strength - ScreenOffsetY

        Cursor.Position = New Point(Cursor.Position.X + StrengthFactorX, Cursor.Position.Y + StrengthFactorY)
        'Would be the same for Y. Obviously doesn't work though.
    End If

【问题讨论】:

  • 你试过什么? StackOverflow 通常不会很好地回答这样的问题,基本上是“为我编写代码”。你所拥有的只是一个问题陈述和一个问题——没有证据表明你有任何努力。先尝试一下,然后再提出一个更具体的问题来显示您的代码和您的具体问题。
  • 问题太宽泛了。你使用什么绘图技术? GDI ?一些二维库? Windows 窗体 ? WPF ?
  • @Tigran 我认为绘画与问题无关。它只是一个插图。
  • 是的,我只需要计算点数。抱歉没有添加我的代码,我认为添加它没有意义......我会在几秒钟内添加它。
  • 您可以使用 抛射运动 公式轻松准确地求解位移,从而在每次计算迭代中以指数方式增加时间。

标签: c# .net vb.net vector 2d


【解决方案1】:

此代码对我有用。我使用了一个按钮和计时器 ontick 事件。您可以调整常数。

Dim currentObjectAccelerationX As Decimal = 0
Dim currentObjectAccelerationY As Decimal = 0

Dim currentObjectPointX As Decimal
Dim currentObjectPointY As Decimal

Const maxDistance As Integer = 50
Const accelerationDenominator As Integer = 50
Const deceleration As Decimal = 0.2

Public Sub New()

    ' This call is required by the designer.
    InitializeComponent()

    ' Add any initialization after the InitializeComponent() call.
    currentObjectPointX = Button1.Location.X
    currentObjectPointY = Button1.Location.Y

    Timer1.Start()
End Sub

Private Sub onTick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
    Dim MousePointX As Integer = Me.PointToClient(Cursor.Position).X
    Dim MousePointY As Integer = Me.PointToClient(Cursor.Position).Y

    Dim OffsetX As Decimal = currentObjectPointX - MousePointX
    Dim OffsetY As Decimal = currentObjectPointY - MousePointY



    If Math.Abs(OffsetX) < maxDistance AndAlso Math.Abs(OffsetY) < maxDistance Then


        Dim accelerationX As Decimal = 0
        Dim accelerationY As Decimal = 0

        If OffsetX > 0 Then
            accelerationX = 1 + (maxDistance - OffsetX) / accelerationDenominator
        Else
            accelerationX = -1 + (-maxDistance - OffsetX) / accelerationDenominator
        End If

        If OffsetY > 0 Then
            accelerationY = 1 + (maxDistance - OffsetY) / accelerationDenominator
        Else
            accelerationY = -1 + (-maxDistance - OffsetY) / accelerationDenominator
        End If


        currentObjectAccelerationX += accelerationX
        currentObjectAccelerationY += accelerationY
    End If

    currentObjectPointX += currentObjectAccelerationX
    currentObjectPointY += currentObjectAccelerationY

    If (Math.Abs(currentObjectAccelerationX) <= deceleration) Then
        currentObjectAccelerationX = 0
    ElseIf (currentObjectAccelerationX > deceleration) Then
        currentObjectAccelerationX -= deceleration
    ElseIf (currentObjectAccelerationX < deceleration) Then
        currentObjectAccelerationX += deceleration
    End If

    If (Math.Abs(currentObjectAccelerationY) <= deceleration) Then
        currentObjectAccelerationY = 0
    ElseIf (currentObjectAccelerationY > deceleration) Then
        currentObjectAccelerationY -= deceleration
    ElseIf (currentObjectAccelerationY < deceleration) Then
        currentObjectAccelerationY += deceleration
    End If

    Button1.Location = New Point(currentObjectPointX, currentObjectPointY)
End Sub

【讨论】:

    猜你喜欢
    • 2020-05-21
    • 1970-01-01
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多