Diễn Đàn » Hướng Dẫn Lập trình

làm việt với vectơ trong VB.Net

0 trả lời, 494 lượt xem — Trang 1 / 1
Làm việc với vectơ
Bạn cần thực hiện các phép tính với các vector ba chiều.
Tự tạo một lớp vector đơn giản.
.NET Framework không có sự hỗ trợ nội tại nào cho các phép tính vector. Tuy nhiên, dễ dàng tạo được một lớp biểu diễn các vector. Lớp này sẽ có các phương thức như Add, Subtract, Multiply, và DivideBy, cũng như một vài hàm đặc trưng như GetCrossProduct và GetDotProduct. Ngoài ra, lớp này cũng sẽ hỗ trợ việc sao chép và so sánh (hữu ích khi sắp xếp các mảng vector), và nó sẽ chép đè phương thức Equals để kiểm tra tính bằng nhau và ToString để cung cấp một biểu diễn chuỗi phù hợp. Chương 4 sẽ trình bày cách hiện thực những kỹ thuật này trong các lớp tùy biến.
Mã lệnh đầy đủ cho lớp Vector như sau:
Public Class Vector    Implements ICloneable, IComparable    ' Toạ độ.    Public x, y, z As Double    ' Tạo một vector mới.    Public Sub New(ByVal x As Double, ByVal y As Double, _      ByVal z As Double)        Me.x = x        Me.y = y        Me.z = z    End Sub    ' Cộng một vector vào vector hiện tại.    Public Function Add(ByVal vector As Vector) As Vector        Return New Vector(Me.x + vector.x, Me.y + vector.y, _          Me.z + vector.z)    End Function    ' Lấy vector hiện tại trừ đi một vector.    Public Function Subtract(ByVal vector As Vector) As Vector        Return New Vector(Me.x - vector.x, Me.y - vector.y, _          Me.z - vector.z)    End Function    ' Nhân vector hiện tại với một scalar.    Public Function Multiply(ByVal n As Double) As Vector        Return New Vector(Me.x * n, Me.y * n, Me.z * n)    End Function    ' Chia vector hiện tại cho một scalar.    Public Function DivideBy(ByVal n As Double) As Vector        Return New Vector(Me.x / n, Me.y / n, Me.z / n)    End Function    ' Định nghĩa vài phương thức trợ giúp.    Public Function GetCrossProduct(ByVal vector As Vector) As Vector        Return New Vector(Me.y * vector.z - Me.z * vector.y, _          -Me.x * vector.z + Me.z * vector.x, _          Me.x * vector.y - Me.y * vector.x)    End Function    Public Function GetDotProduct(ByVal vector As Vector) As Double        Return (Me.x * vector.x + Me.y * vector.y + Me.z * vector.z)    End Function    Public Function Length() As Double        Return Math.Sqrt(Me.x * Me.x + Me.y * Me.y + Me.z * Me.z)    End Function    Public Function Normalize() As Vector        Dim nLength As Double        nLength = Length()        If nLength = 0 Then Throw New DivideByZeroException()        Return New Vector(Me.x / nLength, Me.y / nLength, Me.z / nLength)    End Function    ' Kiểm tra vector hiện tại và một vector khác có bằng nhau hay không.    Public Overloads Function Equals(ByVal obj As Object) As Boolean        If Not (TypeOf obj Is Vector) Then Return False        Dim Compare As Vector = CType(obj, Vector)        Return (Me.x = Compare.x And Me.y = Compare.y And Me.z = _          Compare.z)    End Function    ' Kiểm tra hai vector có bằng nhau hay không.    Public Overloads Shared Function Equals(ByVal objA As Object, _      ByVal objB As Object) As Boolean        If Not (TypeOf objA Is Vector) Or _          Not (TypeOf objB Is Vector) Then Return False        Dim VectorA As Vector = CType(objA, Vector)        Dim VectorB As Vector = CType(objB, Vector)        Return (VectorA.x = VectorB.x And VectorA.y = VectorB.y _          And VectorA.z = VectorB.z)    End Function    Public Overrides Function ToString() As String        Return "(" & Me.x.ToString() & ", " & _          Me.y.ToString() & ", " & Me.z.ToString() & ")"    End Function    ' Chép một vector.    Public Function Clone() As Object Implements System.ICloneable.Clone        Return New Vector(Me.x, Me.y, Me.z)    End Function    ' So sánh hai vector (cho phép sắp xếp mảng).    Public Function CompareTo(ByVal obj As Object) As Integer _      Implements System.IComparable.CompareTo        If Not (TypeOf obj Is Vector) Then Return 0        Dim Compare As Vector = CType(obj, Vector)        Return Me.Length().CompareTo(Compare.Length())    End FunctionEnd Class

Chú ý rằng Visual Basic .NET không hỗ trợ toán tử nạp chồng, cho nên bạn phải sử dụng các phương thức để thực hiện các thao tác trên vector (Add, Subtract...) chứ không phải các toán tử đã được định nghĩa trước (như + và -). Đây chỉ là một bất tiện không đáng kể.
Dưới đây là một thử nghiệm đơn giản:
Dim v1 As New Vector(10, 2, -3)Dim v2 As New Vector(1, -2, -4)Dim v3 As New Vector(10, 2, -3)If v1.Equals(v3) Then    ' Thành công, vì c1 = c3.    Console.WriteLine("Passed value equality test.")End If   v1 = v1.GetCrossProduct(v2)   ' Lệnh này sẽ hiển thị "(-14, 37, -22)".Console.WriteLine(v1.ToString()) 
Trích từ “Các giải pháp lập trình Visual Basic (tập 1)”
Đăng nhập để trả lời
0