根据对象数计算对象的位置

时间:2013-11-07 19:09:25

标签: math lua

我有一个简单的问题,但我很难找到一个优雅的解决方案。

假设我的应用程序显示了一副牌。每次我画一张卡片时,我都希望将它显示在屏幕的中央。当我画一张新卡时,我想在前一张卡旁边显示该卡,并且两张卡都居中。

更具体地说,如果我的代码有以下变量和表

N =总牌数。假设N在1到10之间。

W =以像素为单位分隔每张卡的宽度。例如30px

C =屏幕宽度/ 2(屏幕的中心x值)

P = {} - 表示卡的位置及其新的X值。 P [1]将是第一张牌的x值。

我想要一个公式,这样我就可以运行循环并计算每张卡的新X值。

这是我的预期输出

N = 1,P [1] = C.如果只有1张卡,则该卡的x值为中心

N = 2,P [1] = C - W / 2,P [2] = C + W / 2

N = 3,P [1] = C - W,P [2] = C,P [3] = C + W

N = 4,P [1] = C - 3/2 * W,P [2] = C - 1/2 * W,P [3] = C + 1/2 * W,P [4] = C + 3/2 * W

所以我需要一个循环,以编程方式为我计算。不知道怎么做。

2 个答案:

答案 0 :(得分:1)

这个公式可以解决问题:

P[k] = C + W * (k - 1 - (N - 1) / 2)

其中k = 1,2,...,N是卡的编号。

各种案例是:

N = 1  => P[k] = C + W * (k - 1)  
       => P[1] = C

N = 2  => P[k] = C + W * (k - 1 - 1/2)  
       => P[1] = C - W/2,  P[2] = C + W/2

N = 3  => P[k] = C + W * (k - 1 - 1)  
       => P[1] = C - W,  P[2] = C,   P[3] = C + W

N = 4  => P[k] = C + W * (k - 1 - 3/2)  
       => P[1] = C - 3W/2,  P[2] = C - W/2,   P[3] = C + W/2,   P[4] = C + 3W/2

...

您可以将公式包装在一个漂亮的函数中,就像在下面的测试程序中一样,它会产生或多或少相同的上述方案:

local C = 10
local W = 20


local function CardPosition( k, N )
    return C + W * (k - 1 - (N - 1) / 2)
end

for N = 1, 5 do
    io.write( "N = ", N, " => P[k] = ", 
        C, " + ", W, " * (k - 1 - ", N - 1, "/2) \n" )
    io.write "      => "
    for k = 1, N do
        io.write( "P[", k,"] = ", CardPosition(k, N), ",  " )
    end
    io.write "\n\n"
end

答案 1 :(得分:0)

在您描述的情况下,您可以轻松发现P [1] = C - (N-1)/ 2 * W.这通常是正确的,因为总宽度随着卡的数量线性增加。 其他卡的位置可以通过以下表达式计算:P [x] = P [x-1] + W。