Лучший способ рисовать иконки в круговом (или круговом) меню?
Я пытаюсь найти алгоритм для расчета места размещения любого количества значков для круглого меню на устройстве с экраном размером 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.
Возможно, стоит попробовать одну из доступных бесплатных графических библиотек. Я мог бы предложить этот, но есть много хороших.
Таким образом, вы могли бы сосредоточиться на бизнес-логике и не беспокоиться о повторном изобретении колеса с графической функциональностью.