首页 > 解决方案 > 触发、放置物品并更新它们的位置

问题描述

我有一个我无法解决的问题,一周后它真的让我很沮丧。

背景。

我正在使用基本触发器将项目放在一个圆圈上。项目的数量可以动态变化,并且它们围绕圆圈均匀分布。

项目围绕圆圈旋转,旋转速度改变为与 BPM(每分钟节拍数)时钟同步。这个时钟可以随时更改。

我遇到的问题是这些项目似乎是随机放置在圆圈上的,而不是按顺序排列的(见图 1)。即使放置它们的是基本的 for 循环,它们也会出现乱序。我认为它们可能在表面上是有序的,但旋转值可能会偏离,使它们看起来像是在一个奇怪的顺序。

图 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

我希望这些项目是:

我迷路了!

标签: luacairo

解决方案


让我们仔细看看这幅画。

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.cosand的参数math.sin(我将忽略之后应用的缩放和平移):

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

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

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

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


推荐阅读