Grapher - 我的 Rbx.Lua 脚本有什么问题?

Grapher - What is wrong with my Rbx.Lua Script?

我有 Lua 的 Roblox 版本的脚本。 Roblox 的语法检查系统说我的脚本没有问题。该脚本应该使用 'Parts' 或 'Bricks' 创建一个圆图。下面是我从中获取图形函数的维基页面。

我认为bounds.from是砖块的当前位置; bounds.to是下一块砖的下一个计算位置; bounds.step 是正在采取的步骤的计数器 - 这意味着您可以更改图表的分辨率(例如 1,000 点或 10,000 点)

Wiki page for graph function. The 'Making a Grapher' is what I used.

local p = Instance.new("Part")
p.Anchored      = true
p.BottomSurface = "Smooth"
p.TopSurface    = "Smooth"
p.BrickColor    = BrickColor.Black()
p.FormFactor    = "Custom"
p.Size          = Vector3.new(1, 1, 1)

function graph(bounds, f)
    bounds.step = bounds.step or (bounds.max - bounds.min) / bounds.n
    for t = bounds.from, bounds.to, bounds.step do
        local xyz = f(t)
        local p = p.clone()
        p.CFrame = CFrame.new(xyz)
        p.Parent = game.Workspace
    end
end

graph({from = 0, to = math.pi * 12, n = 1000}, function(t)
    return Vector3.new(
        5 * math.cos(t),
        5 * math.sin(t),
        0
    )
end)

PS: 我在学代数 1,所以我不知道正弦、余弦和切线,也不知道参数方程。

最初查看代码时,我发现了很多语法错误,所以我查看了 Roblox Wiki 上的代码,惊讶地发现您提供的代码与他们的代码相匹配。

抛开 Roblox Wiki 正在维护损坏的代码这一事实,让我们来看看为什么您的代码无法正常工作,以及您可以采取哪些措施来修复它。

我将从您遇到的问题开始,该问题源自语句 bounds.step = bounds.step or (bounds.max - bounds.min) / bounds.n
(由于 Lua 的工作原理,解释器将其读作 (bounds[max] - bounds[min]) / bounds.n,因为 table.valuetable[value] 的语法糖,我们从未定义 bounds.maxbounds.min,这就是您收到错误的原因。)

评估该表达式的正确方法是使用显式参数调用 math.max()math.min(),如下所示:(math.max(bounds.from, bounds.to) - math.min(bounds.from, bounds.to)) / bounds.n,因为它们都没有被编码为用作方法,并且无论如何只能将 integers/floats 作为参数;表格是不允许的, return 一个错误。

我注意到的第二个错误,也是在解决上述问题后会出现的错误,是为了克隆模板部分(在全局范围内定义为 local p),原始代码的作者使用p.clone(),实际上 return 是这个错误:01:49:37.933 - Expected ':' not '.' calling member function clone

针对此错误的 returned 响应非常自我描述,但我还是要说:为了修复此错误,只需将 local p = p.clone() 替换为 local p = p:clone()在图形函数中。

如果解释太混乱,或者您只是不想阅读它,我在下面提供了固定代码(完整)。

编码愉快。


TL;DR,或固定代码:

local p = Instance.new("Part")
p.Anchored      = true
p.BottomSurface = "Smooth"
p.TopSurface    = "Smooth"
p.BrickColor    = BrickColor.Black()
p.FormFactor    = "Custom"
p.Size          = Vector3.new(1, 1, 1)

function graph(bounds, f)
    bounds.step = bounds.step or (math.max(bounds.from, bounds.to) - math.min(bounds.from, bounds.to)) / bounds.n
    for t = bounds.from, bounds.to, bounds.step do
        local xyz = f(t)
        local p = p:clone()
        p.CFrame = CFrame.new(xyz)
        p.Parent = game.Workspace
    end
end

graph({from = 0, to = math.pi * 12, n = 1000}, function(t)
    return Vector3.new(
        5 * math.cos(t),
        5 * math.sin(t),
        0
    )
end)