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

news2024/11/28 21:42:05

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 → × 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 True
    if a < 0 and b < 0 and c < 0:
        return True
    return False

def 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://www.coloradmin.cn/o/528480.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

声音合成——Foley Sound——DECASE项目——多模态智能感知与应用——VariantAutoencoder(VAE)代码实现(7)

文章目录 概述VAE代码实现关闭eager execution修改bottlenectk组件修改loss损失函数 Preprocessline模块实现Loader模块Padder模块LogSpectrogramExtractor模块MinMaxNormaliser模块Saver模块PreprocessPipeLine模块知识补充property修饰词 train训练模块load_fsdd模块train模块…

针对基于智能卡进行认证的活动目录攻击

最近&#xff0c;我参与了一项攻击基于智能卡的活动目录的工作。实际上&#xff0c;你根本不需要使用物理智能卡来验证登录这个活动目录。证书的属性决定了它是否可以用于基于智能卡进行登录。因此&#xff0c;如果你能获得相应的私钥&#xff0c;那么就可以绕过智能卡的验证实…

ubuntu 22.04 安装 Docker Desktop 及docker介绍

目录 一、Docker Desktop 安装 1、我们先去官网下载安装包 2、Install Docker Desktop on Ubuntu 3、Launch Docker Desktop 二、Docker 介绍 什么是docker 如何使用docker docker是如何工作的 docker build docker run docker pull 一、Docker Desktop 安装 1、我们先…

网络应用技术师技能考试试题+讲解

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 前言 本章将会讲解网络应用技术师技能考试试题 一.正文 一、单选题(每题1分,满分50分) 1. 设信号的波特率为800Baud,采用幅度…

肠道微生物群:心力衰竭的新治疗靶点

谷禾健康 心力衰竭 Heart Failure&#xff08;HF&#xff09; 心力衰竭是一种严重的心血管疾病&#xff0c;其特点是较高的发病率和死亡率&#xff0c;同时也会带来高昂的医疗成本。 一般都认为心力衰竭是老年人的疾病&#xff0c;但其实心力衰竭已经呈现年轻化趋势。 以上症状…

a标签属性href的多种写法

众所周知&#xff0c;a标签的最重要功能是实现超链接和锚点。而且&#xff0c;大多数人认为a标签最重要的作用是实现超链接&#xff0c;其实不单单是实现超链接的方法&#xff0c;今天新起点博客就来整理下a标签中href的几种用法。 1、a href“[removed]js_method();” 这是常用…

即拼七人拼团系统开发模式,为什么这么火?

即拼七人拼团模式主要是结合了拼团模式的奖励机制和二二复制系统的排位玩法&#xff0c;将产品销售中的利润最大化让利于拼团的用户&#xff0c;刺激用户主动分享推广&#xff0c;以解决平台引流和用户活跃度的问题。 具体来说&#xff0c;即拼七人拼团模式就是用户进入平台购买…

崩坏:星穹铁道私人服务器搭建教程

准备工具&#xff1a; 一台 Windows 系统服务器 《崩坏&#xff1a;星穹铁道》启动器 《崩坏&#xff1a;星穹铁道》客户端 如果以上各项你都准备好了的话&#xff0c;现在就开始吧&#xff01; 首先完全解压你的《崩坏&#xff1a;星穹铁道》客户端以及SR启动器。 解压完成…

你不知道的JavaScript的事件循环

JavaScript的事件循环 JavaScript语言的一大特点就是单线程&#xff0c;也就是说&#xff0c;同一个时间只能做一件事。那么&#xff0c;为什么JavaScript不能有多个线程呢&#xff1f;这样能提高效率啊。这也与它的用途有关。作为浏览器脚本语言&#xff0c;JavaScript的主要…

Kubernetes二进制部署 单节点

目录 1.环境准备 1.关闭防火墙和selinux 2.关闭swap 3.设置主机名 4.在master添加hosts 5.桥接的IPv4流量传递到iptables的链 6.时间同步 2.部署etcd集群 1.master节点部署 2.在node1与node2节点修改 3.在master1节点上进行启动 4.部署docker引擎 3.部署 Master 组…

