Умные алгоритмы размещения меток круговой диаграммы? - PullRequest
4 голосов
/ 29 июля 2010

Я создаю библиотеку пользовательских диаграмм для своей компании.У меня возникают проблемы с поиском / изобретением хорошего алгоритма размещения меток диаграммы, чтобы были выполнены следующие требования:

  • Метки не должны перекрываться
  • Метки должны оставаться как можно ближек соответствующему срезу
  • Если метка должна быть удалена от своего среза, она должна предпочтительно идти в радиальном направлении наружу.

Чтобы было ясно, это довольно хорошо в моемкнига:

http://betterdashboards.files.wordpress.com/2009/02/piechartpercentagelabel1a.png

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 29 июля 2010

Я предполагаю, что вы используете стек MS .net.Если это так, а не изобретать велосипед, вы можете использовать библиотеку MS Charts, предоставленную Microsoft.Таким образом, нет ничего плохого в создании библиотеки, но с таким краевым случаем потребуется некоторое время, чтобы сделать ее идеальной, в то время как библиотека диаграмм MS более или менее стабильна и работает довольно хорошо.

http://www.microsoft.com/downloads/details.aspx?FamilyID=130f7986-bf49-4fe5-9ca8-910ae6ea442c&displaylang=en

Сгенерированные им круговые диаграммы довольно хороши.Для вашей маркировки у него есть опция под названием smart label, которая размещает этикетку довольно аккуратно, без каких-либо совпадений.

PS В загрузках вы найдете все образцы.

2 голосов
/ 29 июля 2010

В образце изображения нет теста столкновения (т. Е. Метки могут перекрываться). Таким образом, алгоритм довольно прост:

  • Существует первая строка , которая начинается от центра части пирога в направлении, противоположном центру пирога. Эта первая строка имеет фиксированную длину.
  • Вторая строка является горизонтальной (также с фиксированной длиной) и идет влево или вправо в соответствии с углом первой строки,
  • Следует за текстом, который выровнен по левому или правому краю, также в соответствии с углом наклона первой строки.

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

Чтобы избежать этого, вы можете проверить наличие столкновений, т.е. посмотреть, если две горизонтальные линии находятся слишком близко , а затем изменить угол первой линии (или, возможно, углы первых линий в двух ближайших круговых частях) до горизонтальных линий достаточно далеко.

...