Как рисовать полигоны с помощью CGPath? - PullRequest
13 голосов
/ 12 февраля 2010

Я читал документацию, но мне не сразу понятно, как рисовать многоугольник, используя CGPath. Все, что мне нужно сделать, это нарисовать CGPath примерно так:

__
\  \ 
 \  \
  \__\

Может ли кто-нибудь предоставить фрагмент о том, как это сделать?

Кроме того, я полагаю, что CGPathContainsPoint поможет мне определить, находится ли точка внутри такого пути?

Также, как я могу переместить cgpath? Это так же просто, как изменить что-то вроде источника, как в cgrect?

Спасибо.

-Oscar

Ответы [ 5 ]

17 голосов
/ 12 августа 2014

Это пример того, как создать треугольник, используя CGPath, вам нужно только поставить точки.

var path = CGPathCreateMutable()
CGPathMoveToPoint(path, nil, 0, 0) //start from here
CGPathAddLineToPoint(path, nil, 20, 44) 
CGPathAddLineToPoint(path, nil, 40, 0) 
CGPathAddLineToPoint(path, nil, 0, 0)

//and to use in SpriteKit, for example

var tri = SKShapeNode(path: path) 
var color = NSColor.blueColor()
tri.strokeColor = color
tri.fillColor = color

Это результат

Triangle with CGPath

13 голосов
/ 12 февраля 2010

Вы должны сделать это так:

- (void)drawRect:(CGRect)rect { 

        CGContextRef context = UIGraphicsGetCurrentContext(); 

        CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);
        CGContextSetRGBFillColor(context, 0.0, 0.0, 1.0, 1.0);

        // Draw them with a 2.0 stroke width so they are a bit more visible.
        CGContextSetLineWidth(context, 2.0);

        for(int idx = 0; idx < self.points.count; idx++)
        {

            point = [self.points objectAtIndex:idx];//Edited 
            if(idx == 0)
            {
                // move to the first point
                CGContextMoveToPoint(context, point.x, point.y);
            }
            else
            {
                CGContextAddLineToPoint(context, point.x, point.y);
            }
        }

        CGContextStrokePath(context);
}

Обратите внимание, что точки - это массив точек, для которых вы хотите нарисовать многоугольник. Таким образом, это должен быть круговой путь, например: вы рисуете треугольник из точек (x1, x2, x3), затем вы должны перейти в массив (x1, x2, x3, x1).

Надеюсь, это поможет.

5 голосов
/ 14 мая 2018

Ответ Дрелака обновлен до Swift 4:

let path = CGMutablePath()
path.move(to: CGPoint(x: 0, y: 0))
path.addLine(to: CGPoint(x: 20, y: 44))
path.addLine(to: CGPoint(x: 40, y: 0))
path.addLine(to: CGPoint(x: 0, y: 0))

let tri = SKShapeNode(path: path)
5 голосов
/ 12 февраля 2010

См. Приложение Apple QuartzDemo . Для этого есть код, а также многие другие функции рисования Кварца.

2 голосов
/ 12 февраля 2010

У класса Стэнфорда CS193P на iPhone был проект под названием HelloPoly, который мог бы быть именно тем, что вы хотите - посмотрите спецификацию на домашней странице класса , а затем посмотрите видео о том, как это было реализовано (и решения Google от людей кто сделал назначение).

...