【问题标题】:How to draw polygons with CGPath?如何用 CGPath 绘制多边形?
【发布时间】:2011-01-16 00:29:51
【问题描述】:

我一直在阅读文档,但是我并不清楚如何使用 CGPath 绘制多边形。我需要做的就是围绕这样的东西绘制 CGPath:

__
\  \ 
 \  \
  \__\

谁能提供一个关于如何做到这一点的sn-p?

另外,我假设 CGPathContainsPoint 将帮助我确定一个点是否在这样的路径内?还是该路径必须是实体图

另外,我怎样才能移动 cgpath?这是否像在 cgrect 中一样更改原点之类的东西一样简单?

谢谢。

-奥斯卡

【问题讨论】:

    标签: iphone core-graphics polygon draw cgpath


    【解决方案1】:

    你应该这样做:

    - (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);
    }
    

    请注意,points 是您要为其绘制多边形的点数组。所以它应该是圆形路径,比如:你正在绘制一个三角形的点(x1, x2, x3),那么你应该传入数组(x1, x2, x3, x1)。

    希望这会有所帮助。

    【讨论】:

    • 这里没有引用数组,只是重复添加同一个点。
    • @David 我认为这已被理解
    • 他本可以理解的,但我认为通常最好发布正确的代码或明确说明代码包含错误/遗漏。在教授新概念时,对老师来说显而易见的东西可能很复杂,学生很难看到。
    • @David:好的,下次我会记住这件事,同时发布答案。
    • 这种方法不会将第一行和最后一行连接在一起以按要求制作多边形,对吗? (如果您将线设置为非常粗,这将非常明显。)
    【解决方案2】:

    Stanford 在 iPhone 上的 CS193P 课程有一个名为 HelloPoly 的项目,这可能正是您想要的 - 请参阅 class home page 了解规范,然后观看视频了解它是如何实施的(以及完成该任务的人提供的谷歌解决方案)。

    【讨论】:

      【解决方案3】:

      请参阅 Apple 的 QuartzDemo 应用程序。它具有执行此操作的代码,以及许多其他 Quartz 绘图功能。

      【讨论】:

        【解决方案4】:

        这是一个如何使用 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
        

        这是结果

        【讨论】:

          【解决方案5】:

          Draelach 的答案已更新为 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)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-10-13
            • 1970-01-01
            • 2014-03-03
            • 2011-12-30
            • 2010-09-26
            • 2011-01-04
            相关资源
            最近更新 更多