Триг, размещение предметов и обновление их позиции - PullRequest
0 голосов
/ 16 мая 2019

У меня есть проблема, которую я просто не могу решить, и через неделю это действительно заводит меня.

Фон.

Я помещаю предметы в круг, используя базовый триг. Количество предметов может изменяться динамически, и они равномерно распределены по кругу.

Элементы вращаются по кругу, и скорость вращения изменяется, чтобы быть синхронизированной с часами BPM (ударов в минуту). Эти часы могут измениться в любое время.

Проблема, с которой я сталкиваюсь, заключается в том, что предметы, кажется, располагаются случайным образом по кругу, а не на равном расстоянии друг от друга по порядку (см. Изображение 1). Они будут отображаться не по порядку, хотя это базовый цикл, который их размещает. Я думаю, что они могут быть в порядке, но значения поворота могут быть отключены, чтобы они выглядели как-то странно.

image 1

Вторая проблема заключается в том, что когда количество предметов уменьшается, скорость вращения увеличивается (не должно), а если число увеличивается, скорость замедляется.

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

Что я пробовал?

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

код.

--the variables
orbitalCircle.xPos = x or 0
orbitalCircle.yPos = y or 0
orbitalCircle.circleDiameter = diameter or 10
orbitalCircle.numberOfNotes = number_of_notes
orbitalCircle.spaceBetweenNotes = (360 / number_of_notes)
orbitalCircle.beatsPerSecond = (beats_per_minute / 60)
orbitalCircle.currentRotation = 0
orbitalCircle.framesPerSecond = frames_per_second or 15
orbitalCircle.framesPerFullRotation = (orbitalCircle.numberOfNotes/orbitalCircle.beatsPerSecond)+orbitalCircle.framesPerSecond
orbitalCircle.degreesPerFrame = 360 / orbitalCircle.framesPerFullRotation
orbitalCircle.newRotationValue = orbitalCircle.currentRotation + orbitalCircle.degreesPerFrame
orbitalCircle.sequenceData = sequence_data

--the function that updates the sequence data and therefore the number of items on the circle
function orbitalCircle.updateNotes(sq)
    orbitalCircle.sequenceData = sq
    orbitalCircle.numberOfNotes = (#sq)
    orbitalCircle.spaceBetweenNotes = (360 / orbitalCircle.numberOfNotes)
end

--the function that calculates the new rotation value of the item to be placed on the circle
    function orbitalCircle.tick()
        orbitalCircle.spaceBetweenNotes = (360 / number_of_notes)
        orbitalCircle.framesPerFullRotation = (orbitalCircle.numberOfNotes/orbitalCircle.beatsPerSecond)*orbitalCircle.framesPerSecond
        orbitalCircle.degreesPerFrame = (360 / orbitalCircle.framesPerFullRotation)
        orbitalCircle.newRotationValue = (orbitalCircle.currentRotation + orbitalCircle.degreesPerFrame)

        if orbitalCircle.newRotationValue > 360 then
            orbitalCircle.currentRotation = 0
        else
            orbitalCircle.currentRotation = orbitalCircle.newRotationValue
        end
    end

--finally the function that places the items onto the circle
    function orbitalCircle.redraw()
        screen.circle(orbitalCircle.xPos, orbitalCircle.yPos, orbitalCircle.circleDiameter)
        screen.stroke()
        for i=1, (#orbitalCircle.sequenceData) do
            if orbitalCircle.sequenceData[i] > 0 then
                    screen.circle(
                        math.cos(math.rad(orbitalCircle.newRotationValue)+(orbitalCircle.spaceBetweenNotes*i))*orbitalCircle.circleDiameter + orbitalCircle.xPos,
                        math.sin(math.rad(orbitalCircle.newRotationValue)+(orbitalCircle.spaceBetweenNotes*i))*orbitalCircle.circleDiameter + orbitalCircle.yPos,
                        map(orbitalCircle.sequenceData[i], 5, 128, 0.5, 4)
                    )
                end
            end
        end
    end

Я ожидаю, что предметы будут:

  • равное расстояние независимо от количества (которое работает)
  • по порядку (кажется, что нет)
  • скорость вращения должна оставаться фиксированной, если не изменяется BPM (этого не происходит)

Я потерян!

1 Ответ

0 голосов
/ 17 мая 2019

Давайте внимательнее посмотрим на рисунок.

screen.circle(
    math.cos(math.rad(orbitalCircle.newRotationValue)+(orbitalCircle.spaceBetweenNotes*i))*orbitalCircle.circleDiameter + orbitalCircle.xPos,
    math.sin(math.rad(orbitalCircle.newRotationValue)+(orbitalCircle.spaceBetweenNotes*i))*orbitalCircle.circleDiameter + orbitalCircle.yPos,
    map(orbitalCircle.sequenceData[i], 5, 128, 0.5, 4)
)

Какой угол здесь нарисован? Это аргумент math.cos и math.sin (я буду игнорировать масштабирование и перевод, который применяется позже):

math.rad(orbitalCircle.newRotationValue)+(orbitalCircle.spaceBetweenNotes*i)

Итак ... это neRotationValue, преобразованное в радианы и добавленное к этому пространство между нотами. Этот определяется как 360 / number_of_notes, так что это в градусах. Добавление радиан и градусов, скорее всего, не даст ожидаемого результата.

Итак, что именно вы имеете в виду под следующим?

Я пробовал упрощенные версии без графического вывода, и все цифры, кажется, имеют смысл.

...