2015-04-14 2 views
0

У меня есть список объектов, которые образуют математический набор. Поэтому я хочу, чтобы отобразить их в эллипс, как это:случайное расположение элементов в эллипсе

set with 5 objects

Если я затем добавить новый объект, эллипс должен расти и шестой элемент должен быть размещен внутри эллипса.

Я думал, что смогу решить эту проблему с помощью итерации. На первом месте object1 и Название набора и нарисуйте эллипс. Затем добавьте object2 и позвольте эллипсу расти и так далее. Но я уже изо всех сил пытался найти правильное решение для расположения первого шага, не говоря уже о росте эллипса на втором шаге. Моя проблема с первым шагом заключается в том, что эллипс должен быть меньше, когда Название набора и object1 имеет небольшое строковое представление. И эллипс должен быть больше, если Название набора и object1 имеют более длинное строковое представление.

Или я попал куда-то по неправильному пути? Возможно, для этой проблемы уже существует (рамочное?) Решение, которое я пропускаю.

+0

Чтобы мы все думали в одном направлении, можете ли вы опубликовать несколько подробностей о вашей текущей реализации? Вы работаете с шаблоном view/codebehind? MVVM? Любые рамки (MVVM Light/Caliburn/etc.)? – goobering

+0

Я работаю со слегка принятым MVP. С его wpf он также является xaml с кодом. Никаких других фреймворков, кроме .NET. Но я не вижу, что вам нужна эта информация для?!? –

+0

Реализация этой проблемы MVVM существенно отличается от реализации view/codebehind. Вы получите очень разные решения для кода, размещенные для каждого. Можете ли вы опубликовать образец того, как вы добавляете и удаляете объекты в эллипс? – goobering

ответ

0

Создать целочисленное свойство, которое называется MyCount. Создать целочисленные константы OriginalWidth и OriginalHeight. Создать целочисленные переменные ScaledWidth и ScaledHeight.

Когда ваш набор создан, добавьте mySet.Name.Count() в MyCount.

При добавлении объекта добавьте myObject.SomeProperty.ToString().Count() в MyCount.

При удалении объекта вычтите myObject.SomeProperty.ToString().Count() от MyCount.

Когда MyCount изменяется, пересчитывать ScaledWidth и ScaledHeight - что-то вроде ScaledWidth = OriginalWidth * (MyCount * [insert number here])

Для того, чтобы сохранить ваш эллипс в правильной перспективе ваша высота эллипса и ширина будет основываться на постоянных значений, умноженных на коэффициент масштабирования, который MyCount. Вам нужно 4 целочисленных значения: OriginalWidth, OriginalHeight, ScaledWidth и ScaledHeight. OriginalWidth и OriginalHeight - это целые константы, определяющие минимальную ширину и высоту вашего эллипса. ScaledWidth и ScaledHeight - это целые переменные, к которым привязаны свойства Height и Width Ellipse.

Каждый раз, когда новый объект добавляется или удаляется в/из вашего набора, количество символов в его SomeProperty добавляется к MyCount. Каждый раз, когда MyCount изменяет, он вызывает пересчет ScaledWidth и ScaledHeight. Связывание свойств ширины и высоты Ellipse с ScaledWidth и ScaledHeight и реализация INotifyPropertyChanged по этим свойствам должны соответствующим образом масштабировать ваш эллипс.

UPDATE

Алгоритм размещен здесь: http://programming.nullanswer.com/forum/11925, казалось бы решить размещение ваших дочерних элементов в пределах вашего родительского эллипса.Я заменил эллипс для квадрата/круга, где это необходимо:

Выберите случайную точку внутри [родительского эллипса] & экземпляр [очень низкая ширина/высота эллипса] в этой точке. Grow радиус этого эллипса [], пока она не удовлетворяет этим критериям:

  • не перекрывает любой из других выбрали [эллипсы].
  • не распространяется за пределы [родительский эллипс].

Выберите [эллипс], если он удовлетворяет этим критериям.

+0

Хорошо. Пока что для масштабирования эллипса. У вас также есть хорошая рекомендация для случайного расположения объектов внутри эллипса? –

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