精华内容
下载资源
问答
  • python二维向量运算_[VB.NET][C#]二维向量的基本运算
    2021-01-29 07:05:58

    前言

    在数学中,几何向量是指具有大小和方向的几何对象。

    在编程中,向量有着广泛的应用,其作用在图形编程和游戏物理引擎方面尤为突出。

    第一节 构造函数

    通过创建一个二维向量的类(或结构体),实现向量的表示及其运算。

    1. 首先,将类命名为“Vector2D”

    2. 添加两个属性 X 和 Y ,分别表示二维向量的两个分量

    3. 实现构造函数,实例化时即初始化 X,Y 的值

    Public Class Vector2D

    Public Property x As Double 'x分量

    Public Property y As Double 'y分量

    '''

    ''' 二维向量类,能够实现平面向量的表示与运算

    '''

    ''' 向量的X初始值,默认为0

    ''' 向量的Y初始值,默认为0

    Public Sub New(Optional x As Double = , Optional y As Double = )

    Me.x = x

    Me.y = y

    End Sub

    End Class

    第二节四则运算

    1.添加 Public 方法“Add()”,实现向量与向量加法

    '''

    ''' 加上一个向量

    '''

    ''' 要加的向量

    '''

    Public Sub Add(ByVal vector As Vector2D)

    x += vector.x

    y += vector.y

    End Sub

    2.添加 Public 方法“Minus()”,实现向量与向量减法

    '''

    ''' 减去一个向量

    '''

    ''' 要减的向量

    '''

    Public Sub Minus(ByVal vector As Vector2D)

    x -= vector.x

    y -= vector.y

    End Sub

    3.添加 Public 方法“Multiply()”,实现向量与标量乘法

    '''

    ''' 乘以一个标量

    '''

    ''' 要乘的标量

    '''

    Public Sub Multiply(ByVal number As Double)

    x *= number

    y *= number

    End Sub

    4.添加 Public 方法“Divide()”,实现向量与标量除法

    '''

    ''' 除以一个标量

    '''

    ''' 要除的标量

    '''

    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()”,实现计算模长

    '''

    ''' 返回向量的模长

    '''

    '''

    Public Function Magnitude() As Double

    Return Math.Sqrt(x * x + y * y)

    End Function

    2.添加 Public 方法“SetMag()”,实现设定模长

    '''

    ''' 指定向量的模长

    '''

    ''' 指定的长度

    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()”,实现限制模长

    '''

    ''' 限制向量模长,小于或等于某一值

    '''

    ''' 指定的最大值

    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()”,实现计算向量的方向角

    '''

    ''' '求向量的方向角

    '''

    ''' 指定的向量

    '''

    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()”,实现计算两个向量的夹角

    '''

    ''' '求两向量的夹角

    '''

    ''' 第一个向量

    ''' 第二个向量

    '''

    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()”,实现向量旋转

    '''

    ''' 向量旋转

    '''

    ''' 指定旋转的角度,弧度制

    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 的矢量类型。

    [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 >vv(3, vector(4));//这里,两个“&gt ...

    [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&lt ...

    随机推荐

    hdu 4114(状压dp&rpar;

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4114 思路:首先是floyd预处理出任意两点之间的最短距离.dp[state1][state2][u] ...

    在matlab中实现遥感影像和shp文件的结合显示

    clc;close all;clear; road=shaperead('boston_roads.shp'); %读取shape文件 figure, mapshow('boston.tif'); % ...

    Linux设置FQDN

    FQDN是Fully Qualified Domain Name的缩写, 含义是完整的域名. 例如, 一台机器主机名(hostname)是www, 域后缀(domain)是example.com, 那 ...

    Selenium之偷懒教程

    进来一直停留在基础理论知识的学习中,认为太乏味,就写了一个网页自己主动化的demo:自己主动写日报.省的以后自己打开网页写啦. 直接上代码: 自己主动填写日报DEMO import java.io.B ...

    maven添加本地jar包依赖

    1.  在java工程下新建文件夹,如repo/allin/allin-util/0.1 然后jar包扔进去,如下图: 2. 修改pom.xml文件,增加以下 ...

    TortoiseSVN使用简介&lpar;收藏&rpar;

    TortoiseSVN使用简介 1.安装及下载client 端 2.什么是SVN(Subversion)? 3.为甚么要用SVN? 4.怎么样在Windows下面建立SVN Repository? 5 ...

    SpringCloud之初识Robbin---负载均衡

    在上一篇中讲解Eureka注册中心的案例,我们启动了一个user-service,然后通过DiscoveryClient来获取服务实例信息,然后获取ip和端口来访问. 但是实际环境中,我们往往会开启很 ...

    initializer&lowbar;list 列表初始化

    initializer_list 列表初始化 用花括号初始化器列表初始化一个对象,其中对应构造函数接受一个 std::initializer_list 参数. #include

    fastjson总结

    1,文件的转成字节数组byte[]的时候,可以直接用fastjson序列化和反序列化 2,用@RequestBody接受json的时候,content-type是否已经application/json ...

    虚拟机 安装 CentOS7

    初次接触CentOS,最好是在虚拟机中安装: 因为CentOS的安装选项有很多,不理解的情况下千万不要在物理机上尝试: 不然可能出现这种情况:安装好以后,只有黑色的屏幕,只能在里面敲命令:这对于新手来 ...

    更多相关内容
  • 自定义向量类定义和向量四则运算,包括点乘叉乘。可以实现不规则图形面积计算。带测试例子,已自己测试通过
  • 向量和矩阵相乘时,用矩阵的每一行去和向量的每一列相乘 即得到的第一个值为 a1 * b1+a2 * b2. 得到的第二个值为 a3 * b1+a4 * b2. 实例 矩阵矩阵相乘时 假如上面的矩阵A一个新的矩阵B相乘 先A的第一行去乘B...

    在学习吴恩达教授机器学习时,其中讲解到关于矩阵向量部分。由此记录。
    概念
    矩阵实例
    下面的矩阵用A来代替
    在这里插入图片描述
    向量
    在这里插入图片描述
    向量和矩阵相乘时,用矩阵的每一行去和向量的每一列相乘
    即得到的第一个值为 a1 * b1+a2 * b2.
    得到的第二个值为 a3 * b1+a4 * b2.
    在这里插入图片描述
    实例
    在这里插入图片描述
    矩阵和矩阵相乘时
    假如上面的矩阵A和一个新的矩阵B相乘
    在这里插入图片描述
    先A的第一行去乘B的第一列,得到第一个值 a1 * b1+a2 * b2 记为值 V1
    再用A的第二行去乘B的第一列,得到第二个值 a3 * b1+a4 * b2 记为值 V2
    再用A的第一行去乘B的第二列,得到第二个值 a1 * b3+a2 * b4 记为值 V3
    再用A的第二行去乘B的第二列,得到第二个值 a3 * b3+a4 * b4 记为值 V4
    摆放位置为
    在这里插入图片描述
    计算实例
    在这里插入图片描述
    A与B相乘时,记A * B,结果的行数由A确定,结果的列数有B确定。

    在数学中,有a * 1=1 * a=a
    但是在矩阵乘法中,矩阵A*矩阵B并不等于矩阵B乘以矩阵A (可自行去验证)。
    那要使得矩阵A 乘以一个矩阵 B等于 矩阵B乘以矩阵A,矩阵B只能为单位矩阵,也称方阵

    定义为
    在这里插入图片描述
    在这里插入图片描述

    实例:
    测试矩阵:记为A

    在这里插入图片描述
    该矩阵为3行2列,等号左边对应的单位矩阵I为: 记为B
    在这里插入图片描述
    根据公式,等号右边的单位矩阵I为:记为C
    在这里插入图片描述
    根据公式验证 A * B =C * A = A

    逆矩阵,一个矩阵的逆矩阵和该矩阵相乘得出方阵

    实例:
    在这里插入图片描述
    则记此时的A(-1)为矩阵A的逆矩阵.

    转置矩阵:
    在这里插入图片描述
    A(T)为矩阵A的转置矩阵

    最后,举例该算法的用法

    在这里插入图片描述
    为了得到函数h(x),可以将θ设为一个矩阵,里面数据为θ0到θn,X设为一个矩阵,添加一个X0,值设为1.其他值为X1到Xn。则函数h(x)等于 矩阵θ的转置矩阵乘以矩阵X。

    展开全文
  • 第一节 构造函数通过创建一个二维向量(或结构体),实现向量的表示及其运算。1. 首先,将命名为“Vector2D”2. 添加两个属性 X Y ,分别表示二维向量的两个分量3. 实现构造函数,实例化时即初始化 X,Y 的值...

    前言

    在数学中,几何向量是指具有大小和方向的几何对象。

    在编程中,向量有着广泛的应用,其作用在图形编程和游戏物理引擎方面尤为突出。

    第一节 构造函数

    通过创建一个二维向量的类(或结构体),实现向量的表示及其运算。

    1. 首先,将类命名为“Vector2D”

    2. 添加两个属性 X 和 Y ,分别表示二维向量的两个分量

    3. 实现构造函数,实例化时即初始化 X,Y 的值

    Public Class Vector2D

    Public Property x As Double 'x分量

    Public Property y As Double 'y分量

    '''

    ''' 二维向量类,能够实现平面向量的表示与运算

    '''

    ''' 向量的X初始值,默认为0

    ''' 向量的Y初始值,默认为0

    Public Sub New(Optional x As Double = , Optional y As Double = )

    Me.x = x

    Me.y = y

    End Sub

    End Class

    第二节四则运算

    1.添加 Public 方法“Add()”,实现向量与向量加法

    '''

    ''' 加上一个向量

    '''

    ''' 要加的向量

    '''

    Public Sub Add(ByVal vector As Vector2D)

    x += vector.x

    y += vector.y

    End Sub

    2.添加 Public 方法“Minus()”,实现向量与向量减法

    '''

    ''' 减去一个向量

    '''

    ''' 要减的向量

    '''

    Public Sub Minus(ByVal vector As Vector2D)

    x -= vector.x

    y -= vector.y

    End Sub

    3.添加 Public 方法“Multiply()”,实现向量与标量乘法

    '''

    ''' 乘以一个标量

    '''

    ''' 要乘的标量

    '''

    Public Sub Multiply(ByVal number As Double)

    x *= number

    y *= number

    End Sub

    4.添加 Public 方法“Divide()”,实现向量与标量除法

    '''

    ''' 除以一个标量

    '''

    ''' 要除的标量

    '''

    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()”,实现计算模长

    '''

    ''' 返回向量的模长

    '''

    '''

    Public Function Magnitude() As Double

    Return Math.Sqrt(x * x + y * y)

    End Function

    2.添加 Public 方法“SetMag()”,实现设定模长

    '''

    ''' 指定向量的模长

    '''

    ''' 指定的长度

    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()”,实现限制模长

    '''

    ''' 限制向量模长,小于或等于某一值

    '''

    ''' 指定的最大值

    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()”,实现计算向量的方向角

    '''

    ''' '求向量的方向角

    '''

    ''' 指定的向量

    '''

    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()”,实现计算两个向量的夹角

    '''

    ''' '求两向量的夹角

    '''

    ''' 第一个向量

    ''' 第二个向量

    '''

    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()”,实现向量旋转

    '''

    ''' 向量旋转

    '''

    ''' 指定旋转的角度,弧度制

    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 的矢量类型。

    &lbrack;LeetCode&rsqb; 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 >vv(3, vector(4));//这里,两个“&gt ...

    &lbrack;LeetCode&rsqb; 251&period; Flatten 2D Vector 压平二维向量

    Implement an iterator to flatten a 2d vector. For example,Given 2d vector = [ [1,2], [3], [4,5,6] ] ...

    uda 3&period;C&plus;&plus;二维向量

    二维向量 接下来,你将使用向量来存储矩阵.就像 Python 使用列表列表来存储矩阵一样,C++ 使用的是向量的向量.用于声明二维向量的语法有点复杂. 假设你正在使用 Python,并且想存储一个 3 ...

    ACM计算几何模板——二维几何基础(基本运算,点和线,多边形)

    /*==========================*\ | 计算几何基础函数 | | 1.点和向量的定义 | | 2.向量的基本运算 | | 3.点积 | | 4.向量长度 | | 5.两向量角 ...

    &lbrack;Swift&rsqb;LeetCode251&period;展平二维向量 &dollar; 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&lt ...

    随机推荐

    hdu 4114(状压dp&rpar;

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4114 思路:首先是floyd预处理出任意两点之间的最短距离.dp[state1][state2][u] ...

    在matlab中实现遥感影像和shp文件的结合显示

    clc;close all;clear; road=shaperead('boston_roads.shp'); %读取shape文件 figure, mapshow('boston.tif'); % ...

    Linux设置FQDN

    FQDN是Fully Qualified Domain Name的缩写, 含义是完整的域名. 例如, 一台机器主机名(hostname)是www, 域后缀(domain)是example.com, 那 ...

    Selenium之偷懒教程

    进来一直停留在基础理论知识的学习中,认为太乏味,就写了一个网页自己主动化的demo:自己主动写日报.省的以后自己打开网页写啦. 直接上代码: 自己主动填写日报DEMO import java.io.B ...

    maven添加本地jar包依赖

    1.  在java工程下新建文件夹,如repo/allin/allin-util/0.1 然后jar包扔进去,如下图: 2. 修改pom.xml文件,增加以下 ...

    TortoiseSVN使用简介&lpar;收藏&rpar;

    TortoiseSVN使用简介 1.安装及下载client 端 2.什么是SVN(Subversion)? 3.为甚么要用SVN? 4.怎么样在Windows下面建立SVN Repository? 5 ...

    SpringCloud之初识Robbin---负载均衡

    在上一篇中讲解Eureka注册中心的案例,我们启动了一个user-service,然后通过DiscoveryClient来获取服务实例信息,然后获取ip和端口来访问. 但是实际环境中,我们往往会开启很 ...

    initializer&lowbar;list 列表初始化

    initializer_list 列表初始化 用花括号初始化器列表初始化一个对象,其中对应构造函数接受一个 std::initializer_list 参数. #include

    fastjson总结

    1,文件的转成字节数组byte[]的时候,可以直接用fastjson序列化和反序列化 2,用@RequestBody接受json的时候,content-type是否已经application/json ...

    虚拟机 安装 CentOS7

    初次接触CentOS,最好是在虚拟机中安装: 因为CentOS的安装选项有很多,不理解的情况下千万不要在物理机上尝试: 不然可能出现这种情况:安装好以后,只有黑色的屏幕,只能在里面敲命令:这对于新手来 ...

    展开全文
  • Unity3D C#数学系列之叉积

    千次阅读 2021-12-07 21:22:19
    向量叉积的定义、几何意义、性质与使用案例。


    1 定义

    已知向量 a ⃗ \vec{a} a 、向量 b ⃗ \vec{b} b ,则它们的叉积为 a ⃗ \vec{a} a × b ⃗ \vec{b} b
    a ⃗ \vec{a} a b ⃗ \vec{b} b 叉积得到的是一个新的向量,假设为向量 c ⃗ \vec{c} c
    那么向量 c ⃗ \vec{c} c 同时垂直与向量 a ⃗ \vec{a} a 和向量 b ⃗ \vec{b} b ,换句话说也就是向量 c ⃗ \vec{c} c 垂直于向量 a ⃗ \vec{a} a 和向量 b ⃗ \vec{b} b 构成的平面。
    叉积定义
    那么问题来了,向量 c ⃗ \vec{c} c 的方向和长度是多少?

    1.1 叉乘的方向

    一般教科书上说是根据右手定则来判定:右手平展,使大拇指与其余四指垂直,并且都跟手掌在一个平面内。将大拇指之外的其余四指与 a ⃗ \vec{a} a 的方向保持一致,然后四指转向 b ⃗ \vec{b} b 时,大拇指的方向即是 c ⃗ \vec{c} c 的方向。
    但我想说的是,用右手定则来判定方向其实是不严谨的。
    如果向量 a ⃗ \vec{a} a 和向量 b ⃗ \vec{b} b 是在左手坐标系(如Untiy中的局部坐标系、世界坐标系、屏幕坐标系)下,则应该用左手定则来判定 c ⃗ \vec{c} c 的方向。如果向量 a ⃗ \vec{a} a 和向量 b ⃗ \vec{b} b 是在右手坐标系(如Untiy中摄像机坐标系)下,则应该用右手定则来判定 c ⃗ \vec{c} c 的方向。
    所以在Unity中在对世界坐标系或局部坐标系下的向量来计算叉积时,应该用左手法则来判断。
    同时需要注意的是,使用Vector3.Cross求得的向量其方向也是满足左手坐标系的。
    叉积的方向

    1.2 叉乘的模

    同时,设 a ⃗ \vec{a} a b ⃗ \vec{b} b 的夹角为Θ,则有
    叉积的模

    2 几何意义

    叉积的几何意义

    其实就是上面定义的2点:
    ①向量 c ⃗ \vec{c} c 垂直于向量 a ⃗ \vec{a} a 和向量 b ⃗ \vec{b} b 构成的平面。
    (这个性质用得特别多,常用来求表面的法线或者用来构建标准正交基)
    ②叉乘的模其实就是向量 a ⃗ \vec{a} a 与向量 b ⃗ \vec{b} b 构成的平行四边形的面积。
    叉积的模其实平行四边形的面积

    3 常用公式

    常用公式
    上面的分配律证明挺复杂的,这里就不多说了。
    另外,设 a ⃗ \vec{a} a =(xa,ya, za), b ⃗ \vec{b} b =(xb,yb, zb)
    则有 c ⃗ \vec{c} c = (yazb - zayb,zaxb - xazb,xayb - yaxb)
    这个公式怎么来的?
    我们这里假设 a ⃗ \vec{a} a b ⃗ \vec{b} b 所在坐标系的x轴、y轴、z轴的单位向量分别为 x ⃗ \vec{x} x y ⃗ \vec{y} y z ⃗ \vec{z} z 。同时我们假设该坐标系为左手坐标系(如Unity中的世界坐标系)。
    叉乘坐标系
    叉乘推导过程

    4 应用案例

    ①构建坐标系
    比如我们的法线贴图里面保存的法线方向其实是在切线空间下的方向。我们已知模型上局部坐标系下某一顶点的法线、切线,但我们不想用局部坐标系下的坐标来表示法线,而想一个与顶点位置无关的坐标系来表示法线,这样有什么好处呢?就是一张法线贴图可以用在不同的模型上。那么切线空间是怎么构建出来的呢?很简单,法线方向和切线方向分别为两个坐标轴,法线和切线进行叉乘得到另外一个坐标轴(这个坐标轴被称为副切线Bi-tangent,或者副法线Bi-normal)。
    期限空间
    ②判断一个三角形是正面还是反面
    比如我们已知模型上的一个三角形的三个顶点(局部坐标系),三顶点的排列顺序为顺时针ABC,如图。那么相机从上方看三角形ABC时,看到的是正面还是反面?从下方看呢?
    三角形

    要解决这个问题,我们得先知道三角形的正面是怎么定义的。我们说,一个三角形的法线方向与相机的视线方向是相反的,那么相机看到的就是这个三角形的正面。如果一个三角形的法线方向与相机的视线方向是同向的,那么相机看到的就是这个三角形的反面。
    所以核心就在于求该三角形的法线方向,法线方向该怎么求?还记得叉乘的性质吗?

    向量 c ⃗ \vec{c} c (= a ⃗ \vec{a} a × b ⃗ \vec{b} b )垂直于向量 a ⃗ \vec{a} a 和向量 b ⃗ \vec{b} b 构成的平面

    A B ⃗ \vec{AB} AB × A C ⃗ \vec{AC} AC 可不就是三角形ABC的法线么(注意,不能是 A C ⃗ \vec{AC} AC × A B ⃗ \vec{AB} AB 哟,因为我们上面规定ABC是顺时针排列的,如果是逆时针排列才该用 A C ⃗ \vec{AC} AC × A B ⃗ \vec{AB} AB )。
    法线求到后,再求法线与视线方向的点积,若大于0,说明该三角形法线与视线方向相同,相机看到的是三角形的背面;若小于0,说明该三角形法线与视线方向相反,相机看到的是三角形的正面。

    博主本文博客链接。

    5 参考文章

    展开全文
  • 以统计学习理论为基础的支持向量机被广泛应用于机器学习的各个领域,是最通用的万能分类器。20世纪90年代,针对当时的神经网络在小样本条件下的不良表现,人们试图从更本质的层次上寻求一种更好的学习机器。在这种...
  • 二、向量在数学中向量定义是:既有大小又有方向的量叫作向量。在空间中,向量可以用一段有方向的线段来表示。向量在游戏开发过程中的应用十分广泛,可用于描述具有大小方向两个属性的物理量,例如物体运动的速度...
  • 支持向量机(SVM,也称为支持向量网络),支持向量机(support vector machines)是一种二分类模型,监督式学习 (Supervised Learning)的方法,主要用在统计分类 (Classification)问题回归分析 (Regression)问题上...
  • 种坐标系 1、World Space(世界坐标): 我们在场景中添加物体(如:Cube),他们都是以世界坐标显示在场景中的。transform.position可以获得该位置坐标。 2、Screen Space(屏幕坐标): 以像素来定义的,以屏幕...
  • 支持向量机1.支持向量机概述2. 寻找最大间隔3. 简化版 SMO 算法4.利用完整 Platt SMO 算法加速...观察个方框中的数据点分布,能否画出一条直线将圆形点方形点分开呢?答案是可以的。 那么,上述将数据集分隔开来的
  • 由于C#没有提供复数(Complex)的运算类库,复数需要自己定义。 我们主要呈现了两个,Complex,并做了一个MathX,将三角函数、指对函数等拓展到复数域。     ... 四则运算符 Arg() Mod...
  • 本篇文章将分享gensim词向量Word2Vec安装、基础用法,并实现《庆余年》中文短文本相似度计算及多个案例。本专栏主要结合作者之前的博客、AI经验相关文章及论文介绍,后面随着深入会讲解更多的Python人工智能案例及...
  • C#矩阵相乘

    千次阅读 2018-09-20 15:46:49
    //matrix1是m*n矩阵,matrix2是n*p矩阵,result是m*p矩阵 int m = matrix1.Length, n = matrix2.Length, p = matrix2[0].Length; double[][] result = new double[m][]; for (int i =...
  • unity3D数学基础-坐标系、向量、矩阵

    千次阅读 2021-10-06 14:16:04
    向量运算 特殊向量向量:大小为0,没有方向的向量,并且它不可以被归一化。 负向量向量变负,将得到一个向量方向相反、大小相等的向量。 单位向量:也叫做标准化向量,就是大小为1的向量;对任意的非零向量...
  • 向量绕轴旋转

    万次阅读 2017-06-12 22:52:17
    此次我们要讨论向量的旋转问题,包括平面绕点旋转空间绕轴旋转两部分。对于游戏程序员来说,有了向量的旋转,就代表有了操纵游戏中物体旋转 的钥匙,而不论它是一个平面精灵还是一组空间的网格体亦或是我们放在3-D...
  • 3. 方法:包括普通方法、静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同。 (1) 公有方法 调用:可由对象名直接调用;如果通过类名来调用属于对象的公有方法,需要显式为该方法的self...
  • 问题:已知三维空间中点A、B、C、D,如何判断线段AB与CD是否相交,若相交求出交点。 分析: AB、CD要相交,AB、CD必须要在同一平面内 快速排斥跨立实验判断是否相交 几何法分析求出交点 先来看看效果,紫色...
  • 缺点:对参数调节核函数的选择敏感,原始分类器不加修改仅适用于处理二问题。 适用数据类型:数值型标称型数据。 线性可分:可以很容易就在数据中给出一条直线将两组数据点分开 上图的数据都是混合在一起...
  • .NET C# 教程初级篇 1-1 基本数据类型及其存储方式 全文目录 (博客园).NET Core Guide (Github).NET Core Guide (掘金).NET Core Guide 本节内容是对于C#基础类型的存储方式以及C#基础类型的理论介绍 基础...
  • Q:类和结构区别 A:https://www.cnblogs.com/vaevvaev/p/8466121.html Q:接口抽象函数异同 Q:C#中virtual与abstract的区别 A:https://www.cnblogs.com/stgp/p/6233359.html Q:数组,ArrayListList区别;数组...
  • Unity3D_向量(Vector3)数学基础

    千次阅读 2018-09-12 10:06:36
     向量定义:既有大小又有方向的量叫做向量。在空间中,向量用一段有方向的线段来表示。应用十分广泛,可用于描述具有大小方向两个属性的物理量,例如物体运动的速度、加速度、摄像机观察方向、刚体受到的力等都是...
  • 4.1 矩阵基础变换 矩阵在变换处理中承担了一个相当重要的角色。一个矩阵就是一个二维数组,最为常用的几何变换都是线性变换,这包括旋转缩放、切变、对称以及正投影。在二维空间中,线性变换可以用2*2的矩阵表示...
  • C# 使用SharpGL-Hello Word代码详解中的Resized函数里,出现了PerspectiveLookAt,将Hello Word代码详解中的此部分复制过来,继续讲解里面的内容 private void openGLControl_Resized(object sender, EventArgs...
  • .NET(C#)常用数据加密解密方法汇总

    千次阅读 2020-01-13 14:17:21
    欢迎加入Unity业内qq交流群:956187480 qq扫描二维码加群 一、数据加密的概念 1、 基本概念 2、 基本功能 ...二、 数据加密的项目应用学习 ...3、 数据加密:ASP.NET(C#)中的数据加密 ...、 网络...
  • 在上一篇博客中讲了利用向量点乘在游戏开发中应用的几种情景。本篇博客将用一个简单的小例子来讲解在实际的游戏开发中如何利用向量的叉乘来解决问题。...关于向量叉乘的其他定义、规律以及应用有兴趣的朋友可以参考
  • --------------------------------------------------------------------------------------------- Convert类型转换 不兼容类型转换如stringint,stringdouble string num1="3.15"; string num2="123"; double ...
  • OpenCV Mat详解用法

    万次阅读 多人点赞 2018-08-31 12:18:53
    我们有多种方法可以获得从现实世界的数字图像:数码相机、扫描仪、计算机体层摄影或磁共振成像就是其中的几种...现在,我们如何获取存储像素值可能根据最适合我们的需要而变化,最终可能减少计算机世界内的所有图...
  • 原始数据(也称为明文,plaintext)被加密设备(硬件或软件)密钥加密而产生的经过编码的数据称为密文(ciphertext)。将密文还原为原始明文的过程称为解密,它是加密的反向处理,但解密者必须利用相同类型的加密设备...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,817
精华内容 726
关键字:

c#向量类定义和向量四则运算

c# 订阅