Верхняя граница функции генерации полярных координат не равна 2Pi для тета? - PullRequest
0 голосов
/ 12 октября 2018

Итак, я написал следующую функцию, чтобы взять фрейм и функцию полярной координаты и отобразить ее, генерируя декартовы координаты в этом фрейме.Вот код.

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), которая выглядит следующим образом. Graph of the polar function

Мне интересно, почему мойФункция возвращает следующее, когда тета переходит от 0 до 2. (Обратите внимание, что я на этом рисунке рисую цветы разных размеров, следовательно, повторение рисунка) Partial graph of the function

Как видите, это неправильно.Странно то, что, когда тета переходит от 0 до 2Pi * 100 (также работает для других случайных значений, таких как 2Pi * 4, 2Pi * 20, но не для 2Pi * 2 или 2Pi * 10), это работает, и я получаю это. Correct graph

Почему это?Домен не от 0 до 2Pi?Я заметил, что при переходе к 2Pi * 100 он перерисовывает некоторые лепестки, так что есть предел, но что это?

PS: Точность здесь составляет 0,01 (достаточно, чтобы действовать как непрерывная).На моих изображениях я рисую функцию в разных размерах и внахлест (на последнем изображении 2 внутренних цветка).

1 Ответ

0 голосов
/ 12 октября 2018

Нет, домен не будет 2π.Настройте код для рисования медленно, занимая 2 секунды на каждые 2π, и смотрите.Это делает целую серию полных кругов, и каждый раз локальные максимумы и минимумы приземляются в разных точках.Вот какие у тебя лепестки.Похоже, ваша формула повторяется после 8π.

Похоже, период является знаменателем тета-коэффициента * 2π.Ваш тета-коэффициент равен 9/4, знаменатель равен 4, поэтому коэффициент равен 4 * 2π или 8π.

(Это основано на игре в Wolfram Alpha и наблюдении за результатами. Я могу ошибаться.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...