我有一个我无法解决的问题,一个星期后,这真的使我崩溃了。
背景。
我正在使用基本触发功能将物品放到圆上。项目的数量可以动态更改,并且它们在圆周上等距分布。
项目绕圆旋转,并且旋转速度更改为与BPM(每分钟节拍)时钟同步。该时钟可以随时更改。
我遇到的问题是项目似乎随机放置在圆上,而不是均匀分布(请参见图1)。即使这是放置它们的基本for循环,它们也会出现乱序。我认为它们可能在表面上是有序的,但是旋转值可能会偏离,使它们看起来像是处于奇数阶。
第二个问题是,当物品数量减少时,旋转速度增加(不应该),而如果物品数量增加,则速度变慢。
所以我期望触发功能出现问题。我在这里显示了完整的代码,但是如果有帮助的话,可以简化。
我尝试了什么?
我尝试了没有图形输出的简化版本,数字似乎都是很合理的。项目之间的弧度正确,放置看起来正确。看起来都正确,但事实并非如此。
代码。
--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
我希望这些物品是:
我迷路了!
答案 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.cos
和math.sin
的参数(我将忽略随后的缩放和转换):
math.rad(orbitalCircle.newRotationValue)+(orbitalCircle.spaceBetweenNotes*i)
所以...它是neRotationValue
转换为弧度并添加到音符之间的空格。这个定义为360 / number_of_notes
,因此以度为单位。添加弧度和度很可能不会产生预期的结果。
那么,您对以下内容的确切含义是什么?
我尝试了没有图形输出的简化版本,数字似乎都是很合理的。