[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 = , Optional y As Double = )
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)) * ( / 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))) *
( / 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
[VB.NET][C#]二维向量的基本运算的更多相关文章
- [LeetCode] Flatten 2D Vector 压平二维向量
Implement an iterator to flatten a 2d vector. For example,Given 2d vector = [ [1,2], [3], [4,5,6] ] ...
- 【Unity3D】计算二维向量夹角(-180到180)
在Unity3D中,有时候我们需要计算二维向量的夹角.二维向量夹角一般在0~180度之前,可以直接调用Vector2.Angle(Vector2 from, Vector2 to)来计算. 但是在有些 ...
- 用vector实现二维向量
如果一个向量的每一个元素是一个向量,则称为二维向量,例如 vector<vector<int> >vv(3, vector<int>(4));//这里,两个“> ...
- [LeetCode] 251. Flatten 2D Vector 压平二维向量
Implement an iterator to flatten a 2d vector. For example,Given 2d vector = [ [1,2], [3], [4,5,6] ] ...
- uda 3.C++二维向量
二维向量 接下来,你将使用向量来存储矩阵.就像 Python 使用列表列表来存储矩阵一样,C++ 使用的是向量的向量.用于声明二维向量的语法有点复杂. 假设你正在使用 Python,并且想存储一个 3 ...
- ACM计算几何模板——二维几何基础(基本运算,点和线,多边形)
/*==========================*\ | 计算几何基础函数 | | 1.点和向量的定义 | | 2.向量的基本运算 | | 3.点积 | | 4.向量长度 | | 5.两向量角 ...
- [Swift]LeetCode251.展平二维向量 $ Flatten 2D Vector
Implement an iterator to flatten a 2d vector. For example,Given 2d vector = [ [1,2], [3], [4,5,6] ] ...
- 二维离散余弦变换(2D-DCT)
图像处理中常用的正交变换除了傅里叶变换以外,还有一些其它常用的正交变换,其中离散余弦变换DCT就是一种,这是JPEG图像压缩算法里的核心算法,这里我们也主要讲解JPEG压缩算法里所使用8*8矩阵的二维 ...
- 二维vector的使用
和数组一样,数组有二维的数组,vector也有二维的vector.下面就介绍一下二维vector的使用方法. 一般声明初始化二维vector有三种方法 (1) vector< vector< ...
随机推荐
- THE CUP OF LIFE即生命之杯。
生命之杯 编辑 THE CUP OF LIFE即生命之杯. <生命之杯>(西班牙语:La copa de la vida,英语:The Cup of Life)是一首由波多黎各裔歌手瑞奇· ...
- 《面向对象程序设计》 三 Calculator 计算器初步
Git传送门 纸上得来终觉浅,绝知此事要躬行. 学习了一些c++的相应知识后,虽然了解写法,真正操作时还是出现小错误.要多操作,记住关键点,避免不该有的小错误. 写分文件类外定义时出现了问题.在Sca ...
- SDN上机第二次作业
SDN第二次上机作业 1.安装floodlight 参考链接:http://www.sdnlab.com/19189.html 2.生成拓扑并连接控制器floodlight,利用控制器floodlig ...
- U-Mail邮件群发触发器功能助力营销自动化
小编在朋友圈看到的人工智能讨论越来越多,越来越多的上班族惶恐不安,担心自己的饭碗不保将被人工智能所取代,这说明智能化.自动化正成为各行业的趋势,营销也概莫能外.营销的自动化意味着将大大节省从业人员的精 ...
- 原生js实现一个DIV的碰撞反弹运动
原生js实现一个DIV的碰撞反弹运动: 关键在于DIV的边界检测,进而改变运动方向,即可实现碰撞反弹效果. <!DOCTYPE html> <html lang="en& ...
- Hibernate查询(HQL——Hibernate Query Language)
HQL查询 HQL提供了是十分强大的功能,它是针对持久化对象,用取得对象,而不进行update,delete和insert等操作.而且HQL是面向对象的,具备继承,多态和关联等特性. from子句: ...
- super深究
super的入门使用: 在类的继承中,如果定义某个方法,该方法会覆盖父类的同名方法,但有时候我们希望能同时实现父类的功能,这时,我们就需要调用父类的方法了,可以通过使用super来实现.比如: cla ...
- 【洛谷】【st表+模拟】P1311 选择客栈
[题目描述:] 丽江河边有n 家很有特色的客栈,客栈按照其位置顺序从 1 到n 编号.每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一家咖啡店,每家咖 ...
- Caused by: org.apache.velocity.exception.MethodInvocationException: Invocation of method 'getUser' in class org.uncommons.reportng.ReportMetadata threw exception class java.net.UnknownHostException :
Running TestSuite [TestNG] [WARN] Ignoring duplicate listener : org.uncommons.reportng.HTMLReporter ...
- P1736 创意吃鱼法
题目描述 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢(猫猫就是这么可爱,吃鱼也要想好吃法 ^_*).她发现,把大池子视为01矩阵(0表示对应位置无鱼,1 ...