Вычислить угол между двумя векторами.
Вход. Четыре целых числа – координаты двух
ненулевых векторов. Все входные числа не превышают по модулю 10000.
Выход. Одно
число – величина неориентированного угла между векторами с точностью до пяти
десятичных знаков. Выводимое число должно принадлежать интервалу [0; π].
Пример входа |
Пример выхода |
2 1 3
5 |
0.56673 |
геометрия
Пусть a(ax, ay)
и b(bx, by) – два входных
вектора. Вычислим модули этих векторов:
ma = |a| = , mb = |b| =
Вычислим скалярное произведение векторов: (a, b)
= ax * bx + ay * by.
Скалярное
произведение векторов также равно произведению их модулей на косинус угла между
ними: (a, b) = |a| * |b| * cos φ. Следовательно
cos φ = = ,
откуда находится
и сам угол. Арккосинус угла лежит в интервале [0; π], поэтому никаких
дополнительных вычислений производить не требуется.
Вычисляем угол
между двумя векторами по выше
приведенной формуле.
scanf("%lf %lf %lf %lf",&ax,&ay,&bx,&by);
ma
= sqrt(ax*ax + ay*ay); mb = sqrt(bx*bx + by*by);
sc
= ax * bx + ay * by;
res
= acos(sc / ma / mb);
printf("%.5lf\n",res);
#include <stdio.h>
#include <math.h>
class
Vector
{
public:
int dx, dy;
Vector(void)
{
scanf("%d
%d",&dx,&dy);
}
double Len(void)
{
return
sqrt(1.0*dx*dx + dy*dy);
}
};
int
Scalar(Vector a, Vector b)
{
return a.dx *
b.dx + a.dy * b.dy;
}
double GetAngle(Vector a, Vector b)
{
return
acos(1.0 * Scalar(a,b) / a.Len() / b.Len());
}
int
main(void)
{
Vector a, b;
printf("%.5lf\n",GetAngle(a,b));
return 0;
}
Java реализация
import java.util.*;
public class Main
{
public static void main(String[] args)
{
Scanner con = new Scanner(System.in);
double ax = con.nextDouble();
double ay = con.nextDouble();
double bx = con.nextDouble();
double by = con.nextDouble();
double ma = Math.sqrt(ax*ax + ay*ay);
double mb = Math.sqrt(bx*bx + by*by);
double sc = ax * bx + ay * by;
double res = Math.acos(sc / ma / mb);
System.out.printf("%.5f\n",res);
con.close();
}
}
Java реализация – классы
import java.util.*;
class Vector
{
double x, y;
Vector(double x, double y)
{
this.x = x;
this.y = y;
}
double length()
{
return Math.sqrt(x*x + y*y);
}
double scalar(Vector a)
{
return x * a.x + y * a.y;
}
}
public class Main
{
public static void main(String[] args)
{
Scanner con = new Scanner(System.in);
double ax = con.nextDouble();
double ay = con.nextDouble();
double bx = con.nextDouble();
double by = con.nextDouble();
Vector a = new Vector(ax,ay);
Vector b = new Vector(bx,by);
double res = Math.acos(a.scalar(b) / (a.length() * b.length()));
System.out.printf("%.5f\n",res);
con.close();
}
}