У меня есть проблема, которую я просто не могу решить, и через неделю это действительно заводит меня.
Фон.
Я помещаю предметы в круг, используя базовый триг. Количество предметов может изменяться динамически, и они равномерно распределены по кругу.
Элементы вращаются по кругу, и скорость вращения изменяется, чтобы быть синхронизированной с часами BPM (ударов в минуту). Эти часы могут измениться в любое время.
Проблема, с которой я сталкиваюсь, заключается в том, что предметы, кажется, располагаются случайным образом по кругу, а не на равном расстоянии друг от друга по порядку (см. Изображение 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 (этого не происходит)
Я потерян!