为啥 WPF 定义它自己的类型来表示二维空间中的点而不是使用 System.Numerics.Vector2

Posted

技术标签:

【中文标题】为啥 WPF 定义它自己的类型来表示二维空间中的点而不是使用 System.Numerics.Vector2【英文标题】:Why does WPF define it's own type to represent points in 2d space instead of using System.Numerics.Vector2为什么 WPF 定义它自己的类型来表示二维空间中的点而不是使用 System.Numerics.Vector2 【发布时间】:2019-08-20 10:13:26 【问题描述】:

我最近了解到 C# 有像 Vector2Vector3 这样的类型,它们被设计为尽可能使用 SIMD 指令。

所以Vector2 类型非常适合表示像屏幕这样的二维空间中的一个点。但是,为什么 WPF 和 UWP 不使用这种类型来表示 2d 点 System.Windows.PointWindows.Foundation.Point

【问题讨论】:

我会假设,因为向量和点在语义上是不同的。一个向量大致表示一个方向,一个点就是一个点。 @ckuri:您对问题的评论(概念差异)的核心是正确的,但向量表示方向和幅度(即您所说的长度向量)。 归一化向量仅表示方向(因为归一化向量的大小在定义上等于 1) Vector2 是单精度的,从 .NET 4.6 开始可用。将 WPF 从 double 更改为 single 并将 Point 更改为 Vector2 可能会破坏很多代码... 【参考方案1】:

仅仅因为两个类碰巧具有相同的属性并不意味着它们应该被合并到一个共享类中。

例如,一个纬度/经度对和一个(2D)点都可以用两个十进制值表示;但它们在概念上是不同的。一个点位于 2D 平面上,而 lat/lon 对位于球体的表面(这是一个 2D 表面但弯曲,它不是平面)。 因为这是两个不同的概念,具有不同的上下文,所以我们将这两个分开,因为将它们视为同一类型的数据没有任何好处。

从概念上讲,向量与点有很大不同。但是,实际上,向量的数据可以用单个点表示,因为(按照惯例)假定另一个点为 (0, 0) 或 (0,0,0)。

从技术上讲,一个向量应该由两个点表示,因为向量表示这些点之间的差异。从 (2,2) 到 (3,3) 的向量与从 (100,4) 到 (101,5) 的向量相同,也与从 (0,0) 到 (1,1) 的向量相同)。所有三个向量都表示两点之间的 (+1,+1) 差。

但是,由于我们只对两点之间的差异感兴趣,而实际上并不关心两点本身,因此我们可以通过使用始终为第一点的约定来减少需要存储的数据量原点 (0,0),它允许我们保留所有必要的信息(原点和第二个点之间的差异),但需要我们存储较少的可变数据。这是一个净积极因素,因此没有理由不这样做。


这是可读性优于简洁的论点。将两个概念实体分开并没有显着的成本,但这样做会大大提高可读性。 如果你要合并它们,你不会得到真正的好处,但你会破坏这两个不相关实体之间的分离,从而显着降低可读性。

您的建议的来源是(绝对是人类)过度应用范式的倾向,在这种情况下是 DRY。虽然重新评估事物以查看是否可以优化(或取消重复)事物是有价值的;您也可以过分寻找不存在的模式。合并向量和点的建议太过分了,但您的建议的来源确实来自尝试应用良好实践。

【讨论】:

以上是关于为啥 WPF 定义它自己的类型来表示二维空间中的点而不是使用 System.Numerics.Vector2的主要内容,如果未能解决你的问题,请参考以下文章

Python_类和对象_自定义类与属性

为啥 PCL 条件过滤器返回相同的点云?

WPF使用其它的命名空间(宝典1)

WPF学习第三章 使用其他名称空间中的类型

KD树小结

WPF的三维变换应用