如何在ios中使用CGMutablePathRef绘制Hexagon?

时间:2013-11-01 08:52:04

标签: ios objective-c

我想绘制Hexagon,这是我的代码

int mgX = penThickness * 6;
int mgY = penThickness * 2;

CGPoint st = CGPointMake(MIN(startingPt.x, endingPt.x), 
                        MIN(startingPt.y, endingPt.y));
CGPoint et = CGPointMake(MAX(startingPt.x, endingPt.x), 
                        MAX(startingPt.y, endingPt.y));

CGRect outsideRect = CGRectMake(st.x,st.y, MAX(mgX, et.x-st.x), 
                        MAX(mgY, et.y-st.y));
CGRect insideRect  = CGRectInset(outsideRect, outsideRect.size.width * 0.40f, 
                        outsideRect.size.height * 0.30f);


CGPathMoveToPoint(pathRef, nil, CGRectGetMinX(outsideRect), 
                        CGRectGetMinY(outsideRect));
//0
CGPathAddLineToPoint(pathRef, nil, CGRectGetMaxX(insideRect), 
                        CGRectGetMinY(outsideRect));
//1
CGPathAddLineToPoint(pathRef, nil, CGRectGetMaxX(outsideRect), 
                        CGRectGetMidY(insideRect));
//2
CGPathAddLineToPoint(pathRef, nil, CGRectGetMaxX(insideRect), 
                        CGRectGetMaxY(outsideRect));
//3
CGPathAddLineToPoint(pathRef, nil, CGRectGetMinX(outsideRect), 
                        CGRectGetMaxY(outsideRect));
//las line
 CGPathAddLineToPoint(pathRef, nil, CGRectGetMidX(outsideRect), 
                        CGRectGetMidY(outsideRect));

任何人请帮助我。

3 个答案:

答案 0 :(得分:2)

我在Hexagon中编写了Draw Complet,这个代码用于绘制Hexagon

    int mgX = penThickness * 6;
    int mgY = penThickness * 6;

    CGPoint st = CGPointMake(MIN(startingPt.x, endingPt.x), MIN(startingPt.y, endingPt.y));
    CGPoint et = CGPointMake(MAX(startingPt.x, endingPt.x), MAX(startingPt.y, endingPt.y));

    CGRect outsideRect = CGRectMake(st.x,st.y, MAX(mgX, et.x-st.x), MAX(mgY, et.y-st.y));
    CGRect insideRect  = CGRectInset(outsideRect, outsideRect.size.width * 0.30f, outsideRect.size.height * 0.30f);

    CGPathMoveToPoint(pathRef, nil, CGRectGetMinX(insideRect), CGRectGetMinY(outsideRect));

    //0 line
    CGPathAddLineToPoint(pathRef, nil, CGRectGetMaxX(insideRect), CGRectGetMinY(outsideRect));


    //1 line
    CGPathAddLineToPoint(pathRef, nil, CGRectGetMaxX(outsideRect), CGRectGetMidY(insideRect));

    //2 line
     CGPathAddLineToPoint(pathRef, nil, CGRectGetMaxX(insideRect), CGRectGetMaxY(outsideRect));


    //3 line
     CGPathAddLineToPoint(pathRef, nil, CGRectGetMinX(insideRect), CGRectGetMaxY(outsideRect));

    //4 line

    CGPathAddLineToPoint(pathRef, nil, CGRectGetMinX(outsideRect), CGRectGetMidY(insideRect));

    CGPathCloseSubpath(pathRef);

答案 1 :(得分:0)

以下链接说明了如何使用CGMutablePathRef绘制六边形:

Move CGPathCreateMutable() so the path stays the same?

答案 2 :(得分:0)

- (CGPathRef)roundedPolygonPathWithRect:(CGRect)rect lineWidth:(CGFloat)lineWidth sides:(NSInteger)sides cornerRadius:(CGFloat)cornerRadius {

/*
//Center your poligon, depends from reference system
rect = CGRectMake(rect.origin.x - (rect.size.width - lineWidth)/2.0,
                  rect.origin.y - (rect.size.height - lineWidth)/2.0,
                  rect.size.width,
                  rect.size.height);
 */

CGMutablePathRef pathRef  = CGPathCreateMutable();

CGFloat theta       = 2.0 * M_PI / sides;                           // how much to turn at every corner
//CGFloat offset      = cornerRadius * tanf(theta / 2.0);             // offset from which to start rounding corners
CGFloat width = MIN(rect.size.width, rect.size.height);   // width of the square

// Calculate Center
CGPoint center = CGPointMake(rect.origin.x + width / 2.0, rect.origin.y + width / 2.0);
CGFloat radius = (width - lineWidth + cornerRadius - (cos(theta) * cornerRadius)) / 2.0;

// Start drawing at a point, which by default is at the right hand edge
// but can be offset
CGFloat angle = M_PI / 2;

CGPoint corner = CGPointMake(center.x + (radius - cornerRadius) * cos(angle), center.y + (radius - cornerRadius) * sin(angle));
CGPathMoveToPoint(pathRef, nil, corner.x + cornerRadius * cos(angle + theta), corner.y + cornerRadius * sin(angle + theta));

// draw the sides and rounded corners of the polygon
for (NSInteger side = 0; side < sides; side++) {

    angle += theta;

    CGPoint corner = CGPointMake(center.x + (radius - cornerRadius) * cos(angle), center.y + (radius - cornerRadius) * sin(angle));
    CGPoint tip = CGPointMake(center.x + radius * cos(angle), center.y + radius * sin(angle));
    CGPoint start = CGPointMake(corner.x + cornerRadius * cos(angle - theta), corner.y + cornerRadius * sin(angle - theta));
    CGPoint end = CGPointMake(corner.x + cornerRadius * cos(angle + theta), corner.y + cornerRadius * sin(angle + theta));

    //[path addLineToPoint:start];
    CGPathAddLineToPoint(pathRef, nil, start.x, start.y);

    //[path addQuadCurveToPoint:end controlPoint:tip];
    CGPathAddQuadCurveToPoint(pathRef, nil, tip.x, tip.y, end.x, end.y);
}

CGPathCloseSubpath(pathRef);

return pathRef;

}