Исключение с CGPathApplierFunction

Мой CGPathRef имеет 5 элементов, я хочу удалить начальную точку и иметь путь с 4 элементами, чья начальная точка совпадает с концом пути, чью начальную точку я хочу удалить.

теперь это моя функция, которая генерирует исключение:

static void constructPath(void *info, const CGPathElement *element) 
{
    NSBezierPath *bezierPath = (NSBezierPath *)info; 
    switch (element->type) {
        case kCGPathElementMoveToPoint:
            // some kind of skipping using points[0] kCGPathElementMoveToPoint
            [bezierPath lineToPoint:element->points[1]]; // line exception in gdb
            [bezierPath lineToPoint:element->points[2]];
            [bezierPath lineToPoint:element->points[3]];
            [bezierPath lineToPoint:element->points[4]];
            break;
        case kCGPathElementAddLineToPoint:

            if ([bezierPath isEmpty]) {
                [bezierPath moveToPoint:element->points[0]]; // the new start, how to go to next from here ?
            } else {

                [bezierPath moveToPoint:element->points[1]];
                [bezierPath moveToPoint:element->points[2]];
                [bezierPath moveToPoint:element->points[3]];
                [bezierPath moveToPoint:element->points[4]];
            }
            break;
        default:
            break;
    }
}

1 ответ

Решение

Просто игнорируйте первый элемент исходного пути (который имеет тип kCGPathElementMoveToPoint). Затем для каждой линии добавьте новую строку, кроме случаев, когда путь пуст, и в этом случае вам необходимо перейти к исходной точке.

static void constructPath (void * info, const CGPathElement * element)
{
    NSBezierPath * bezierPath = (NSBezierPath *) info;
    if (kCGPathElementAddLineToPoint == element-> type)
    {
        if ([bezierPath isEmpty]) {
            [bezierPath moveToPoint: element-> points [0]];
        } еще {
            [bezierPath lineToPoint:element->points[0]];
        }
    }
}
Другие вопросы по тегам