我有一个简单的问题,但我很难找到一个优雅的解决方案。
假设我的应用程序显示了一副牌。每次我画一张卡片时,我都希望将它显示在屏幕的中央。当我画一张新卡时,我想在前一张卡旁边显示该卡,并且两张卡都居中。
更具体地说,如果我的代码有以下变量和表
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
所以我需要一个循环,以编程方式为我计算。不知道怎么做。
答案 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。