首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >两点间的正弦波UIBezierPath

两点间的正弦波UIBezierPath
EN

Stack Overflow用户
提问于 2017-01-26 01:51:07
回答 2查看 1.1K关注 0票数 1

如何在两点之间创建一个正弦波的路径?

我可以从原点创建一个正弦波的路径,但不确定如何转换方向,以便正弦波在目标CGPoint处结束。

我想使用SKAction.followPath沿路径对SKNode进行动画处理

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-26 02:25:22

考虑这一点的最简单方法是变换坐标系,按两点之间的角度旋转,按两点之间的距离缩放,并按第一个点平移(假设正弦从0,0开始)。

OP指定他不仅要绘制曲线(在这种情况下,所有人需要做的就是将转换应用于图形上下文),而是要在SpriteKit SKAction.followPath调用中使用曲线,因此转换必须应用于路径中的坐标,而不是上下文。

这是一个使用CGPath而不是UIBezierPath的解决方案,但它们是等效的,您可以通过let uip = UIBezierPath(cgPath: path)简单地获取UI版本。(我更喜欢CoreGraphics,因为它们是跨平台的)。

操场代码..。

代码语言:javascript
复制
class MyView: UIView {

    override func draw(_ rect: CGRect) {
        guard let context = UIGraphicsGetCurrentContext() else { return }

        context.setFillColor(UIColor.red.cgColor)
        context.fill(self.bounds)

        // Calculate the transform
        let p1 = CGPoint(x: 100, y: 100)
        let p2 = CGPoint(x: 400, y: 400)
        let dx = p2.x - p1.x
        let dy = p2.y - p1.y
        let d = sqrt(dx * dx + dy * dy)
        let a = atan2(dy, dx)
        let cosa = cos(a) // Calculate only once...
        let sina = sin(a) // Ditto

        // Initialise our path
        let path = CGMutablePath()
        path.move(to: p1)

        // Plot a parametric function with 100 points
        let nPoints = 100
        for t in 0 ... nPoints {
            // Calculate the un-transformed x,y
            let tx = CGFloat(t) / CGFloat(nPoints) // 0 ... 1
            let ty = 0.1 * sin(tx * 2 * CGFloat.pi ) // 0 ... 2π, arbitrary amplitude
            // Apply the transform
            let x = p1.x + d * (tx * cosa - ty * sina)
            let y = p1.y + d * (tx * sina + ty * cosa)
            // Add the transformed point to the path
            path.addLine(to: CGPoint(x: x, y: y))
        }

        // Draw the path
        context.setStrokeColor(UIColor.blue.cgColor)
        context.addPath(path)
        context.strokePath()
    }
}

let v = MyView(frame: CGRect(origin: CGPoint(x: 0, y:0), size: CGSize(width: 500, height: 500)))

票数 4
EN

Stack Overflow用户

发布于 2017-01-26 02:32:52

不是很清楚你想要什么,但这里有一种可能性,假设你想要一个倾斜的罪过曲线:

假设起点是(0,0),终点是(x,y)。

设L为原点与点之间的距离:l= sqrt(x^2 + y^2)

编写一个从0开始到L结束的循环,递增dL和运行和l(最终运行在0和L之间)。这个循环将允许我们在您的Bezier上创建点。

那么sin图的x坐标将是: x_P =l* cos(theta),范围从0到L* cos(theta) =x

为了得到y坐标,我们在原点和点之间的斜线上添加一个具有正确周期的正弦函数: y_P =l* sin (θ)+ sin(2 * PI *l/ L)

请注意,在L =L处,(x_P,y_P) = (x,y),这是它应该是的。

这是你想要的吗?它不是旋转,所以当角度θ很大时,它不会表现出来。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41858284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档