C # Vector математические вопросы - PullRequest
1 голос
/ 22 апреля 2010

Я работаю в координатном пространстве экрана, которое отличается от классического координатного пространства X / Y, где мое направление Y идет вниз в положительном, а не вверх.

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

Если центральная точка моего экрана находится в точке x (200) y (300), а точка центра моего круга - в точке x (150) и y (380), то я бы хотел рассчитать угол, в котором круг быть лицом.

На данный момент у меня есть это:

        Point centerPoint = new Point(200, 300);
        Point middleBottom = new Point(200, 400);

        Vector middleVector = new Vector(centerPoint.X - middleBottom.X, centerPoint.Y - middleBottom.Y);

        Vector vectorOfCircle = new Vector(centerPoint.X - 150, centerPoint.Y - 400);

        middleVector.Normalize();
        vectorOfCircle.Normalize();

        var angle = Math.Acos(Vector.CrossProduct(vectorOfCircle, middleVector));

        Console.WriteLine("Angle: {0}", angle * (180/Math.PI));

Я не понимаю, чего бы я ожидал.

Я бы сказал, что когда я войду в x (150) и y (300) моего круга, я бы ожидал увидеть поворот на 90 градусов, но я не получаю это ... Я получаю 180 !!

Любая помощь здесь будет принята с благодарностью.

Cheers, Mark

Ответы [ 3 ]

1 голос
/ 22 апреля 2010

Все в порядке, я думаю, я понял сейчас:

Я прочитал эту статью:

http://www.euclideanspace.com/maths/algebra/vectors/angleBetween/index.htm

Который определил, что мне нужно было использовать Атан2 вместо acos

        Point centerPoint = new Point(200, 300);
        Point middleBottom = new Point(200, 400);

        Vector middleVector = new Vector(centerPoint.X - middleBottom.X, centerPoint.Y - middleBottom.Y);
        Vector vectorOfCircle = new Vector(centerPoint.X - 250, centerPoint.Y - 300);

        middleVector.Normalize();
        vectorOfCircle.Normalize();

        var angle = Math.Atan2(vectorOfCircle.Y, vectorOfCircle.X) - Math.Atan2(middleVector.Y, middleVector.X);

        Console.WriteLine("Angle: {0}", angle * (180/Math.PI));
1 голос
/ 22 апреля 2010

Одно замечание:

Функция косинус используется в точечном произведении. Перекрестное произведение использует синус.

0 голосов
/ 22 апреля 2010

Нет, это правильно. Нулевой угол от оригинала (centerPoint) направо. Поскольку круг находится слева от оригинала, то угол составляет 180 градусов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...