Проблема тригонометрии - создайте PointF, используя угол - PullRequest
0 голосов
/ 05 марта 2012

Я уже давно почесал голову над этим. Думаю, мне следовало уделять больше внимания на уроках математики тригонометрии, когда я был моложе, но здесь мы идем:

У меня есть угол и точка. Затем я хочу поставить вторую точку в направлении угла, на расстоянии 200 единиц от первой точки. Я использую Atan2, чтобы получить угол, затем cos и sin, чтобы получить третью точку. Но ... я думаю, что что-то идет не так при расчете греха для p3.Y.

РЕДАКТИРОВАТЬ: Чтобы уточнить, я удалил p2 и использовал угол непосредственно:

        PointF p1 = new PointF(20, 20);
        double angle = 1.3034851559678624f;

        //Create a new PointF in the same direction, 200 pixels away from p1
        //{ X = 199,9482, Y = 4,549629 }
        PointF p3 = new PointF
        {
            X = (float)(Math.Cos(Math.PI * angle / 180.0) * 200),
            Y = (float)(Math.Sin(Math.PI * angle / 180.0) * 200)
        };

        //This is where I would expect 1.3034851559678624 as the first angle 
        //but I get -4.9073849244837184
        double angle2 = Math.Atan2(p3.Y - p1.Y, p3.X - p1.X) * 180 / Math.PI;

Вот визуальное представление значений выше. Зеленая линия - первый угол.

Visual overview

Ответы [ 3 ]

1 голос
/ 05 марта 2012

Ну, если предполагается, что p3 находится на линии p1-p2, вам вообще не нужно использовать тригонометрию. Вы можете найти координаты p3 непосредственно из координат p1 и p2. Предположим, что расстояние между p1 и p2 составляет 1000 единиц. Тогда расположение p3, 200 единиц из p1:

{p1.x+(p2.x-p1.x)*(200/1000),p1.y+(p2.y-p1.y)*(200/1000)}

Если расстояние между двумя точками не равно 1000 (что, конечно, не будет), замените это значение на евклидово расстояние между ними.

Если вы все еще хотите наклон линии, вы рассчитываете соотношение

(p2.y-p1.y)/(p2.x-p1.x)

, который дает вам уклон как одно число, где 1 представляет линию, которая проходит через начало координат под углом +45deg. Немного повернувшись, вы повернете наклон в угол, будьте осторожны, когда линия вертикальная, то есть где знаменатель отношения равен 0.

1 голос
/ 05 марта 2012

Проблема с вашим текущим кодом в том, что вы не вычисляете p3 относительно p1.Вам необходимо добавить p1.X и p1.Y к координатам p3:

PointF p3 = new PointF
{
    X = p1.X + (float)(Math.Cos(Math.PI * angle / 180.0) * 200),
    Y = p1.Y + (float)(Math.Sin(Math.PI * angle / 180.0) * 200)
};
0 голосов
/ 05 марта 2012

Вам не нужно было использовать atan, чтобы получить угол, а затем рассчитать sin / cos.Вы можете получить грех и кос прямо из координат точек.

cos = (p2.x - p1.x)/length
sin = (p2.y - p1.y)/length

http://en.wikipedia.org/wiki/Line_%28geometry%29

...