gpt4 book ai didi

lua - 成对返回值的函数,其中一些最终为零

转载 作者:行者123 更新时间:2023-12-01 09:51:21 24 4
gpt4 key购买 nike

我尝试创建一个函数来计算圆之间的交点:一个圆与圆列表的交点。

对于每种情况,都有 0,1 或 2 个交点。

我希望函数返回 nil,nil 代表 0 分,z0,nil 代表 1 和 z1,z2 代表 2 分。我想通过循环逐渐将成对的结果收集到一个表中,并在最后解压它,但是一个表不会取 nil 值。

我暂时试过了。我怎样才能实现我想要的?

function InterSection_Cercles (Ca , ... )

local C = table.pack( ... )
local d, CosTheta, Theta, i
local t = {}

for i = 1, C.n do

d = complex.abs ( Ca.Ct - C[i].Ct )

CosTheta = round (((Ca.Ry * Ca.Ry + d * d - C[i].Ry * C[i].Ry) /( 2 * Ca.Ry * d )) , 10 )

Theta = round ( math.acos( CosTheta ) , Prec)

if not Theta then -- 0 solution
-- table.insert( t , nil ) useless
-- table.insert( t , nil )
elseif Theta == 0 then -- 1 solution
table.insert( t , Ca.Ct + complex.polar (Ca.Ry , Theta + complex.arg (C[i].Ct -Ca.Ct)))
-- table.insert( t , nil ) useless
else -- 2 solitions
table.insert( t , Ca.Ct + complex.polar (Ca.Ry , Theta + complex.arg (C[i].Ct -Ca.Ct)))
table.insert( t , Ca.Ct + complex.polar (Ca.Ry , -Theta + complex.arg (C[i].Ct -Ca.Ct)))
end -- if

end -- for

return table.unpack ( t )

end -- function

最佳答案

没有办法在 Lua 中构建包含 nil 值的数组。 Lua 中的数组被定义为来自 [1, n] 的表中的序列,其中没有 nil 值。

您可以插入一个占位符值 (false),或者您必须手动跟踪表格的大小。因此,与其调用 table.insert,不如创建一个新函数,以某个值存储表的长度:

local function manualInsert(tbl, val)
if(not tbl.n) then tbl.n = 0 end --all values are assumed to be inserted through this function.
tbl[tbl.n + 1] = val
tbl.n = tbl.n + 1
end

通常,tbl 不能与处理数组的标准 Lua 机制一起使用。您不能对其调用 # 以获得正确的长度,因此迭代它很困难,除非您知道它很特殊。删除元素需要它自己的特殊函数,等等。

但是,您可以使用元表和元方法来使使用这种伪数组看起来更实用。例如,在 Lua 5.2+ 中,您可以覆盖 __len 元方法以返回 n。这将允许您使用 for i = 1, #tbl do 来迭代元素。它还允许 table.unpack 在不手动传递长度的情况下工作,因为如果您不提供它,它被定义为使用 # 获取长度。

请注意,虽然 Lua 5.1 确实允许使用 __len 元方法,但它不允许 table 覆盖默认长度计算。仅使用 userdata 的 __len 元方法。

在 Lua 5.2 中,您可以覆盖 __ipairs 元方法以使 ipairs 工作。在 Lua 5.3 中,这已被弃用; ipairs 依赖于标准元方法。这可能是可行的,但文档说 ipairs 将继续“达到第一个 nil 值”。所以这在 Lua 5.3 中可能是不可能的。

因此,除非您使用的是 Lua 5.2 或更高版本,否则 manualInsert 将创建一个非常不正常的表。

关于lua - 成对返回值的函数,其中一些最终为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37148773/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com