Учитывая две точки, рассчитать третью точку под заданным углом? - PullRequest
0 голосов
/ 19 января 2012

У меня есть последние две CGPoints из Array , который содержит точки линии, нарисованной пользователем.Мне нужно расширить линию до фиксированного расстояния под тем же углом.поэтому я сначала вычисляю угол между двумя последними точками с помощью следующего кода

-(CGFloat)angleBetweenFirstPoint:(CGPoint)firstPoint ToSecondPoint:(CGPoint)secondPoint
{

CGPoint diff = ccpSub(secondPoint, firstPoint);

NSLog(@"difference point %f , %f",diff.x,diff.y);

CGFloat res = atan2(diff.y, diff.x);

/*if ( res < 0 ) 
{
    res = (0.5 * M_PI) + res;
}

if ( dx<0  && dy>0 ) {      // 2nd quadrant
    res += 0.5 * M_PI;
} else if ( dx<0 && dy<0 ) {        // 3rd quadrant
    res += M_PI;
} else if ( dx>0 && dy<0 ) {        // 4th quadrant
    res += M_PI + (0.5 * M_PI);
}*/

//res=res*180/M_PI;

res = CC_RADIANS_TO_DEGREES(res);

return res;
}

После вычисления угла я нахожу точку растяжения с помощью следующих математических операций

-(void)extendLine
{
lineAngle = [self angleBetweenFirstPoint:pointD ToSecondPoint:endPt];

extendEndPt.x = endPt.x - cos(lineAngle) * 200;
        extendEndPt.y = endPt.y - sin(lineAngle) * 200;

// draw line unto extended point
}

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

1 Ответ

7 голосов
/ 19 января 2012

О боги, вы делаете это таким невероятно усложненным образом.

Пропустите всю дерьмо под углами.Тебе это не нужно.Период.Делайте все это с векторами и очень простыми.Прежде всего, я предполагаю, что вам дают две точки, P1 и P2.Вы хотите найти новую точку P3, которая является известным расстоянием (d) от P2, вдоль линии, соединяющей две точки.

Все, что вам нужно сделать - это сначала вычислить вектор, который указывает вдоль линиив вопросе.

V = P2 - P1;

Я написал это так, как будто я пишу в MATLAB, но все это означает, что нужно вычесть координаты x и y двух точек.

Далее,масштабируйте вектор V, чтобы он имел единичную длину.

V = V/sqrt(V(1)^2 + V(2)^2);

Разделив компоненты вектора V на длину (или 2-норму, если вы предпочитаете) этого вектора, создайте вектор с единичной нормой.Эта норма представляет собой просто квадратный корень из суммы квадратов элементов V, поэтому это, очевидно, длина вектора.

Теперь вычислить P3 просто.

P3 = P2 + d*V;

P3 будет находиться на расстоянии d единиц от P2 в направлении линии от точки P1.Ничего сложного не требуется.Углы не рассчитаны.Не беспокойтесь о квадрантах.

Научитесь использовать векторы.Они ваши друзья, или, по крайней мере, они могут быть, если вы позволите им.

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