zoukankan      html  css  js  c++  java
  • 2个2D向量计算交点的夹角和补角

    2维向量如何计算与某一个交点之间的夹角,假设A,B是向量,C是他们共同连接的一个点计算出A-C-B形成的角度

    image

    我们先了解几个简单的计算:

    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

    效果图:

    image

    image

    工程代码:

    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 + "";
        }
    
    }
    如果你感兴趣,你可以把你妹妹介绍给我
  • 相关阅读:
    原生JS写轮播图(转自https://www.cnblogs.com/LIUYANZUO/p/5679753.html)
    用JS写成简易计算器(转自https://mp.weixin.qq.com/s/Jxe3V7D0PFLvIFNZPlSyNg)
    Js获取当前日期时间的方法
    三元运算符的应用(转自百度百科)
    <pre> 标签的简要作用(以前未接触过的)
    用JavaScript实现两种功能:1、切换全选/全不选文字;2、根据选中个数更新全选框状态;(实例代码来自view-source:http://www.fgm.cc/learn/lesson2/12.html)
    Windows 网络通讯开发
    函数指针的使用
    cin的使用问题
    markdown简介
  • 原文地址:https://www.cnblogs.com/plateFace/p/4714432.html
Copyright © 2011-2022 走看看