Хорошо, тогда вам придется обрабатывать сетки с объемом. Это многое меняет ...
сегментированные объекты
выбирают все грани, заключающие его внутрь ... Так что это похоже на:
, так что просто найдите точку внутри еще неиспользованной сетки ... и "заполняйте" объем, пока не достигнете всех граней, из которых он состоит. Выберите эти лица как принадлежащие новому объекту. и установите их как использованные ... остерегайтесь касания объектов, которые могут привести к использованию лиц дважды или более ...
Вы можете сделать это также с векторной математикой / пробелом, так что просто проверьте, если линия от какой-то внутренней точки к грани ударяет по любому другому лицу ... если нет, вы нашли свое поверхностное лицо ... похоже на Тест удара
объект процесса (необязательно)
вы можете дополнительно сегментировать объектную сетку на «плоские» объекты, из которых он состоит группируя грани, принадлежащие к одной плоскости ... или внутри охватывающего ребра / контура ..., затем определите, что они
по количеству и типу лиц вы можете обнаружить основные объекты, такие как:
cone = 1 disc + 1 curved surface with singular edge point parallel to disc center
box/cube = 6 rectangles/squares
cylinder = 2 discs + 1 curved surface with center axis going through discs centers
вычислить основные геометрические свойства отдельные объекты (необязательно)
, такие как BBOX или OBB , поверхность, объем, геом. центр, центр масс, ...
1126] Теперь просто решите, какой это тип объекта. Например, соотношение между площадью поверхности и объемом может указывать на сферу или эллипсоид, если OBB совпадает со сторонами, оно намекает на поле, если геом и центры масс совпадают, это указывает на симметричный объект ...
передать сетку в функцию подбора возможного типа объекта
, поэтому на основе маркеров # 2, # 3 у вас есть представление о том, какой объект может быть какие формы, так что просто подтвердите это с вашей функцией подгонки ...
Чтобы упростить этот процесс, вы можете использовать свойства из # 3 , например, см. Аналогичные:
, чтобы вы могли придумать схожие методы для базовых 3D фигур ...
Я сделал что-то вроде этого с помощью следующего в объединенном ResourceDictionary, оно может помочь Вам:
<Style TargetType="ListBoxItem">
<Style.Resources>
<!--SelectedItem with focus-->
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="LightBlue" Opacity=".4"/>
<!--SelectedItem without focus-->
<SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey }" Color="LightBlue" Opacity=".4"/>
</Style.Resources>
</Style>
Можно, вероятно, решить проблему путем перезаписи Шаблона, но попробовать это за легкий патч.
<Style TargetType="ListViewItem">
<Style.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Blue" />
<SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Blue" />
</Style.Resources>
</Style>
Это не ответ на вопрос, но я обнаружил его, когда искал способ отключить выбор в моих списках. Используя слегка измененную форму описанной выше техники Гая и Бендевея, оказывается, что вы можете создать видимость отсутствия выбора в вашем списке без замены базового элемента управления элементами или чего-то подобного. Вот код, который я использовал:
<Grid.Resources>
<Style TargetType="ListBoxItem">
<Style.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="White" />
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black" />
<SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="White" />
</Style.Resources>
</Style>
</Grid.Resources>
Я также нашел полезной следующую страницу MSDN:
MSDN: SystemColors Members (System.Windows)
Спасибо за помощь, ребята.