Страницы

Поиск по вопросам

четверг, 9 апреля 2020 г.

Как отобразить сферу с объектами в WPF?

#c_sharp #wpf #xaml

                    
Есть лист объектов с угловыми координатами (широта, долгота). Как мне можно показать
их наглядно на форме? Пытался уже что то сделать с ViewPort3D, но там рисовать сферу
придется по точкам и нормалям, а значит будет детализация. 

Мне пока приходит в голову использовать ListBox с Canvas в качестве панели, где будет
отрисован круг, на котором будут отображены проекции объектов (то есть псевдо-сфера).
Для начала хочу просто отобразить сферу с меридианами, которую я смогу вращать. По
идее все должно получиться, но я даже не знаю с чего мне начать.

UPD:

Если буду использовать ListBox или Selector для возможности выделения элементов,
то что делать с индексами? Хотелось бы, чтобы была зависимость между индексами и координатами
(ведь координаты - уникальный ключ). Так перебор элементов будет значительно быстрее.
Ну допустим тип double я смогу привести к целому числу, умножив его на число с нужным
количеством нулей (точность), но как быть со второй координатой. Их ведь две, а индекс
один. Как создать коллекцию с двойным индексом?
    


Ответы

Ответ 1



Всё очень просто. Вам нужно перевести сферические координаты (широту, долготу радиус) в трёхмерные. Затем умножением на матрицу поворота повернуть в нужное положение. Затем спроектировать на плоскость, отбросив одну координату, например, Y. При этом точки с положительной координатой Y находятся на противоположной стороне и их надо отбросить. Полученную картинку из квадрата [-R, R] линейно отобразите в квадрат координат экрана. Для обработки выделения я обычно использую не индексы, а вот такую конструкцию: VM: class Objects : NotifyPropertyChangeImpl { ObservableCollection All { get; private set; } // стандартное INPC-свойство ObjectVM selectedObject; public ObjectVM SelectedObject { get { return selectedObject; } set { if (value == selectedObject) return; value = selectedObject; NotifyPropertyChange(); } } } XAML:

Комментариев нет:

Отправить комментарий