麻了,同样是科班出身,学弟月薪却是我的3倍

我有个同学大学毕业&#xff0c;因为却少工作经验&#xff0c;又不愿意去正经的互联网企业做实习生&#xff0c;他嫌工资太低&#xff0c;于是进了家外包公司&#xff0c;那时候感觉待遇还可以。可现在五年过去了&#xff0c;他想跳槽却鲜有人问津。最可气的是比他晚一年毕业的…

Java中的七种设计原则

1.开闭原则 对扩展开放&#xff0c;对修改关闭。在程序需要进行扩展的时候&#xff0c;不能去修改原有的代码&#xff0c;要去实现一个热插拔的效果。简言之&#xff0c;是为了使程序的扩展性好&#xff0c;易于维护和升级。 下面是输入法设置皮肤的例子&#xff1a; // 抽象皮…

Linux入门---缓冲区模拟实现

前言 有了前面的基础我们知道c语言的缓冲区本质上就是FILE结构体的一部分&#xff0c;我们每次使用stdout将数据打印到屏幕上时&#xff0c;本质上是先将数据拷贝到FILE结构体的缓冲区中&#xff0c;然后再拷贝到内核缓冲区中也就是file结构体里面的缓冲区&#xff0c;最后再刷…

TSN网络流量记录器:一种经济高效的解决方案,用于验证汽车网络中的以太网融合。

在未来几年&#xff0c;汽车线束将从不同协议的异构网络转变为分层的同构以太网网络。在这种新情况下&#xff0c;模拟真实车辆网络的实验室测试台将需要分析工具以支持它们在车内通信验证过程中进行验证。 汽车向以太网融合原因 随着汽车内部技术变得越来越复杂&#xff0c;相…

信息调查的观念

每次做一件事前都要把这件事调查清楚&#xff0c;比如考一门科目我们要把和这门科目有关的资源都收集起来&#xff0c;然后把再从中筛选出有用的信息&#xff0c;如数值计算方法我们在考试前就可以把b站有关的学习资源网课或者前人总结的考试经验做个收集总结&#xff0c;做出对…

正则表达式 - 量词

目录 一、贪心、懒惰和占有 二、用 *、 和 ? 进行匹配 三、匹配特定次数 四、懒惰量词 五、占有量词 六、示例——括号字符串计数 {m,n} 是通用形式的量词&#xff0c;正则表达式还有三个常用量词&#xff0c;分别是 、?、*。它们的形态虽然不同于 {m,n}&#xff0c;功…

8年测试总结,项目/团队如何做自动化测试?效率价值?吐血整理...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Python自动化测试&…

Linux:centos:用户基础设置》》添加,修改属性,删除,修改密码

useradd &#xff08;属性&#xff09; 用户 新建用户 usermod &#xff08;属性&#xff09; 用户 调整用户属性 userdel &#xff08;属性&#xff09; 用户 删除用户 passwd &#xff08;属性&#xff09; 用户 修改用户密…

科技云报道:国内AI大模型鏖战,上演科技罗生门

科技云报道原创。 ChatGPT的狂热从年初持续至今&#xff0c;这份狂热不仅仅来源于用户层&#xff0c;从业者、投资人以及企业可以说有过之无不及。 于是&#xff0c;这些投资人、从业者以及企业将狂热转化&#xff0c;宣布入局大模型赛道并推出相关产品。一时间&#xff0c;大…

百万年薪架构师甩出的SpringBoot趣味实战手册,GitHub标星81.6K

前言 本书内容很全面&#xff0c;囊括了Spring生态的常用技术&#xff0c;如MVC、持久化、 Redis、定时任务、消息队列、搜索引擎。本书知识讲解由浅到深&#xff0c;循序渐进&#xff0c;从Hello World讲到Spring核心原理&#xff1b;技术讲解深入浅出&#xff0c;总能以“接…