叉积和法向量学习笔记

目录

2D 叉积的应用

叉积用的内积

相似点

给定平面上的两个向量 A 和 B,叉积和法向量相等吗

理解这点的关键:

结论:

叉积判断平面内两个向量是否相交


2D 叉积的应用

判断两个向量的相对旋转方向(顺时针/逆时针)
计算平行四边形面积
三角形面积计算(取绝对值除以 2)
检测三点是否共线(用于几何计算、凸包算法)

叉积(Cross Product)和法向量(Normal Vector)确实有一些相似之处,尤其是在计算和应用方面。以下是它们的主要相似点:

叉积用的内积

相似点

  1. 三维空间中的关联性

    • 叉积主要在三维空间中定义和应用。
    • 法向量通常也是在三维空间中定义的,特别是在描述平面或曲面时。
  2. 计算方法

    • 叉积是计算两个向量的乘积,其结果是一个向量,该向量垂直于原来的两个向量所在的平面。
    • 法向量可以通过两个非平行向量的叉积来计算。例如,给定平面上的两个向量 AB,它们的叉积 A × B 就是该平面的一个法向量。
  3. 方向

    • 叉积结果的方向由右手定则确定,垂直于参与叉积的两个向量。
    • 法向量的方向也是垂直于描述的表面,可以通过右手定则来确定它的具体方向。
  4. 应用

    • 叉积广泛用于计算物理学中的力矩、角动量等问题。
    • 法向量在计算几何中用于确定平面的方向、计算光线与表面的交点、反射和折射等问题。

给定平面上的两个向量 A 和 B,叉积和法向量相等吗

在三维空间中,给定平面上的两个向量 AB,它们的叉积 A × B 与这个平面的法向量具有相同的方向,但其大小(长度)可能不同,因此它们在数学上并不是完全相等的,但方向相同。

理解这点的关键:

  1. 方向

    • 叉积 A × B 的方向是垂直于向量 AB 所在的平面。根据右手定则,若用右手的食指指向 A,中指指向 B,则叉积 A × B 的方向由拇指指向,这个方向就是法向量的方向。
  2. 大小

    • 叉积 A × B 的大小等于 AB 的长度乘积再乘以它们夹角的正弦值: ∥A×B∥=∥A∥∥B∥sin⁡(θ)\|\mathbf{A} \times \mathbf{B}\| = \|\mathbf{A}\| \|\mathbf{B}\| \sin(\theta)∥A×B∥=∥A∥∥B∥sin(θ) 其中 θ\thetaθ 是向量 AB 之间的夹角。
    • 法向量的大小可以是任意的,因为法向量的关键属性是它的方向,而不是它的大小。

结论:

  • 相同方向:叉积 A × B 和法向量的方向相同,都是垂直于 AB 所在的平面。
  • 大小不同:叉积 A × B 的大小依赖于 AB 的长度及其夹角的正弦值,而法向量的大小可以缩放到任意值。

因此,可以说叉积 A × B 是法向量的一个实例,但大小可能不同。通俗地说,叉积给出了一个特定大小的法向量,但平面的法向量可以是任何大小,只要方向一致即可。

叉积判断平面内两个向量是否相交

def cross_product_sign(A, B, C):
    """
    计算向量 AB 和 AC 的叉积的符号。
    
    参数:
    A, B, C: 二维平面上的点,格式为 (x, y)
    
    返回值:
    叉积的符号:正数、负数或零
    """
    return (B[0] - A[0]) * (C[1] - A[1]) - (B[1] - A[1]) * (C[0] - A[0])

def is_point_on_segment(P, A, B):
    """
    判断点 P 是否在线段 AB 上。
    
    参数:
    P, A, B: 二维平面上的点,格式为 (x, y)
    
    返回值:
    True 表示点 P 在线段 AB 上,False 表示不在
    """
    return min(A[0], B[0]) <= P[0] <= max(A[0], B[0]) and min(A[1], B[1]) <= P[1] <= max(A[1], B[1])

def do_segments_intersect(A, B, C, D):
    """
    判断两个线段 AB 和 CD 是否相交。
    
    参数:
    A, B, C, D: 二维平面上的点,格式为 (x, y)
    
    返回值:
    True 表示线段相交,False 表示不相交
    """
    # 计算叉积的符号
    d1 = cross_product_sign(A, B, C)
    d2 = cross_product_sign(A, B, D)
    d3 = cross_product_sign(C, D, A)
    d4 = cross_product_sign(C, D, B)

    # 检查叉积符号是否不同
    if d1 * d2 < 0 and d3 * d4 < 0:
        return True

    # 特殊情况:线段共线并重叠
    if d1 == 0 and is_point_on_segment(C, A, B):
        return True
    if d2 == 0 and is_point_on_segment(D, A, B):
        return True
    if d3 == 0 and is_point_on_segment(A, C, D):
        return True
    if d4 == 0 and is_point_on_segment(B, C, D):
        return True

    return False

# 示例线段
A = (1, 1)
B = (4, 4)
C = (1, 4)
D = (4, 1)

# 判断线段是否相交
print("线段 AB 和 CD 是否相交:", do_segments_intersect(A, B, C, D))  # 输出 True

# 不相交的示例
E = (1, 1)
F = (2, 2)
G = (3, 3)
H = (4, 4)

print("线段 EF 和 GH 是否相交:", do_segments_intersect(E, F, G, H))  # 输出 False

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI算法网奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值