叉乘在图形学中的几何意义 ---- 判断一个点是否在三角形内

article/2025/10/14 10:09:08

1 叉乘是什么

先简单介绍一下叉乘(cross product)
在这里插入图片描述

a → × b → \overrightarrow{a} \times \overrightarrow{b} a ×b ,其结果,还是一个向量。
其方向,符合右手螺旋定则(右手手指头从a转向b,看大拇指指向哪里);
其模,等于 ∣ a → ∣ ∣ b → ∣ s i n θ |\overrightarrow{a}||\overrightarrow{b}|sin\theta a ∣∣b sinθ (其实就是a和b组成的平行四边形面积)

也可以直接用下面的式子表示:
a → × b → = ∣ i → j → k → a x a y a z b x b y b z ∣ = ( a y b z − a z b y ) i → + ( a z b x − z x b z ) j → + ( a x b y − a y b x ) k → \overrightarrow{a} \times \overrightarrow{b} = \left | \begin{matrix} \overrightarrow{i} & \overrightarrow{j} & \overrightarrow{k}\\ a_x & a_y & a_z\\ b_x & b_y & b_z \end{matrix} \right | = (a_ybz - a_zb_y)\overrightarrow{i} + (a_zb_x - z_xb_z)\overrightarrow{j} + (a_xb_y - a_yb_x)\overrightarrow{k} a ×b = i axbxj aybyk azbz =(aybzazby)i +(azbxzxbz)j +(axbyaybx)k
其中, i → , j → , k → \overrightarrow{i}, \overrightarrow{j}, \overrightarrow{k} i ,j ,k 是3个轴的单位向量

还可以用矩阵来表示:
a → × b → = A b → = [ 0 − a z a y a z 0 − a x − a y a x 0 ] [ b x b y b z ] \overrightarrow{a} \times \overrightarrow{b} = A \overrightarrow{b} = \begin{bmatrix} 0 & -a_z & a_y\\ a_z & 0 & -a_x\\ -a_y & a_x & 0 \end{bmatrix} \begin{bmatrix} b_x\\ b_y\\ b_z \end{bmatrix} a ×b =Ab = 0azayaz0axayax0 bxbybz

他的重要性质:
a → × a → = 0 → \overrightarrow{a} \times \overrightarrow{a} = \overrightarrow{0} a ×a =0
a → × b → = − b → × a → \overrightarrow{a} \times \overrightarrow{b} = - \overrightarrow{b} \times \overrightarrow{a} a ×b =b ×a
a → × ( b → + c → ) = a → × b → + a → × c → \overrightarrow{a} \times (\overrightarrow{b} + \overrightarrow{c}) = \overrightarrow{a} \times \overrightarrow{b} + \overrightarrow{a} \times \overrightarrow{c} a ×(b +c )=a ×b +a ×c

2 几何意义

在图形学中,向量的叉乘主要用于计算两个向量所在平面的法向量,以及计算出相机朝向和物体朝向之间的旋转轴,具体应用包括:

  1. 计算表面法向量:通过计算两个相邻的三角形的法向量来得到表面法向量,可以用于光照计算和渲染中的纹理映射等。

  2. 计算相机朝向和物体朝向之间的旋转轴:在相机跟随和相机旋转等操作中使用。

  3. 计算三角形面积:通过向量叉积的模长可以计算三角形面积,可以用于计算多边形的面积和法向量。

  4. 计算向量夹角:通过向量叉积的模长和点积的结果可以计算向量之间的夹角,可以用于计算光源和物体的夹角以及阴影的计算等。

  5. 判断一个点是否在三角形内

下文针对5,具体讲一下如何使用。

3 使用例子- 判断一个点是否在三角形内

3.1 使用背景

判断一个点,是否在三角形内,有什么用途呢?一个经典的用途是,在光栅化阶段,GPU会去挨个处理每个像素,应该显示什么数据,或者说,显示哪个三角形面的数据。
咱们来最简化的描述这个过程:
假色我们的3D画面非常简单,只有4个顶点,即2个三角形,映射到屏幕上,如下图所示
在这里插入图片描述

现在开始扫描每个像素该显示啥。方法就是,判断是否在2个三角形内,如果不在,就显示默认色了,如果在,就采样三角形的对应纹理色值。
所以,现在的问题,就可以归纳为一个函数:
isInTringle(Trangle tr)

3.2 如何判断

请看下面一组图,Q点在三角形内,可以看看有什么规律:
在这里插入图片描述
向量P1P2与P1Q,右手螺旋定则,朝外;
向量P2P3与P2Q,右手螺旋定则,朝外;
向量P3P1与P3Q,右手螺旋定则,朝外;

再看一组图,Q点在三角形外:
在这里插入图片描述
向量P1P2与P1Q,右手螺旋定则,朝内
向量P2P3与P2Q,右手螺旋定则,朝外;
向量P3P1与P3Q,右手螺旋定则,朝外;

