Увеличьте длину массива на значение. А затем используйте средние, чтобы заполнить пятна, чтобы создать эффект сглаживания - PullRequest
0 голосов
/ 20 марта 2020

Трудно объяснить в заголовке, но я пытаюсь расширить массив на определенное кратное число путем вычисления среднего значения точек в массиве. Это не так уж сложно увеличить на 2, но я изо всех сил пытаюсь расширить его с помощью пользовательского множителя.

Пример:

let x = [3, 6, 7]

extension (массив: x, множитель: 3) ~~ Должно быть [ 3 , 4.5, 5.25, 6 , 6.5, 6.75, 7 ]

Таким образом, первое промежуточное значение является средним значением (3,6), а следующее - средним значением (4,5, 6), затем вы переходите к следующему значению и и так далее.

func extend(data: [Double], multiplier: Int) -> [Double] {
    var new = [Double]()
    var x = 0
    for i in 0..<(array.count*multiplier) {
        let value = data[x]
        new.append(value)

        if(data.count <= (x+1)) { break }

        let next = data[x+1]
        let mean = (value+next)/2
        new.append(mean)

        if(i%multiplier == 0 && i != 0) { x += 1 }
    }
    return new
}

Ответы [ 2 ]

0 голосов
/ 20 марта 2020

Поскольку вы увеличиваете только первое originalArray.count-1, нам нужно только l oop через них.

func extend(data: [Double], multiplier: Int) -> [Double] {
    var newData:[Double] = []
    for i in 0 ..< data.count-1 {
        let currentOriginalValue = data[i]
        let nextOriginalValue = data[i+1]
        let newValues = findHalfwayValues(firstVal: currentOriginalValue, secondVal: nextOriginalValue, times: multiplier-1)
        newData += [currentOriginalValue] + newValues
    }
    newData.append(data[data.count-1])
    return newData
}

func findHalfwayValues(firstVal:Double, secondVal:Double, times:Int) -> [Double] {
    var newData:[Double] = []
    var originalVal = firstVal
    for i in 0 ..< times {
        let halfway = findHalfway(firstVal: originalVal, secondVal: secondVal)
        newData.append(halfway)
        originalVal = halfway
    }
    return newData
}

func findHalfway(firstVal:Double, secondVal:Double) -> Double {
    return (firstVal+secondVal)/2
}

print(extend(data: [3, 6, 7], multiplier: 3)) // [3.0, 4.5, 5.25, 6.0, 6.5, 6.75, 7.0]

Вот еще одно решение. Кроме того, в решении @ Nick есть небольшая ошибка, которая делает на 1 итерацию больше, чем следует. В противном случае, похоже, работает

0 голосов
/ 20 марта 2020

Решено:

func extend(data: [Double], amount: Int) -> [Double] {
    var new = [Double]()

    for i in 0..<data.count {
        let value = data[i]
        new.append(value)

        if(data.count<=i+1) { break }

        let next = data[i+1]

        var means = [Double]()
        for z in 0..<amount {
            if(z==0) {
                let mean = (value + next)/2
                means.append(mean)
            } else {
                let mean = (means[z-1] + next)/2
                means.append(mean)
            }
        }
        for m in means {
            new.append(m)
        }
    }
    return new
}
...