lua - 触发、放置物品并更新它们的位置
问题描述
我有一个我无法解决的问题,一周后它真的让我很沮丧。
背景。
我正在使用基本触发器将项目放在一个圆圈上。项目的数量可以动态变化,并且它们围绕圆圈均匀分布。
项目围绕圆圈旋转,旋转速度改变为与 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
我希望这些项目是:
- 无论数量多少都等距(有效)
- 按顺序(他们似乎不是)
- 除非 BPM 发生变化,否则旋转速度应保持固定(这不会发生)
我迷路了!
解决方案
让我们仔细看看这幅画。
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
and的参数math.sin
(我将忽略之后应用的缩放和平移):
math.rad(orbitalCircle.newRotationValue)+(orbitalCircle.spaceBetweenNotes*i)
所以......它是neRotationValue
转换为弧度并添加到音符之间的空间。这个定义为360 / number_of_notes
,所以它是度数。添加弧度和度数很可能不会产生预期的结果。
那么,您对以下内容的确切含义是什么?
我尝试过没有图形输出的简化版本,这些数字似乎都很合理。
推荐阅读
- php - 根据 wp_usermeta 表新建 wp 数据表
- angular - 带有 i18n 的 Angular Universal SSR 未从服务器端加载语言环境
- api - 添加带有标签的子树
- javascript - 将属性名称与其在数组中的值匹配;
- python - 如何在不写入磁盘的情况下解压缩?
- python - Python:删除具有相同元素但顺序不同的列表
- python - 使用分解或分类将数字转换为因子有什么区别?
- python - 证书验证失败:证书已过期 (_ssl.c:1123),api.covid19api.com
- mysql - 为什么 LIMIT 1 在这种情况下会导致 MySQL 超时?
- amazon-web-services - 有没有其他方法可以在不使用 ELB 的情况下跨区域连接 VPC 端点?