触发,放置物品并更新其位置

时间:2019-05-16 20:44:44

标签: lua cairo

我有一个我无法解决的问题,一个星期后,这真的使我崩溃了。

背景。

我正在使用基本触发功能将物品放到圆上。项目的数量可以动态更改,并且它们在圆周上等距分布。

项目绕圆旋转,并且旋转速度更改为与BPM(每分钟节拍)时钟同步。该时钟可以随时更改。

我遇到的问题是项目似乎随机放置在圆上,而不是均匀分布(请参见图1)。即使这是放置它们的基本for循环,它们也会出现乱序。我认为它们可能在表面上是有序的,但是旋转值可能会偏离,使它们看起来像是处于奇数阶。

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 :(得分:0)

让我们仔细看一下图。

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.cosmath.sin的参数(我将忽略随后的缩放和转换):

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

所以...它是neRotationValue转换为弧度并添加到音符之间的空格。这个定义为360 / number_of_notes,因此以度为单位。添加弧度和度很可能不会产生预期的结果。

那么,您对以下内容的确切含义是什么?

  

我尝试了没有图形输出的简化版本,数字似乎都是很合理的。