iPhone的iOS生成明星,旭日或多边形UIBezierPath编程(iPhone iOS Gen

2019-06-24 02:40发布

我正在寻找一种方法以编程方式创建星,旭日,并且使用UIBezierPath等“尖”的效果。

UIBezierPath *sunbeamsPath = [UIBezierPath bezierPath];
[sunbeamsPath moveToPoint: CGPointMake(x, y)];

是否有可以产生类似形状的编程旭日点的任何算法,没有路径的重叠?

我也有兴趣在不规则形状旭日像下面这样:

我可以想象这样的算法将需要一定数目的射线,然后大致划分圆在多个段并产生点在顺时针方向,例如段。 是否像一个我已经描述的算法存在,或者我会写一个我自己?

谢谢!

Answer 1:

我知道这老了,但我很好奇这个问题,我的第一部分,并去关jrturton的帖子,我创建了从视图中心生成UIBezierPath一个自定义的UIView。 即使它的动画纺纱奖励积分。 下面是结果:

我使用的代码是在这里:

- (void)drawRect:(CGRect)rect {
CGFloat radius = rect.size.width/2.0f;

[self.fillColor setFill];
[self.strokeColor setStroke];

UIBezierPath *bezierPath = [UIBezierPath bezierPath];
CGPoint centerPoint = CGPointMake(rect.origin.x + radius, rect.origin.y + radius);

CGPoint thisPoint = CGPointMake(centerPoint.x + radius, centerPoint.y);
[bezierPath moveToPoint:centerPoint];

CGFloat thisAngle = 0.0f;
CGFloat sliceDegrees = 360.0f / self.beams / 2.0f;

for (int i = 0; i < self.beams; i++) {

    CGFloat x = radius * cosf(DEGREES_TO_RADIANS(thisAngle + sliceDegrees)) + centerPoint.x;
    CGFloat y = radius * sinf(DEGREES_TO_RADIANS(thisAngle + sliceDegrees)) + centerPoint.y;
    thisPoint = CGPointMake(x, y);
    [bezierPath addLineToPoint:thisPoint];
    thisAngle += sliceDegrees;

    CGFloat x2 = radius * cosf(DEGREES_TO_RADIANS(thisAngle + sliceDegrees)) + centerPoint.x;
    CGFloat y2 = radius * sinf(DEGREES_TO_RADIANS(thisAngle + sliceDegrees)) + centerPoint.y;
    thisPoint = CGPointMake(x2, y2);
    [bezierPath addLineToPoint:thisPoint];
    [bezierPath addLineToPoint:centerPoint];
    thisAngle += sliceDegrees;

}

[bezierPath closePath];

bezierPath.lineWidth = 1;
[bezierPath fill];
[bezierPath stroke];

}

你可以在这里下载示例项目:

https://github.com/meekapps/Sunburst



Answer 2:

我不知道的算法来创建这些,但我有一些建议 - 你需要画一个“束”创建贝塞尔路径,使得(0,0)是旭日的中心,然后定义无论多少点你的旭日走上坡路,返回到(0,0)

然后,只要你想尽可能多波束,进行一个循环:应用旋转变换(梁2 PI /号码),新光点(CGPointApplyTransform),并将它们添加到路径。

一旦你完成,你可以平移和缩放路径绘制。

我用了一个类似的过程,以最近绘制多边形星,这是非常简单的。 感谢罗布纳皮尔的书的想法。



Answer 3:

斯威夫特版本用于此

import UIKit

extension Int {
    var degreesToRadians: Double { return Double(self) * .pi / 180 }
    var radiansToDegrees: Double { return Double(self) * 180 / .pi }
}
extension FloatingPoint {
    var degreesToRadians: Self { return self * .pi / 180 }
    var radiansToDegrees: Self { return self * 180 / .pi }
}

class SunBurstView: UIView {

    override func draw(_ rect: CGRect) {
        let radius: CGFloat = rect.size.width / 2.0
        UIColor.red.setFill()
        UIColor.blue.setStroke()
        let bezierPath = UIBezierPath()
        let centerPoint = CGPoint(x: rect.origin.x + radius, y: rect.origin.y + radius)
        var thisPoint = CGPoint(x: centerPoint.x + radius, y: centerPoint.y)
        bezierPath.move(to: centerPoint)
        var thisAngle: CGFloat = 0.0
        let sliceDegrees: CGFloat = 360.0 / self.beams / 2.0

        for _ in 0..<self.beams {
            let x = radius * CGFloat(cosf(Float((thisAngle + sliceDegrees).degreesToRadians))) + centerPoint.x
            let y = radius * CGFloat(sinf(Float((thisAngle + sliceDegrees).degreesToRadians))) + centerPoint.y
            thisPoint = CGPoint(x: x, y: y)
            bezierPath.addLine(to: thisPoint)
            thisAngle += sliceDegrees
            let x2 = radius * CGFloat(cosf(Float((thisAngle + sliceDegrees).degreesToRadians))) + centerPoint.x
            let y2 = radius * CGFloat(sinf(Float((thisAngle + sliceDegrees).degreesToRadians))) + centerPoint.y
            thisPoint = CGPoint(x: x2, y: y2)
            bezierPath.addLine(to: thisPoint)
            bezierPath.addLine(to: centerPoint)
            thisAngle += sliceDegrees
        }
        bezierPath.close()
        bezierPath.lineWidth = 1
        bezierPath.fill()
        bezierPath.stroke()
    }

}


文章来源: iPhone iOS Generate star, sunburst or polygon UIBezierPath programmatically