我的问题是关于计算二维中两个向量之间最小角度的方向。我正在用 C++ 制作游戏,其中一个障碍是寻热导弹发射器。我通过计算目标和子弹之间的向量、标准化向量然后乘以它的速度来让它工作。但是,我现在要回到这门课上,让它变得更好。我希望它仅在子弹矢量处于某个角度(子弹矢量和矢量 bulletloc-> 目标之间的角度)内时才立即锁定玩家,而不是立即锁定玩家。否则,我希望它缓慢地向目标平移一个度数,从而为玩家提供足够的空间来避开它。我已经完成了所有这些(在一个 vb.net 项目中,所以我可以简化问题,解决它然后用 C++ 重新编写)。然而,即使最快的路线是逆时针方向,子弹总是顺时针方向旋转。所以问题在于确定应用旋转的方向,以便覆盖最小的角度。这是我的代码,因此您可以尝试查看我所描述的内容:
    Function Rotate(ByVal a As Double, ByVal tp As Point, ByVal cp As Point, ByVal cv As Point)
    'params a = angle, tp = target point, cp = current point, cv = current vector of bullet'
    Dim dir As RotDir 'direction to turn in'
    Dim tv As Point 'target vector cp->tp'
    Dim d As Point 'destination point (d) = cp + vector'
    Dim normal As Point
    Dim x1 As Double
    Dim y1 As Double
    Dim VeritcleResolution As Integer = 600
    tp.Y = VeritcleResolution - tp.Y 'modify y parts to exist in plane with origin (0,0) in bottom left'
    cp.Y = VeritcleResolution - cp.Y
    cv.Y = cv.Y * -1
    tv.X = tp.X - cp.X 'work out cp -> tp'
    tv.Y = tp.Y - cp.Y
    'calculate angle between vertor to target and vecrot currntly engaed on'
    Dim tempx As Double
    Dim tempy As Double
    tempx = cv.X * tv.X
    tempy = cv.Y * tv.Y
    Dim DotProduct As Double
    DotProduct = tempx + tempy 'dot product of cp-> d and cp -> tp'
    Dim magCV As Double 'magnitude of current vector'
    Dim magTV As Double 'magnitude of target vector'
    magCV = Math.Sqrt(Math.Pow(cv.X, 2) + Math.Pow(cv.Y, 2))
    magTV = Math.Sqrt(Math.Pow(tv.X, 2) + Math.Pow(tv.Y, 2))
    Dim VectorAngle As Double
    VectorAngle = Acos(DotProduct / (magCV * magTV))
    VectorAngle = VectorAngle * 180 / PI 'angle between cp->d and cp->tp'
    If VectorAngle < a Then 'if the angle is small enough translate directly towards target'
        cv = New Point(tp.X - cp.X, tp.Y - cp.Y)
        magCV = Math.Sqrt((cv.X ^ 2) + (cv.Y ^ 2))
        If magCV = 0 Then
            x1 = 0
            y1 = 0
        Else
            x1 = cv.X / magCV
            y1 = cv.Y / magCV
        End If
        normal = New Point(x1 * 35, y1 * 35)
        normal.Y = normal.Y * -1
        cv = normal
    ElseIf VectorAngle > a Then 'otherwise smootly translate towards the target'
        Dim x As Single
        d = New Point(cp.X + cv.X, cp.Y + cv.Y)
        a = (a * -1) * PI / 180 'THIS LINE CONTROL DIRECTION a = (a*-1) * PI / 180 would make the rotation counter clockwise'
        'rotate the point'
        d.X -= cp.X
        d.Y -= cp.Y
        d.X = (d.X * Cos(a)) - (d.Y * Sin(a))
        d.Y = (d.X * Sin(a)) + (d.Y * Cos(a))
        d.X += cp.X
        d.Y += cp.Y
        cv.X = d.X - cp.X
        cv.Y = d.Y - cp.Y
        cv.Y = cv.Y * -1
    End If
    Return cv
End Function
我的一个想法是计算出两个向量的方位角,如果差异大于 180 度,则顺时针旋转,否则逆时针旋转,任何想法都会有所帮助。谢谢。
编辑:我想补充一点,这个网站非常有帮助。我经常用别人提出的问题来解决我自己的问题,我想借此机会说声谢谢。