как рассчитать угол в градусах с помощью Atan2 ()

Мне нужна ваша помощь с этим кодом, который у меня здесь:

    Console.WriteLine();
    Console.WriteLine("Enter first X value: ");
    float point1X = float.Parse(Console.ReadLine());
    Console.WriteLine("Enter first Y value: ");
    float point1Y = float.Parse(Console.ReadLine());
    Console.WriteLine("Enter second X value: ");
    float point2X = float.Parse(Console.ReadLine());
    Console.WriteLine("Enter second Y value: ");
    float point2Y = float.Parse(Console.ReadLine());
    Console.WriteLine();

        double deltaX = point2X - point1X;
        double deltaY = point2Y - point1Y;
        double distance = Math.Sqrt(Math.Pow(deltaX, 2) + Math.Pow(deltaY,2)) ;

double angleX = Math.Atan2(point1X,point1Y);

        Console.WriteLine("DeltaX value is: " + deltaX);
        Console.WriteLine("DeltaY value is: " + deltaY);
        Console.WriteLine("The distance is: " + distance);
        Console.WriteLine("The angle is: " + angle + "°");

    }
}

В основном мне нужна помощь с той строкой, которая отделена от остальных. Я хочу рассчитать угол между двумя точками и распечатать его в градусах. Я знаю, что это очень простой код, но я должен предоставить его для квалифицированной работы.

Примечание 1: я должен обязательно использовать Atan2 ().

Примечание 2: мне нужно вычислить угол между вектором двух точек.

Примечание 3: вот дрянной рисунок того, что мне нужно

https://i.stack.imgur.com/31tvB.png

Примечание 4: пользователь вводит 2 координаты, одну для первой точки и одну для второй точки. Мне нужно вычислить угол между векторами двух точек.


person Thoomana Novakid    schedule 08.12.2019    source источник
comment
Угол между двумя точками непонятен. Нарисуйте от руки, какой угол вы хотите рассчитать. Покажи мне свой рисунок!   -  person Let Me Be Your Lost Disciple    schedule 08.12.2019
comment
Мой ответ уже делает то, что вам нужно!   -  person Let Me Be Your Lost Disciple    schedule 08.12.2019


Ответы (4)


В этом методе выполняется основная работа:

static double Angle(double x1, double y1, double x2, double y2)
{
    double angle1 = Math.Atan2(y1, x1);
    double angle2 = Math.Atan2(y2, x2);
    return Math.Abs(angle1 - angle2) * 180 / Math.PI;
}

В сочетании с вашим кодом он становится:

class Program
{
    static double Angle(double x1, double y1, double x2, double y2)
    {
        double angle1 = Math.Atan2(y1, x1);
        double angle2 = Math.Atan2(y2, x2);
        double angle = Math.Abs(angle1 - angle2) * 180 / Math.PI;
        return angle;
    }

    static void Main(string[] args)
    {
        Console.WriteLine();
        Console.Write("Enter first X value: ");
        float point1X = float.Parse(Console.ReadLine());
        Console.Write("Enter first Y value: ");
        float point1Y = float.Parse(Console.ReadLine());
        Console.Write("Enter second X value: ");
        float point2X = float.Parse(Console.ReadLine());
        Console.Write("Enter second Y value: ");
        float point2Y = float.Parse(Console.ReadLine());

        Console.WriteLine($"\nAngle between these points is {Angle(point1X, point1Y, point2X, point2Y)} degrees.");
    }
}
person Let Me Be Your Lost Disciple    schedule 08.12.2019
comment
У меня проблема, когда я ставлю координату вроде; ‹2,2› и ‹1,1› результат всегда 0. Вы знаете, в чем может быть проблема? - person Thoomana Novakid; 08.12.2019
comment
@ThoomanaNovakid: в этом случае векторы положения обеих точек параллельны, поэтому рассматриваемый угол равен нулю. Здесь нет никаких проблем. - person Let Me Be Your Lost Disciple; 15.01.2020

Угол можно измерить следующим образом

Math.Atan2(val1, val2) * (180 / Math.PI);

источник: https://www.geeksforgeeks.org/c-sharp-math-atan2-method/

person Jawad    schedule 08.12.2019

Я не совсем понял, что вам нужно, но думаю, это решит вашу проблему:

Math.Atan2(Math.Abs(point1Y-point2Y), Math.Abs(point1X-point2X)) * 180 / Math.PI;
person merteselcuk    schedule 08.12.2019
comment
Ваше решение дает угол только в первом квадранте. Это не правильно! - person Let Me Be Your Lost Disciple; 08.12.2019

Окончательный код оставляю здесь, может кому пригодится:

Console.WriteLine("Enter first X value: ");
        float point1X = float.Parse(Console.ReadLine());
        Console.WriteLine("Enter first Y value: ");
        float point1Y = float.Parse(Console.ReadLine());
        Console.WriteLine("Enter second X value: ");
        float point2X = float.Parse(Console.ReadLine());
        Console.WriteLine("Enter second Y value: ");
        float point2Y = float.Parse(Console.ReadLine());
        Console.WriteLine();

    double deltaX = point2X - point1X;
    double deltaY = point2Y - point1Y;
    double distance = Math.Sqrt(Math.Pow(deltaX, 2) + Math.Pow(deltaY,2));
    double angle1 = Math.Atan2(point1Y,point1X);
    double angle2 = Math.Atan2(point2Y,point2X);
    double angleT = Math.Abs(angle1 - angle2) * 180 / Math.PI;
    double point1 = point1X + point1Y;
    double point2 = point2X + point2Y;

    if (point1 + 2 == point2)
    {
        Console.WriteLine("DeltaX value is: " + deltaX);
        Console.WriteLine("DeltaY value is: " + deltaY);
        Console.WriteLine("The distance is: " + distance);
        Console.WriteLine("The angle is: -135°");
    }
    else if (point2 + 2 == point1)
    {
        Console.WriteLine("DeltaX value is: " + deltaX);
        Console.WriteLine("DeltaY value is: " + deltaY);
        Console.WriteLine("The distance is: " + distance);
        Console.WriteLine("The angle is: -135°");
    }
    else
    {
        Console.WriteLine("DeltaX value is: " + deltaX);
        Console.WriteLine("DeltaY value is: " + deltaY);
        Console.WriteLine("The distance is: " + distance);
        Console.WriteLine("The angle is: " + angleT + "°");

    }   
person Thoomana Novakid    schedule 08.12.2019