极端情况,如果Q刚好在三角形的边上,例如P1P2的边上,那么,向量P1P2与P1Q为同方向,螺旋定则芭比Q了,找不到z轴方向,即,z值为0。

结论:只要计算三次叉乘,如果z值有一个为0,则在三角形边上; 如果z值正负一致,则在里面;如果z值正负不一致,则在外面

3.3 代码实现

从第一节可知,计算叉乘的 z z z值,很简单,为
( a x b y − a y b x ) (a_xb_y - a_yb_x) (axbyaybx)
所以,从程序上,可以非常简单的实现了,我们来写个python:

#!/usr/bin/python#这是一个判断一个点是否在三角形内的例子print("Hello, World! Let's do some test");def check_signs(a, b, c):"""判断三个浮点数的符号:param a: 第一个浮点数:param b: 第二个浮点数:param c: 第三个浮点数:return: True 如果三个数都为正数或都为负数,True 否则False"""if a > 0 and b > 0 and c > 0:return Trueif a < 0 and b < 0 and c < 0:return Truereturn Falsedef cal_z_value(v1, v2):"""计算2个三维向量,叉乘的z值"""return v1[0] * v2[1] - v1[1]* v2[0]def subtract_vectors(vector1, vector2):"""计算两个三维向量的差向量:param vector1: 第一个向量,格式为 [x, y, z]:param vector2: 第二个向量,格式为 [x, y, z]:return: 差向量,格式为 [x, y, z]"""x = vector1[0] - vector2[0]y = vector1[1] - vector2[1]z = vector1[2] - vector2[2]return [x, y, z]def is_point_in_triangle(p1, p2, p3, q):"""判断一个点是否在某个三角形内"""p1_q = subtract_vectors(q, p1)p1_p2 = subtract_vectors(p2, p1)z1 = cal_z_value(p1_p2, p1_q)p2_q = subtract_vectors(q, p2)p2_p3 = subtract_vectors(p3, p2)z2 = cal_z_value(p2_p3, p2_q)p3_q = subtract_vectors(q, p3)p3_p1 = subtract_vectors(p1, p3)z3 = cal_z_value(p3_p1, p3_q)print("z1 ",z1)print("z2 ",z2)print("z3 ",z3)return check_signs(z1, z2, z3)"""
p1=[0, 0, 0]
p2=[0.5, 0.5, 0]
p3=[0.5, 1, 0]
q=[0.25, 0.5, 0]
"""#测试代码
p1=[0, 0, 0]
p2=[1, 0, 0]
p3=[0.5, 1, 0]
q=[0.25, 0.35, 0]result = is_point_in_triangle(p1, p2, p3, q)
print("result ",result)

http://chatgpt.dhexx.cn/article/y4KXIY02.shtml

相关文章

叉乘的几何意义

如上图所示&#xff1a; AB x AC |AB||AC|sin(a) (a表示AB与AC的夹角&#xff09;&#xff0c;根据叉乘的右手准则&#xff0c;ABx AC的朝向为sot平面的坐标负值方向。 AE x AF |AE||AF|sin(b) (b表示AE与AF的夹角&#xff09;&#xff0c;根据叉乘的右手准则&#xff0c;AE …

叉乘

什么是叉乘 百度百科如下 向量积&#xff0c;数学中又称外积、叉积&#xff0c;物理中称矢积、叉乘&#xff0c;是一种在向量空间中向量的二元运算。与点积不同&#xff0c;它的运算结果是一个向量而不是一个标量。并且两个向量的叉积与这两个向量和垂直。 我们可以使用它来…

安全运维体系建设思路

注意&#xff1a;后续技术分享&#xff0c;第一时间更新&#xff0c;以及更多更及时的技术资讯和学习技术资料&#xff0c;将在公众号CTO Plus发布&#xff0c;欢迎关注公众号&#xff1a;CTO Plus 关于Articulate“做一个知识和技术的搬运工。做一个终身学习的爱好者。做一个…

98%的运维人员会中招的运维安全陋习,你中了几个?

随着IT技术和业务的发展及各式各样安全漏洞的涌现&#xff0c;运维与安全这两个专业日渐交融&#xff0c;人们对运维安全的重视程度越来越高&#xff0c;于是逐渐出现了一个新的交叉领域叫“运维安全”。 黑客、白帽子忙于挖掘运维安全漏洞&#xff0c;企业忙于构建运维安全体…

阿里云——运维安全中心(堡垒机)

运维安全中心&#xff08;堡垒机&#xff09; 构建云上统一、高效、安全运维通道&#xff0c;保障云端运维、办公权限可管控、操作行为可审计 高效&安全运维 运维安全中心&#xff08;堡垒机&#xff09;用于集中管理资产权限&#xff0c;全程监控操作行为&#xff0c;实…

浪潮 服务器数据安全管理系统,浪潮SSC运维安全管控系统

浪潮SSC运维安全管控系统提供精细管控、运维无忧的数据中心安全解决方案。 统一账号 数据中心内所有各种服务器、数据库、网络设备、中间件、业务系统的账号作为从账号。浪潮SSC的账号作为主账号。进入数据中心的每个运维人员对应一个主账号&#xff0c;主账号用来做强身份认证…

安全运维管理

指标总览 指标详情 环境管理 指标内容如图&#xff1a; 指标理解&#xff1a; a&#xff09;明确责任人或责任部门&#xff0c;相关制度文件中明确指定具体部门或人员负责机房安全&#xff0c;对进出机房管理&#xff0c;定期对机房设施维护管理。 b&#xff09;有相关制度…

信息系统运维安全管理规定(可作为范文参考)

信息系统运维安全管理规定 第一章 总则 第一条 为加强XXXXX信息系统运维的安全管理&#xff0c;保障信息系统的网络安全与信息安全&#xff0c;依据国家有关法律、法规和XXXXX有关规章制度&#xff0c;特制定本规定。 第二条 XXXXX信息系统运维安全管理范围包括网络安全管理、操…

运维安全隐患

由于运维人员的水平参差不齐&#xff0c;还有就是是人就有犯错的时候&#xff0c;所以经常会出现不必要的失误导致的安全隐患&#xff0c;所以这里就未大家盘点一下经常出现的由于运维人员是失误造成的安全隐患。 目录浏览 由于发布网站时&#xff0c;服务器配置问题&#xf…

2022-2028全球运维安全管理行业调研及趋势分析报告

【报告篇幅】&#xff1a;146 【报告图表数】&#xff1a;191 【报告出版时间】&#xff1a;2022年1月 内容摘要 据恒州诚思调研统计&#xff0c;2021年全球运维安全管理市场规模约 亿元&#xff0c;2017-2021年年复合增长率CAGR约为 %&#xff0c;预计未来将持续保持平稳增长…

天玥运维安全网关(启明星辰堡垒机)无法登录资源主机的问题

天玥运维安全网关&#xff08;启明星辰堡垒机&#xff09;无法登录资源主机的问题 问题描述解决方案结束 问题描述 用户可正常登录天玥运维安全网关平台&#xff0c;在登录资源主机的时候有报错 解决方案 调出运行&#xff0c;输入gpedit.msc调出组策略&#xff1b;依次点击…

运维需要懂的那些安全技能

前言 以前的认知 以前刚接触IT行业&#xff0c;而我身为运维&#xff0c;我以为我所需要做的安全就是修改服务器密码为复杂的&#xff0c;ssh端口改为非22&#xff0c;还有就是不让人登录服务器就可以保证我维护的东西安全。 现在的认知 工作也好几年了&#xff0c;在这摸爬…

运维一定要懂的100个网络安全小知识

如果有初始密码&#xff0c;应尽快修改&#xff1b; 密码长度不少于8个字符&#xff1b; 不要使用单一的字符类型&#xff0c;例如只用小写字母或只用数字&#xff1b; 用户名与密码不要使用相同字符&#xff1b; 常见的弱口令尽量避免设置为密码&#xff1b; 自己、家人、…

运维安全概述

运维安全概述 iv4n 2015/09/02 19:31 0x00 前言 运维安全是企业安全保障的基石&#xff0c;不同于Web安全、移动安全或者业务安全&#xff0c;运维安全环节出现问题往往会比较严重。 一方面&#xff0c;运维出现的安全漏洞自身危害比较严重。运维服务位于底层&#xff0c;涉及…

Java-注解(Annotation)的使用(详解)

注解(Annotation&#xff09; 前言一、 注解(Annotation)概述二、 常见的Annotation示例1、示例一&#xff1a;生成文档相关的注解2、示例二&#xff1a;在编译时进行格式检查2.1 JDK内置的三个基本注解2.2 代码演示 3、示例三&#xff1a;跟踪代码依赖性&#xff0c;实现替代配…

关于Annotation的那些事儿

文章目录 注解的基础方法元注解与复合注解Repeatable annotation 可重复注解Spring中解析Annotation的工具类 ###### 注解的定义说明 对于一个注解一般包括以下几个部分&#xff1a; 1. Target&#xff1a;适用目标 有一个注解如下所示&#xff1a; java Target(ElementType.TY…

Matlab中annotation函数的使用

目录 语法 说明 示例 创建文本箭头注释 创建文本框注释 创建包含多行文本的文本框注释 创建矩形注释 创建椭圆注释 组合使用两种类型的注释 创建后修改注释 annotation函数是给绘制的图形创建注释。 语法 annotation(lineType,x,y)annotation(lineType)annotation(…

java中Annotation详解

Java 注解&#xff08;Annotation&#xff09;又称 Java 标注&#xff0c;是 JDK5.0 引入的一种注释机制。主要作用&#xff1a;Annotation其实是代码里的特殊标记&#xff0c;这些标记可以在编译、类加载、运行时被读取&#xff0c;并执行相应的处理。通过使用Annotation&…