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:
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:
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)”