优化了 WPF 几何图形集合中的命中测试

本文关键字:测试 集合 WPF 几何图形 优化 | 更新日期: 2023-09-27 17:57:22

我有一个抽象的大 IEnumerable 容器,其中包含 Wpf Geometry 对象;Geometry 对象的边界不是平凡的;它们不表示简单的几何形状,如矩形或圆形,它们是复杂的多边形。列表在最初填充后永远不会更改。

然后我有一个点,我想确定哪个几何包含该点。

List<Geometry> list = getList();
var point = new Point(x,y);
list.Any(y => y.Bounds.Contains(point) && y.FillContains(point));

此代码有效,但通常很慢。最初的边界检查是一个短路,最终比没有它快约 50%。我认为下一层复杂性是设置某种预渲染的命中地图词典。

WPF 中是否已经存在更好的东西来以更面向性能的方式完成此任务?

优化了 WPF 几何图形集合中的命中测试

我最终创建了一个自定义类,该类使用每个几何体的边界框来执行分层查找。第一层使用简单的边界框计算来缩小搜索所需的几何对象列表。

每个"桶"都是使用集合中所有几何的平均大小计算的。这在一般情况下有问题,但考虑到我的大多数几何体的大小大致相同,这是一个不错的解决方案。

MSDN 是最好的

  1. 如何:命中视觉对象中的测试几何图形

  2. 如何:使用几何图形作为参数进行命中测试