Создайте перпендикулярную линию к CGPathRef

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

Я изучил CGAffineTransform, чтобы повернуть новую строку на основе конечной точки пути, но пока не повезло. Любые советы или понимание будут высоко оценены.

Некоторые из моих текущих кодов для справки выглядят так:

        - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
    {
        UITouch* touch = [touches anyObject];
        CGPoint positionInScene = [touch locationInNode:self];

        //add a line to the new coordinates the user moved to
        CGPathAddLineToPoint(pathToDraw, NULL, positionInScene.x, positionInScene.y);
    }


-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
//create local copy of path
CGPathRef myPath_ = pathToDraw;

CGPoint myPoint = CGPathGetCurrentPoint(pathToDraw);

//create rectangle to append to end of line        
CGRect newRect = CGRectMake(myPoint.x, myPoint.y, 25, 3);
CGPathRef newPath = CGPathCreateWithRect(newRect, NULL);

//add new line to the end of the path
CGPathAddPath(newPath, NULL, myPath_);

//set shape node path to drawn path        
lineNode.path = myPath_;
}

person user3552953    schedule 20.04.2014    source источник


Ответы (1)


Чтобы получить перпендикуляр, вы можете взять вектор, указывающий в направлении последнего сегмента прямой, затем поменять местами x и y и инвертировать один из них. Что-то вроде этого:

CGPoint v = { currentPoint.x - lastPoint.x, currentPoint.y - lastPoint.y };
CGPoint perp;
if (v.x == 0)
{
    perp.x = -v.y;
    perp.y = v.x;
}
else
{
    perp.x = v.y;
    perp.y = -v.x;
}

Теперь вы можете нарисовать линию в направлении perp, начиная с текущей точки, вот так:

CGPathMoveToPoint (somePath, currentPoint);
CGPathAddLineToPoint (somePath, NULL, currentPoint.x + perp.x * length, currentPoint.y + perp.y * length);

где length — длина отрезка, который вы хотите нарисовать.

И не забудьте установить lastPoint на currentPoint, чтобы в следующий раз все было правильно:

lastPoint = currentPoint;
person user1118321    schedule 20.04.2014
comment
Спасибо, это заставило меня преодолеть горб. Мне пришлось настроить переменную длины, чтобы сделать ее динамической в ​​зависимости от длины сегмента линии, чтобы перпендикулярная линия всегда была одинакового размера, и я добавил еще одну линию с обратными значениями x и y, и это работает как шарм. Вы спасатель! - person user3552953; 22.04.2014