2130. Угол между векторами

 

Вычислить угол между двумя векторами.

 

Вход. Четыре целых числа – координаты двух ненулевых векторов. Все входные числа не превышают по модулю 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();

  }

}