Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.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
Ios 用Swift绘制正弦曲线_Ios_Swift_Xcode_Uibezierpath_Uipangesturerecognizer - Fatal编程技术网

Ios 用Swift绘制正弦曲线

Ios 用Swift绘制正弦曲线,ios,swift,xcode,uibezierpath,uipangesturerecognizer,Ios,Swift,Xcode,Uibezierpath,Uipangesturerecognizer,在我的Swift项目中,我应该使用平移手势检测用户的移动,并绘制如下正弦曲线。有没有什么图书馆可以画这个或者我可以用什么方法来实现它 这个正弦曲线也应该有控制点,在这里我可以动态地重塑它 您可以使用点、直线或曲线段绘制任何数学函数。正弦曲线特别容易,因为您可以非常容易地确定极值和其他感兴趣的点,以构造此类曲线的近似值 一种非常直接的绘制方法是这样的: class SinusoidalCurveView: UIView { var resolution: CGFloat? = n

在我的Swift项目中,我应该使用平移手势检测用户的移动,并绘制如下正弦曲线。有没有什么图书馆可以画这个或者我可以用什么方法来实现它

这个正弦曲线也应该有控制点,在这里我可以动态地重塑它


您可以使用点、直线或曲线段绘制任何数学函数。正弦曲线特别容易,因为您可以非常容易地确定极值和其他感兴趣的点,以构造此类曲线的近似值

一种非常直接的绘制方法是这样的:

class SinusoidalCurveView: UIView {
    
    var resolution: CGFloat? = nil { didSet { setNeedsDisplay() } }
    var function: (n: CGFloat, verticalScale: CGFloat, horizontalScale: CGFloat) = (100.0, 30.0, 30.0) { didSet { setNeedsDisplay() } }
    
    private func solveY(_ x: CGFloat) -> CGFloat {
        let n = function.n
        let h = function.verticalScale
        let m = function.horizontalScale
        return h*sin(x/m) + n
    }
    
    override func draw(_ rect: CGRect) {
        super.draw(rect)
        
        let resolutionStep: CGFloat = {
            if let resolution = resolution {
                return rect.width/resolution
            } else {
                return 1.0/self.layer.contentsScale
            }
        }()
        
        var x: CGFloat = 0.0
        let path = UIBezierPath()
        path.move(to: CGPoint(x: x, y: solveY(x)))
        while x < rect.width {
            x += resolutionStep
            path.addLine(to: CGPoint(x: x, y: solveY(x)))
        }
        
        path.stroke()
    }
    
}
没有添加控制点,因此pan上不会发生任何事情。但是,在视图中添加了平移手势识别器之后,添加此代码将使事情正常进行

private func getClosestPointOfInterest(to point: CGPoint) -> PointOfInterest? {
    // Do the math here
    return .extreme(at: .zero)
}
从现在开始,事情应该很简单。这是一点工作,但不应该太激烈。

请参阅本文。
private func getClosestPointOfInterest(to point: CGPoint) -> PointOfInterest? {
    // Do the math here
    return .extreme(at: .zero)
}