[VB.NET][C#]二維向量的基本運算


前言

     在數學中,幾何向量是指具有大小和方向的幾何對象。

  在編程中,向量應用廣泛,尤其適用於圖形編程和游戲物理引擎。

第一節 構造函數

  通過創建一個二維向量的類(或結構體),實現向量的表示及其運算。

  1. 首先,將類命名為“Vector2D”

  2. 添加兩個屬性 X 和 Y ,分別表示二維向量的兩個分量

  3. 實現構造函數,實例化時即初始化 X,Y 的值

Public Class Vector2D
    Public Property x As Double 'x分量
    Public Property y As Double 'y分量
    ''' <summary>
    ''' 二維向量類,能夠實現平面向量的表示與運算
    ''' </summary>
    ''' <param name="x">向量的X初始值,默認為0</param>
    ''' <param name="y">向量的Y初始值,默認為0</param>
    Public Sub New(Optional x As Double = 0, Optional y As Double = 0)
        Me.x = x
        Me.y = y
    End Sub
End Class

第二節 四則運算

  1.添加 Public 方法“Add()”,實現向量與向量加法

    ''' <summary>
    ''' 加上一個向量
    ''' </summary>
    ''' <param name="vector">要加的向量</param>
    ''' <remarks></remarks>
    Public Sub Add(ByVal vector As Vector2D)
        x += vector.x
        y += vector.y
    End Sub 

  2.添加 Public 方法“Minus()”,實現向量與向量減法

    ''' <summary>
    ''' 減去一個向量
    ''' </summary>
    ''' <param name="vector">要減的向量</param>
    ''' <remarks></remarks>
    Public Sub Minus(ByVal vector As Vector2D)
        x -= vector.x
        y -= vector.y
    End Sub 

  3.添加 Public 方法“Multiply()”,實現向量與標量乘法

    ''' <summary>
    ''' 乘以一個標量
    ''' </summary>
    ''' <param name="number">要乘的標量</param>
    ''' <remarks></remarks>
    Public Sub Multiply(ByVal number As Double)
        x *= number
        y *= number
    End Sub 

  4.添加 Public 方法“Divide()”,實現向量與標量除法

    ''' <summary>
    ''' 除以一個標量
    ''' </summary>
    ''' <param name="number">要除的標量</param>
    ''' <remarks></remarks>
    Public Sub Divide(ByVal number As Double)
        x /= number
        y /= number
    End Sub

第三節 重載運算符

  利用運算符重載(而不是調用方法)可以更簡便的實現向量運算。

  1. 直接在 Vector2D 類里重載運算符。

    '重載向量與向量加法運算符
    Public Overloads Shared Operator +(ByVal LeftVector As Vector2D, ByVal RightVector As Vector2D) As Vector2D
        Return New Vector2D(LeftVector.x + RightVector.x, LeftVector.y + RightVector.y)
    End Operator
    '重載向量與向量減法運算符
    Public Overloads Shared Operator -(ByVal LeftVector As Vector2D, ByVal RightVector As Vector2D) As Vector2D
        Return New Vector2D(LeftVector.x - RightVector.x, LeftVector.y - RightVector.y)
    End Operator
    '重載向量與標量乘法運算符
    Public Overloads Shared Operator *(ByVal LeftVector As Vector2D, ByVal RightNum As Double) As Vector2D
        Return New Vector2D(LeftVector.x * RightNum, LeftVector.y * RightNum)
    End Operator
    '重載標量與向量乘法運算符(交換律)
    Public Overloads Shared Operator *(ByVal LeftNum As Double, ByVal RightVector As Vector2D) As Vector2D
        Return New Vector2D(RightVector.x * LeftNum, RightVector.y * LeftNum)
    End Operator
    '重載向量與標量除法運算符
    Public Overloads Shared Operator /(ByVal LeftVector As Vector2D, ByVal RightNum As Double) As Vector2D
        Return New Vector2D(LeftVector.x / RightNum, LeftVector.y / RightNum)
    End Operator

第四節 模的計算

  1.添加 Public 函數“Magnitude()”,實現計算模長

    ''' <summary>
    ''' 返回向量的模長
    ''' </summary>
    ''' <returns></returns>
    Public Function Magnitude() As Double
        Return Math.Sqrt(x * x + y * y)
    End Function

  2.添加 Public 方法“SetMag()”,實現設定模長

    ''' <summary>
    ''' 指定向量的模長
    ''' </summary>
    ''' <param name="sPutNum">指定的長度</param>
    Public Sub SetMag(ByVal sPutNum As Double)
        Dim tempMag As Double = Me.Magnitude
            x = x * (sPutNum / tempMag)
            y = y * (sPutNum / tempMag)
    End Sub

  3.添加 Public 方法“LimitMag()”,實現限制模長

    ''' <summary>
    ''' 限制向量模長,小於或等於某一值
    ''' </summary>
    ''' <param name="lUponNum">指定的最大值</param>
    Public Sub LimitMag(ByVal lUponNum As Double)
        Dim tempMag As Double = Me.Magnitude
        If tempMag > lUponNum Then
            x = x * (lUponNum / tempMag)
            y = y * (lUponNum / tempMag)
        End If
    End Sub

第五節 夾角與旋轉

  1.添加 Public Shared 函數“GetHeading()”,實現計算向量的方向角

    ''' <summary>
    ''' '求向量的方向角
    ''' </summary>
    ''' <param name="gVector">指定的向量</param>
    ''' <returns></returns>
    Public Shared Function GetHeading(ByVal gVector As Vector2D) As Double
        Dim Angle As Double
        Angle = Math.Asin(gVector.x / Math.Sqrt(gVector.x * gVector.x + gVector.y * gVector.y)) * (180 / Math.PI)
        Return Angle
    End Function

  2.添加 Public Shared 函數“GetAngleBetween()”,實現計算兩個向量的夾角

    ''' <summary>
    '''  '求兩向量的夾角
    ''' </summary>
    ''' <param name="gLeftVector">第一個向量</param>
    ''' <param name="gRightVector">第二個向量</param>
    ''' <returns></returns>
    Public Shared Function GetAngleBetween(ByVal gLeftVector As Vector2D, ByVal gRightVector As Vector2D) As Double
        Dim Angle As Double
        Angle = Math.Asin((gLeftVector.x * gRightVector.x + gLeftVector.y * gRightVector.y) /
                          (Math.Sqrt(gLeftVector.x * gLeftVector.x + gLeftVector.y * gLeftVector.y) *
                           Math.Sqrt(gRightVector.x * gRightVector.x + gRightVector.y * gRightVector.y))) *
                          (180 / Math.PI)
        Return Angle
    End Function

  3.添加Public方法“Rotate()”,實現向量旋轉

    ''' <summary>
    ''' 向量旋轉
    ''' </summary>
    ''' <param name="gAngle">指定旋轉的角度,弧度制</param>
    Public Sub Rotate(ByVal gAngle As Double)
        Dim x1, y1 As Double
        x1 = x * Math.Cos(gAngle) - y * Math.Sin(gAngle)
        y1 = y * Math.Cos(gAngle) + x * Math.Sin(gAngle)
        x = x1
        y = y1
    End Sub

 附錄

  System.Numerics 命名空間提供了一套啟用了 SIMD 的矢量類型。

  Vector2 結構:System.Numerics.Vector2


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM