Я рисую профили высот, показывающие выигрыш / убыток по трассе, аналогичный приведенному ниже:
Образец профиля высоты с размещенными вручную метками http://img38.imageshack.us/img38/4079/profilewithgoodlabels.png
Это в основном линейный график с расстоянием от начала по оси X и высотой по оси Y.
Я хотел бы предоставить необычные метки с точечными отметками в интересных точках вдоль трассы, подобно тем, которые я добавил вручную к образцу изображения. Я ищу идеи о том, как лучше разместить эти ярлыки, чтобы:
- Они не пересекаются друг с другом
- Они не пересекаются с самим профилем, или, по крайней мере, это происходит чисто на вид (кажется, что это может быть необходимо в середине крутой долины, например)
- Они не выходят за рамки, ограничивающие общее изображение
Для достижения этих целей я полагаю (по крайней мере):
- Перевернуть текст (см. Пример)
- Выберите подходящую длину для лидеров
- Выберите подходящие углы для лидеров (но минимизация отклонения может быть желательна по эстетическим соображениям)
- Высотные отметки для менее важных мест в людных местах
- Сокращайте названия в многолюдных местах (
PlaceName
s в моей среде уже поддерживают аббревиатуру действительно хорошим способом, поэтому переключение с "South Twin Mountain" на "S Twin Mtn" легко)
- Оставляйте менее важные аннотации полностью в людных местах
Но я не знаю, как лучше структурировать этот алгоритм. Может быть, это проблема оптимизации? (Сведите к минимуму вонючность, связанную с аннотацией, и предоставьте числовое наказание за каждую из вещей, которые я пытаюсь избежать?) Но поскольку существует множество дискретных переменных, которые нужно оптимизировать, и меня не волнуют «лучшие» решение (просто хорошее и желательно стабильное) Я не уверен, что делать.
Как обычно решаются такие проблемы в графике? Динамическое программирование? Ветвь и связанный? Идея оптимизации вне базы? Есть ли какие-нибудь полезные библиотеки для .NET, которые я хотел бы посмотреть?
(Я не хочу сразу уступать это общей библиотеке для рисования графиков, потому что это ключевая особенность всего продукта, и у меня запланировано еще несколько пользовательских функций, которые может быть сложно встроить в граф общего назначения. библиотека)