2个2D向量计算交点的夹角和补角
2015-08-09 01:41
666 查看
2维向量如何计算与某一个交点之间的夹角,假设A,B是向量,C是他们共同连接的一个点计算出A-C-B形成的角度
我们先了解几个简单的计算:
如果你理解了以上公式,那么来看看如何计算夹角的公式,两向量夹角余弦等于向量数量积除以两向量模的乘积
公式1: cos角度=(ac+bd)/( 根号(a*a+b*b) ) * ( 根号(c*c+d*d))
推导1: 弧度= 反cos((ac+bd)/(根号a*a+b*b) * (根号(c*c+d*d)))
推导2: 角度= 反cos((ac+bd)/(根号a*a+b*b) * (根号(c*c+d*d))) / 圆周率 * 180;
公式代码实现:
项目源码:http://yunpan.cn/cdrmEcDjfSDMD 访问密码 d262
效果图:
工程代码:
我们先了解几个简单的计算:
2D向量的乘积计算 | (A.x * B.x + A.y * B.y) | |
2D向量的取摸 | 开平方(A.x * A.x + A.y * A.y) | |
弧度转换角度 | 弧度 除以 圆周率 再乘以180 | |
角度转换弧度 | 角度 乘以 圆周率 后再除以180 | |
补角 | 计算方式1: 补角 = 180 - 正角. 计算方式1: 两个向量方向一正一反就可以计算出补角 |
公式1: cos角度=(ac+bd)/( 根号(a*a+b*b) ) * ( 根号(c*c+d*d))
推导1: 弧度= 反cos((ac+bd)/(根号a*a+b*b) * (根号(c*c+d*d)))
推导2: 角度= 反cos((ac+bd)/(根号a*a+b*b) * (根号(c*c+d*d))) / 圆周率 * 180;
公式代码实现:
public void JiSun() { hudu = Math.Acos( (ac.x * cb.x + ac.y * cb.y) / (Mathf.Sqrt(ac.x * ac.x + ac.y * ac.y) * Mathf.Sqrt(cb.x * cb.x + cb.y * cb.y))); //弧度转换角度 jiajiao = hudu / Math.PI * 180; 补角.text = jiajiao + "度"; }
项目源码:http://yunpan.cn/cdrmEcDjfSDMD 访问密码 d262
效果图:
工程代码:
using UnityEngine; using System.Collections; using UnityEditor; using System; public class Test : MonoBehaviour { public Transform a; public Transform b; public Transform c; public TextMesh 正角; public TextMesh 补角; // Update is called once per frame void Update () { Vector3 ac = a.position - c.position; Vector3 bc = b.position - c.position; Vector3 cb = c.position - b.position; /* * cos<A,B>=(ac+bd)/(根号a*a+b*b)(根号c*c+d*d) * 两向量夹角余弦等于向量数量积除以两向量模的乘积 */ double hudu = Math.Acos( (ac.x * bc.x + ac.y * bc.y) / (Mathf.Sqrt(ac.x * ac.x + ac.y * ac.y) * Mathf.Sqrt(bc.x * bc.x + bc.y * bc.y))); //弧度转换角度 double jiajiao = hudu / Math.PI * 180; 正角.text = jiajiao + "度"; //补角.text = (180 - jiajiao) + "度"; hudu = Math.Acos( (ac.x * cb.x + ac.y * cb.y) / (Mathf.Sqrt(ac.x * ac.x + ac.y * ac.y) * Mathf.Sqrt(cb.x * cb.x + cb.y * cb.y))); //弧度转换角度 jiajiao = hudu / Math.PI * 180; 补角.text = jiajiao + "度"; } //绘制线段 public void OnDrawGizmos() { Gizmos.DrawLine(a.position, b.position); Gizmos.DrawLine(a.position, c.position); Gizmos.DrawLine(b.position, c.position); } //以原点计算两个坐标的夹角 public void OriginAngle() { double hudu = Math.Acos( (a.position.x * b.position.x + a.position.y * b.position.y) / (Mathf.Sqrt(a.position.x * a.position.x + a.position.y * a.position.y) * Mathf.Sqrt(b.position.x * b.position.x + b.position.y * b.position.y))); double jiajiao = hudu / Math.PI * 180; 正角.text = jiajiao + "度"; } }
相关文章推荐
- JavaScript (查询显示器宽高、以及查询:协议/主机/端口/资源)
- 使用Handler和Timertask实现定时器
- <转>
- 标准文档
- MySQL 数据库授权
- python registry path
- 匹夫细说C#:庖丁解牛聊委托,那些编译器藏的和U3D给的
- 智渔课堂官方免费教程一:Java软件开发预备知识
- SpringMVC 整合 AOP 及事务不生效的解决办法
- I学霸官方免费教程一:Java软件开发预备知识
- Selenium2学习-035-WebUI自动化实战实例-033-页面快照截图应用之三 -- 区域截图(专业版)
- 源码构建MySQL服务器
- style、currentStyle、getComputedStyle区别介绍
- mac os 配置maven
- Selenium2学习-034-WebUI自动化实战实例-032-获取页面 body 大小
- 静态配置ip
- XMLHttpRequest Level 2 使用指南
- POJ 2195 Going Home 最小费用流 裸题
- 也玩before 和after伪元素玩五颜六色的导航
- VS2010中的自动化测试(5)——Web性能测试