2013-11-07 2 views
0

У меня есть простой вопрос, но мне трудно найти элегантное решение.Расчет позиции объекта по количеству объектов

Предположим, что в моем приложении отображается колода карт. Каждый раз, когда я рисую карту, я хочу отобразить ее в центре экрана. Когда я рисую новую карту, я хочу отобразить эту карту рядом с предыдущей, и обе они будут центрированы.

Так, более конкретно, если мой код имел следующие переменные и таблицы

N = общие карты играли. Предположим, что N находится между 1 и 10.

W = ширина для разделения каждой карты в пикселях. Например 30px

С = ширина экрана/2 (в центре х значение для экрана)

Р = {} - которая обозначает положение карты, и это новое значение Х. P [1] будет значением x для первой воспроизводимой карты.

Мне нужна формула, поэтому я могу запустить цикл и вычислить новое значение X для каждой карты.

Вот мой ожидаемый результат

N = 1, Р [1] = С. Если имеется только одна карта, то х значение этой карты будет центром

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

Поэтому мне нужен цикл, который программно вычисляет это для меня. Не знаете, как это сделать.

ответ

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 
+0

Эта отлично работает, и вы сначала ответили на него так спасибо –

0

Вы можете легко заметить, что P [1] = C - (N-1)/2 * W в описанных вами случаях. Это, как правило, верно, поскольку общая ширина увеличивается линейно с количеством карточек. позиции других карт может быть вычислена с помощью выражения: Р [х] = Р [х-1] + W

Смежные вопросы