Unity计算二维向量夹角余弦值和正弦值的优化方法参考

        如果不考虑优化问题,计算两个向量的余弦值或者正弦值可以直接使用类似的方法:

[SerializeField]
Vector2 v1, v2;void Start()
{float valCos = Mathf.Acos(Vector2.SignedAngle(v1, v2));float valSin = Mathf.Asin(Vector2.SignedAngle(v1, v2));
}

        但是上面的Vector2.SignedAngle方法实际上是先计算出余弦值再根据余弦值计算角度,然后我们再根据角度计算出余弦值,这个太绕了,属于脱那什么放那什么的做法。

        从数学原理上来说,计算夹角余弦的思路如下:

将公式代入得到:

但是这里面出现了两次开方运算,可以变换成如下形式:

这样就只需要一次开方运算,对应代码参考如下:

	bool TryVectorAcos(Vector2 p1, Vector2 p2, Vector2 p3, Vector2 p4, out float acos){acos = 0;if (Mathf.Approximately((p2 - p1).sqrMagnitude, 0) || Mathf.Approximately((p4 - p3).sqrMagnitude, 0)) return false;float ax = p2.x - p1.x;float ay = p2.y - p1.y;float bx = p4.x - p3.x;float by = p4.y - p3.y;acos = (ax * bx + ay * by) / (Mathf.Sqrt((ax * ax + ay * ay) * (bx * bx + by * by)));return true;}

带入上面的余弦值公式可得到:

但这个公式也出现了两次开方运算,可以将该公式变换成如下形式:

