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

     

  • 相关阅读:
    奇怪的问题:Linux执行脚本碰到Permission denied问题(记录)
    MySQL中的显式锁---MySQL用户级锁函数
    使用Python的tenacity库实现异常重试机制
    json.net payload
    Eclipse Plugin
    MyEclipse web项目转换为eclipse web项目
    Nginx The system cannot find the path specified
    Spring Boot实战:静态资源无法访问
    WebService rwsp:NoRunningCommunicationPointAvailable
    Intellij IDEA 自动生成 serialVersionUID
  • 原文地址:https://www.cnblogs.com/gjy963478650/p/7256861.html
Copyright © 2011-2022 走看看