所以我编写了下面的函数来获取一个帧,以及极坐标函数,并通过在该帧内生成笛卡尔坐标来绘制它。这是密码。

func cartesianCoordsForPolarFunc(frame: CGRect, thetaCoefficient:Double, cosScalar:Double, iPrecision:Double, largestScalar:Double) -> Array<CGPoint> {

    // Frame: The frame in which to fit this curve.
    // thetaCoefficient: The number to scale theta by in the cos.
    // cosScalar: The number to multiply the cos by.
    // largestScalar: Largest cosScalar used in this frame so that scaling is relative.
    // iPrecision: The step for continuity. 0 < iPrecision <= 2.pi. Defaults to 0.1

    // Clean inputs
    var precision:Double = 0.1 // Default precision
    if iPrecision != 0 {// Can't be 0.
        precision = iPrecision
    }

    // This is ther polar function
    // var theta: Double = 0 //  0 <= theta <= 2pi
    // let r = cosScalar * cos(thetaCoefficient * theta)

    var points:Array<CGPoint> = [] // We store the points here
    for theta in stride(from: 0, to: Double.pi * 2 , by: precision) { //TODO: Try to recreate continuity. WHY IS IT NOT 2PI
        let x = cosScalar * cos(thetaCoefficient * theta) * cos(theta) // Convert to cartesian
        let y = cosScalar * cos(thetaCoefficient * theta) * sin(theta) // Convert to cartesian

        // newvalue = (max'-min')/(max-min)*(value-max)+max'
        let scaled_x = (Double(frame.width) - 0)/(largestScalar*2)*(x-largestScalar)+Double(frame.width) // Scale to the frame
        let scaled_y = (Double(frame.height) - 0)/(largestScalar*2)*(y-largestScalar)+Double(frame.height) // Scale to the frame

        points.append(CGPoint(x: scaled_x, y:scaled_y)) // Add the result

    }
    print("Done points")

    return points
}

我要传递的极性函数是r = 100*cos(9/4*theta)它看起来是这样的。ios - 极坐标点生成函数的上界不是2Pi for theta吗?-LMLPHP
我在想,当θ从0变为2时,为什么我的函数会返回以下内容。(请注意,我在这张图片中画了不同大小的花,因此重复了图案)ios - 极坐标点生成函数的上界不是2Pi for theta吗?-LMLPHP
正如你所看到的,这是错误的。奇怪的是,当θ从0变为2Pi*100(也适用于其他随机值,如2Pi*4、2Pi*20,但不适用于2Pi*2或2Pi*10)时,它就会起作用,我就知道了。ios - 极坐标点生成函数的上界不是2Pi for theta吗?-LMLPHP
这是为什么?域不是0到2Pi吗?我注意到当转到2Pi*100时,它会重绘一些花瓣,所以有一个限制,但它是什么?
注:这里的精度是0.01(足够让人觉得它是连续的)。在我的图像中,我正在绘制不同大小和重叠的函数(最后一个图像有两个内部花)。

最佳答案

不,域不是2π。把你的代码设置成慢慢画,每2π画2秒,然后观察。它产生了一系列完整的圆,并且每次局部最大值和最小值在不同的点上降落。那就是你的花瓣。看起来你的公式在8π之后重复。
看起来周期是θ系数*2π的分母。θ系数是9/4,分母是4,所以系数是4*2π,或者8π。
(这是基于玩Wolfram Alpha并观察结果。我可能错了。)

10-07 23:13