как получить буферную зону вокруг uibezierpath - PullRequest
2 голосов
/ 29 июня 2011

У меня есть несколько uibezierpaths. как пути, они на самом деле не имеют толщины. но я надеюсь найти способ определить область вокруг пути, как сероватые области вокруг линий на этом рисунке enter image description here

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

Ответы [ 2 ]

1 голос
/ 30 июня 2011

Расширение ширины пути на самом деле довольно сложно.Тем не менее, вы можете просто погладить его с более толстой шириной и получить почти такой же эффект.Что-то вроде ...

CGContextSetRGBStrokeColor(context, 0.4, 0.4, 0.4, 1.0);
[path setLineWidth:15];
[path stroke];
CGContextSetRGBStrokeColor(context, 0.0, 0.0, 0.0, 1.0);
[path setLineWidth:3];
[path stroke];

... даст картину, подобную той, что у вас в вопросе.Но я сомневаюсь, что это новость для вас.

Настоящий трюк - это проверка того, «попадают ли нарисованные линии в буферную зону».Эта проблема очень похожа на ту, на которую я только что ответил для себя в другом вопросе .Взгляните на код LineSample.zip , которым я поделился там.Это реализует растровое / побитовое сравнение данных для обнаружения совпадений на линиях так, как вам нужно.Вы можете просто нарисовать более толстые «буферные» пути в растровом изображении для тестирования и показать более тонкие линии на вашем виде.

0 голосов
/ 01 ноября 2011

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

На самом деле это очень просто сделать. Во-первых, вам нужно значение, которое определит объем пространства вокруг пути, который вы хотите проверить. Допустим, 20 баллов. Поэтому вам нужно запустить цикл FOR, начинающийся с -20 до 20, и на каждой итерации создавать копию своего пути, переводить координаты x и y пути, проверять каждый из них.

Все это более ясно в этом примере кода.

CGPoint touchPoint = /*get the point*/;

NSInteger space = 20;

for (NSInteger i = -space; i < space; i++) {

    UIBezierPath *pathX = [UIBezierPath bezierPathWithCGPath:originalPath.CGPath];
    [pathX applyTransform:CGAffineTransformMakeTranslation(i, 0)];

    if ([pathX containsPoint:touchPoint]) {
        /*YEAH!*/
    }

    else {
        UIBezierPath *pathY = [UIBezierPath bezierPathWithCGPath:originalPath.CGPath];
        [pathY applyTransform:CGAffineTransformMakeTranslation(0, i)];

        if ([pathY containsPoint:touchPoint]) {
            /*YEAH!*/
        }
    }

}
...