zoukankan      html  css  js  c++  java
  • 求两直线间夹角

    偶遇HDU上的2080,觉得有必要整理下求解的过程。

    给出平面上任意两点的坐标,求两个点和原点的连线夹角,0<夹角<180。

    这是高中数学题啊,想了想公式,于是想到了余弦定理,(由于数学很渣)想了好一会又,写了好一会,写出了公式。但最后要怎么办呢?得到的是余弦值,而所求的是角度,再想便想到了反三角。在程序中写作:“acos()”。

    按照题解中。。。。。。接下来就是考虑角度问题了,利用余弦值求出的角度可能会大于180。再进行一些小处理,即可。

    但AC后我又没去管越界,又叫了一发,结果也A了。再想一想,根本不存在什么越界吗。。。。我们所关注的角度一旦超够了180,那所求角度就会变为360-180那一部分。

    (我一定要克制住自己搜题解的坏毛病,自己动脑,自己动脑,自己动脑~~~~) 事实证明题解有题解的思路,我自己有我自己的,题解也不一定适合我。

    #include<bits/stdc++.h>
    int main(){
    	int n;
    	double x,y,xx,yy,j;
    	while(scanf("%d",&n)==1){
    		for(int i=0;i<n;i++){
    			scanf("%lf %lf %lf %lf",&x,&y,&xx,&yy);
    			j=(x*x+y*y) + (xx*xx+yy*yy) - ((xx-x)*(xx-x)+(yy-y)*(yy-y));
    			j/=2.0*sqrt(x*x+y*y)*sqrt(xx*xx+yy*yy);
    			printf("%.2lf\n",acos(j)*180.0/3.1415926);
    		}
    	}
    	return 0;
    }
    

    再附上百度到的一个大神的做法

    他使用了向量的点乘公式 看起还十分简便 x1*x2+y1*y2;

    #include<bits/stdc++.h>
    int main(){
    	int n;
    	double x,y,xx,yy,j;
    	while(scanf("%d",&n)==1){
    		for(int i=0;i<n;i++){
    			scanf("%lf %lf %lf %lf",&x,&y,&xx,&yy);
    			j=(x*xx+y*yy)/(sqrt(x*x+y*y)*sqrt(xx*xx+yy*yy));
    			printf("%.2lf\n",acos(j)*180.0/3.1415926);
    		}
    	}
    	return 0;
    }
    

     在交一发 依旧AC

     

  • 相关阅读:
    无线渗透开启WPS功能的路由器
    写代码怎能不会这些Linux命令?
    分布式服务框架 Zookeeper -- 管理分布式环境中的数据
    每天进步一点点——五分钟理解一致性哈希算法(consistent hashing)
    Innodb 中的事务隔离级别和锁的关系
    线上操作与线上问题排查实战
    MySQL 四种事务隔离级的说明
    一次由于 MTU 设置不当导致的网络访问超时
    SYN 和 RTO
    The story of one latency spike
  • 原文地址:https://www.cnblogs.com/gjy963478650/p/7256861.html
Copyright © 2011-2022 走看看