Лучший способ рисовать иконки в круговом (или круговом) меню?

Я пытаюсь найти алгоритм для расчета места размещения любого количества значков для круглого меню на устройстве с экраном размером 240x320. Значки имеют размер 48x48, но их можно масштабировать до любого размера. Я хотел бы придумать общий алгоритм, который будет принимать любое количество значков любого размера и вычислять для них оптимальный масштаб и наилучшее размещение (т.е. радиус и делитель радиана).

В настоящее время мой код выглядит так:

int iconWidth = icon.Width;//this is a poor approximation.
int radius = iconWidth + iconWidth / 2;//defines spacing between square icons
double factor = ((2 * Math.PI) / menuEntries.Count);

//transition is a value that describes the animation curve for the menu
float transitionOffsetR = (float)Math.Pow(TransitionPosition, 2) * radius;
float transitionOffsetP = (float)Math.Pow(TransitionPosition, 2) * (float)factor;

// menuEntries is a collection of objects that describe the menu items
// it has fields like icon and title and callback, things like that.
foreach (MenuEntry entry in menuEntries.Values)
{
    int i = menuEntries.IndexOfValue(entry);

    iconPos.X = ((float)radius - transitionOffsetR) *
                 (float)Math.Cos((factor - transitionOffsetP) * i + 1);
    iconPos.Y = ((float)radius - transitionOffsetR) *
                 (float)Math.Sin((factor - transitionOffsetP) * i + 1);

    Vector2 finalPos = Vector2.Add(iconPos, origin);

    entry.Draw(this, finalPos, isSelected, worldTime, TransitionPosition);
}

Здесь происходит следующее: сначала я вычисляю ширину значков и делаю некоторые математические расчеты, чтобы найти разумный радиус и коэффициент. затем, используя значение TransitionPosition, полученное от вызывающей стороны этого метода, я изменяю как радиус, так и делитель для вычисления значений X и Y положения значка. Добавляя iconPos и ​​origin вместе (где origin - координата (screen.Width/2, screen.Height/2)), я получаю правильную конечную позицию в мировых координатах.

Я также планирую нарисовать его в виде графика, похожего на circo или twopi из пакета graphviz.

Любые вопросы или проблемы, пожалуйста, дайте мне знать.

Спасибо!

2 ответа

Решение

Многие ресурсы по круговым меню, включая различные реализации, можно найти в Pie Menu Central.

Другая ссылка, более свежая, но ориентированная на какао и основанная на тексте, - это JMPieMenu.

Возможно, стоит попробовать одну из доступных бесплатных графических библиотек. Я мог бы предложить этот, но есть много хороших.

Таким образом, вы могли бы сосредоточиться на бизнес-логике и не беспокоиться о повторном изобретении колеса с графической функциональностью.

Другие вопросы по тегам