Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 画部分圆_Swift_Uibezierpath - Fatal编程技术网

Swift 画部分圆

Swift 画部分圆,swift,uibezierpath,Swift,Uibezierpath,我正在写一个程序,它将取一个介于0和1之间的数字,然后吐出一个圆(我猜是弧),这个圆就是由这个数字完成的 例如,如果输入0.5,程序将输出一个半圆 如果为0.1,程序将输出一个微小的圆弧,最终占整个圆的10% 我可以通过将角度起点设为0,角度终点设为2*M_PI*decimalInput 但是,我需要将起点放在圆的顶部,因此起点是3*M_PI_2,终点是7*M_PI_2 我只是在画一个圆时遇到了一些问题,这个圆的一部分是由这些新的起点/终点组成的。我承认,我的数学不是最好的,所以任何建议/意见都

我正在写一个程序,它将取一个介于0和1之间的数字,然后吐出一个圆(我猜是弧),这个圆就是由这个数字完成的

例如,如果输入0.5,程序将输出一个半圆

如果为0.1,程序将输出一个微小的圆弧,最终占整个圆的10%

我可以通过将角度起点设为0,角度终点设为2*M_PI*decimalInput

但是,我需要将起点放在圆的顶部,因此起点是
3*M_PI_2
,终点是
7*M_PI_2

我只是在画一个圆时遇到了一些问题,这个圆的一部分是由这些新的起点/终点组成的。我承认,我的数学不是最好的,所以任何建议/意见都是值得赞赏的

这是我到目前为止所拥有的

var decimalInput = 0.75 //this number can be any number between 0 and 1
let start = CGFloat(3*M_PI_2)
let end = CGFloat(7*M_PI_2*decimalInput)

let circlePath = UIBezierPath(arcCenter: circleCenter, radius: circleRadius, startAngle: start, endAngle: end, clockwise: true)

circlePath.stroke()

不管我怎么努力,我似乎都做不好。我认为端角是罪魁祸首,除非我走错方向,否则弧长是2*m\u PI*decimalInput。需要将弧长添加到起始角度,如下所示:

let circleCenter = CGPointMake(100, 100)
let circleRadius = CGFloat(80)
var decimalInput = 0.75
let start = CGFloat(3 * M_PI_2)
let end = start + CGFloat(2 * M_PI * decimalInput)
let circlePath = UIBezierPath(arcCenter: circleCenter, radius: circleRadius, startAngle: start, endAngle: end, clockwise: true)
XCPCaptureValue("path", circlePath)
结果:


请注意,当用于在
ui视图中绘制时,路径将垂直翻转

弧长为
2*M\u PI*decimalInput
。需要将弧长添加到起始角度,如下所示:

let circleCenter = CGPointMake(100, 100)
let circleRadius = CGFloat(80)
var decimalInput = 0.75
let start = CGFloat(3 * M_PI_2)
let end = start + CGFloat(2 * M_PI * decimalInput)
let circlePath = UIBezierPath(arcCenter: circleCenter, radius: circleRadius, startAngle: start, endAngle: end, clockwise: true)
XCPCaptureValue("path", circlePath)
结果:


请注意,在
ui视图中绘制时,路径将垂直翻转。您可以使用此扩展来绘制部分圆

extension UIBezierPath {
    func addCircle(center: CGPoint, radius: CGFloat, startAngle: Double, circlePercentage: Double) {
        let start = deg2rad(startAngle)
        let end = start + CGFloat(2 * Double.pi * circlePercentage)
        addArc(withCenter: center,
               radius: radius,
               startAngle: start,
               endAngle: end,
               clockwise: true)
    }

    private func deg2rad(_ number: Double) -> CGFloat {
        return CGFloat(number * Double.pi / 180)
    }
}

用法示例(您可以将其复制粘贴到游乐场以查看结果)


可以使用此扩展来绘制部分圆

extension UIBezierPath {
    func addCircle(center: CGPoint, radius: CGFloat, startAngle: Double, circlePercentage: Double) {
        let start = deg2rad(startAngle)
        let end = start + CGFloat(2 * Double.pi * circlePercentage)
        addArc(withCenter: center,
               radius: radius,
               startAngle: start,
               endAngle: end,
               clockwise: true)
    }

    private func deg2rad(_ number: Double) -> CGFloat {
        return CGFloat(number * Double.pi / 180)
    }
}

用法示例(您可以将其复制粘贴到游乐场以查看结果)