Как рассчитать угол по двум координатам? - PullRequest
2 голосов
/ 01 декабря 2011

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

    private void btnSetHeading_Click(object sender, EventArgs e)
    {
        if (this.textBoxHeading.Text.Length == 0)
            return;

        float heading = (float)0;
        try
        {
            heading = float.Parse(this.textBoxHeading.Text);
        }
        catch (FormatException ex)
        {
            MessageBox.Show(ex.Message);
            return;
        }

        if (heading < (float)0 || heading > (float)360)
        {
            MessageBox.Show("Invalid heading parameter. Acceptable range: 0 - 360");
            return;
        }

        float tempCosine = (float)Math.Cos(((heading * Math.PI) / (float)360.0));
        float tempSine = -((float)Math.Sin(((heading * Math.PI) / (float)360.0)));
        try
        {
            ProgramInterop.CreateInstance.SetHeading(tempCosine, tempSine);
        }
        catch (Exception ex)
        {
            MessageBox.Show("Caught: " + ex.Message);

        }
    }

Если в качестве заголовка указать 90, я получу следующие результаты: tempCosine = 0.7071068 и tempSine = -0.7071068, из-за чего мой основной объект будет повернут на 90 градусов или болеевосток.

Программа требует указывать заголовок в двух отдельных значениях (tempCosine и tempSine), которые я недостаточно знаком с геометрией, чтобы понять, почему я умножил бы на 360 вместо 180, но это то, как еготребуется для работы.

Теперь для следующей части моего проекта необходимо, чтобы мой главный объект был обращен к другому объекту, учитывая обе их (x, y) координаты.Например, если мой основной объект находится в точке (9112.94, 22088.74), а новый объект, в котором я хочу встретиться, находится в точке (9127.04, 22088.88), то для его ориентации потребуется почти ровно 90 градусов.

Как я могу рассчитать tempCosine и tempSine из этих двух координат?

Ответы [ 2 ]

3 голосов
/ 01 декабря 2011

Что касается 180, это правда. Я привык иметь такой класс расширения для работы с радианами и градусами.

public static class Extension
{

    public static double ToRadians(this double degree)
    {
        return degree * Math.PI / 180;
    }

    public static double ToDegrees(this double val)
    {
        return val * 180 / Math.PI;
    }
}

Относительно синуса и косинуса (я не уверен, что все понял правильно), но если я использую код ниже

float x1 = 9112.94f;
float y1 = 22088.74f;

float x2 = 9127.04f;
float y2 = 22088.88f;

float r = (float) Math.Pow((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1), 0.5);
float cosine = (x2 - x1) /r;
float sine = (y2 - y1) /r;

Я получу угол 0,5712978 (не равный 90).

Извините, если я неправильно понял проблему.

2 голосов
/ 05 декабря 2011

Мне удалось выработать ответ, используя предложение Дэни использовать Atan2 (y, x). Спасибо Дани.

float x1 = 9112.94f;
float y1 = 22088.74f;

float x2 = 9127.04f;
float y2 = 22088.88f;

float angleRadians;

float diffX = x2 - x1;
float diffY = y2 - y1;

float atan2Result = (float)Math.Atan2(diffX, diffY);
angleRadians = atan2Result / 2;
if (angleRadians < 0.0f)
    angleRadians += (float)Math.PI;

float tempCosine = (float)Math.Cos(angleRadians);
float tempSine = -((float)Math.Sin(angleRadians));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...