所以我编写了下面的函数来获取一个帧,以及极坐标函数,并通过在该帧内生成笛卡尔坐标来绘制它。这是密码。
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)
它看起来是这样的。我在想,当θ从0变为2时,为什么我的函数会返回以下内容。(请注意,我在这张图片中画了不同大小的花,因此重复了图案)
正如你所看到的,这是错误的。奇怪的是,当θ从0变为2Pi*100(也适用于其他随机值,如2Pi*4、2Pi*20,但不适用于2Pi*2或2Pi*10)时,它就会起作用,我就知道了。
这是为什么?域不是0到2Pi吗?我注意到当转到2Pi*100时,它会重绘一些花瓣,所以有一个限制,但它是什么?
注:这里的精度是0.01(足够让人觉得它是连续的)。在我的图像中,我正在绘制不同大小和重叠的函数(最后一个图像有两个内部花)。
最佳答案
不,域不是2π。把你的代码设置成慢慢画,每2π画2秒,然后观察。它产生了一系列完整的圆,并且每次局部最大值和最小值在不同的点上降落。那就是你的花瓣。看起来你的公式在8π之后重复。
看起来周期是θ系数*2π的分母。θ系数是9/4,分母是4,所以系数是4*2π,或者8π。
(这是基于玩Wolfram Alpha并观察结果。我可能错了。)