这样也是只需要一次开方运算就好,对应代码参考如下:

	bool TryVectorAsin(Vector2 p1, Vector2 p2, Vector2 p3, Vector2 p4, out float asin){asin = 0;if (Mathf.Approximately((p2 - p1).sqrMagnitude, 0) || Mathf.Approximately((p4 - p3).sqrMagnitude, 0)) return false;float ax = p2.x - p1.x;float ay = p2.y - p1.y;float bx = p4.x - p3.x;float by = p4.y - p3.y;asin = (ax * by - ay * bx) / Mathf.Sqrt((ax * ax + ay * ay) * (bx * bx + by * by));return true;}

        如果要同时获得正弦值和余弦值,以避免重复计算两个矢量模的积,代码参考如下:

	bool TryVectorAcosAndAsin(Vector2 p1, Vector2 p2, Vector2 p3, Vector2 p4, out float acos, out float asin){acos = 0;asin = 0;if (Mathf.Approximately((p2 - p1).sqrMagnitude, 0) || Mathf.Approximately((p4 - p3).sqrMagnitude, 0)) return false;float ax = p2.x - p1.x;float ay = p2.y - p1.y;float bx = p4.x - p3.x;float by = p4.y - p3.y;float denominator = Mathf.Sqrt((ax * ax + ay * ay) * (bx * bx + by * by));acos = (ax * bx + ay * by) / denominator;asin = (ax * by - ay * bx) / denominator;return true;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/58725.shtml

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

相关文章

UEFI学习笔记(十三):Capsule Update

UEFI学习笔记(十三):Capsule Update 一、Capsule update相关概念1、胶囊文件(Capsule File):2、胶囊负载(Capsule Payload):3、交付机制:4、EFI 胶囊更新协议…

编写一个README.md

一、README 在下载github上的代码的时候,通常会有一个README.md文件让你了解该仓库的做了什么,他如何安装等内容。写好README.md是和他人交流的重要环节。 二、README.md的语法逻辑 a、预览模式 在Vscode中编辑README.md的时候可以打开预览模式&#xf…

Android简单控件实现简易计算器

学了一些Android的简单控件,用这些布局和控件,设计并实现一个简单计算器。 计算器的界面分为两大部分,第一部分是上方的计算表达式,既包括用户的按键输入,也包括计算结果 数字;第二部分是下方的各个按键&a…

开源生活-分布式管理

开源竞争(当自己没有办法彻底掌握一门技术的时候就彻底开源掉;培养出更多的依赖,让更多人帮助你完善你的技术,那么这不就是在砸罐子吗?一个行业里面总会有人先砸罐子的,你不如先砸罐子,还能听个…

责任链模式:解耦请求处理的设计模式

1. 引言 在复杂的软件系统中,请求的处理往往需要多个处理者共同参与。如何将这些处理者有效地串联起来,同时又不让请求的发起者直接依赖于具体的处理者,是一个值得关注的问题。责任链模式(Chain of Responsibility Pattern&#…

分布式数据库的发展历程与大规模应用的历史

分布式数据库技术经历了数十年的发展,从最初的理论研究到现今的广泛应用,逐渐成为应对海量数据和高并发需求的重要技术支撑。特别是在近20年里,分布式数据库的技术实现和应用场景不断丰富,已经成为互联网、大数据、云计算等现代产…

内容安全与系统构建加速,助力解决生成式AI时代的双重挑战

内容安全与系统构建加速,助力解决生成式AI时代的双重挑战 0. 前言1. PRCV 20241.1 大会简介1.2 生成式 Al 时代的内容安全与系统构建加速 2. 生成式 AI2.1 生成模型2.2 生成模型与判别模型的区别2.3 生成模型的发展 3. GAI 内容安全3.1 GAI 时代内容安全挑战3.2 图像…

Matplotlib可视化——三维图与莫比乌斯带可视化

实验名称 Matplotlib中的三维图绘制:莫比乌斯带的可视化 实验目标 三维的点和线三维轮廓图线框图和曲面图曲面三角形 举例:莫比乌斯带的可视化实验主要使用的Python库 名称版本简介Numpy1.19.5数组运算Matplotlib3.3.4数据可视化实验适用的对象 学习对象:本科学生、研究生…

clickhouse最佳实践(一):clickhouse千亿级日志系统单机到集群架构演进历程

clickhouse千亿级日志系统单机到集群架构演进历程 1. 初始阶段:单机部署2. 使用代理层3. 集群设计4. 数据迁移5. 监控和维护6.集群横向扩展 最佳实践系列文章持续完善中, 记录了业务系统从碰到瓶颈到迭代的过程 1. 初始阶段:单机部署 针对Cl…

ZeroNL2SQL:零样本 NL2SQL

发布于:2024 年 10 月 30 日 星期三 #RAG #NL2SQL # Zero-Shot 自然语言到 SQL(NL2SQL)的转换是一个重要的研究领域,它允许非技术用户轻松访问和分析数据,在商业智能、数据分析等领域具有广泛的应用前景。然而&#x…

前端部署指南:手把手教你部署 Vue 项目

​🌈个人主页:前端青山 🔥系列专栏:Vue篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Vue篇专栏内容:Vue-部署项目 前言 嗨喽伙伴们大家好,我是依旧青山。作为一名前端开发工程师&#xff…

usb外设枚举不到怎么查

明明内核配置了cdc_acm,dmesg | grep acm也有,lsusb却看不到设备。 排查思路: 主机端: 1、设备树是否使能。 2、主模式和从模式是否配置正确。 设备端: 设备端有条件的话可以插入其它设备看,或者复位…

Vivo开奖了,劝退价。。

vivo 也开奖了,不过有小伙伴反馈是个劝退价,甚至不如隔壁的 oppo,要说这两家也是渊源颇深,一家是绿厂,一家是蓝厂,高管也都是早期步步高出来的。 给大家盘一下开奖的信息,方便大家横向做个对比&…

Python 的 Pygame 库来开发一个游戏

import pygame import random# 初始化 Pygame pygame.init()# 设置屏幕大小 screen_width 800 screen_height 600 screen pygame.display.set_mode((screen_width, screen_height))# 设置标题 pygame.display.set_caption("飞机大战")# 加载图片 player_img pyga…

WPF+MVVM案例实战(八)- 自定义开关控件封装实现

文章目录 1、案例运行效果2、项目准备2、功能实现1、控件模板实现2、控件封装1、目录与文件创建2、各文件功能实现3、开关界面与主窗体菜单实现1、开关界面实现2、主窗体菜单实现4、源代码获取1、案例运行效果 2、项目准备 打开项目 Wpf_Examples,新建ToggleButtonWindow.xma…

【深度学习中的注意力机制10】11种主流注意力机制112个创新研究paper+代码——交叉注意力(Cross-Attention)

【深度学习中的注意力机制10】11种主流注意力机制112个创新研究paper代码——交叉注意力(Cross-Attention) 【深度学习中的注意力机制10】11种主流注意力机制112个创新研究paper代码——交叉注意力(Cross-Attention) 文章目录 【…

安宝特案例 | AR技术在院外心脏骤停急救中的革命性应用

00 案例背景 在院外心脏骤停 (OHCA) 的突发救援中,时间与效率直接决定着患者的生命。传统急救模式下,急救人员常通过视频或电话与医院医生进行沟通,以描述患者状况并依照指令行动。然而,这种信息传递方式往往因信息不完整或传递延…

测试自动化工具的横向对比

MicroAgent:这个AI智能体一键写代码并且自动测试!它比 Aider 更好吗? 待研究:https://blog.csdn.net/gitblog_00054/article/details/139541862 playright:这是一个python驱动的自动化框架,部署简单&#…

第八天: C语言深度探索:指针与函数的奥秘

1 字符指针与字符串处理 字符指针与数组的关系 在C语言中,字符串可以被视为字符数组。数组名可以看作是指向其第一个元素的指针。因此,我们可以使用相同类型的指针来访问数组中的每个元素。这种对应关系使得字符指针在处理字符串时显得特别方便。 c …

C++初阶——类与对象(上篇)

一、写在前面 类与对象是C不同于C语言的一个板块,内容很多,笔者把这部分分为三篇博客来讲解,希望能够帮助各位读者更容易地理解这些知识点。弄清楚这一部分之后,C就算是成功入门了。 二、面向过程和面向对象 C语言就是典型的面向…