gpt4 book ai didi

c# - 在 C# : Vector, 方向(单位向量)、点中实现这 3 个类的最佳方式

转载 作者:太空狗 更新时间:2023-10-29 22:03:16 25 4
gpt4 key购买 nike

  • 所有点都是向量,所有向量都是点。
  • 所有方向都是矢量,但并非所有矢量都是方向(这不意味着不允许双向转换)。

我希望所有运算符都被覆盖一次,因为它们完全相同。在 C++ 中,我可以只定义 class Vector { float x,y,z; }, 然后做 typedef Point = Vector, typedef Direction = Vector;在 C# 中没有等效项(“using Point=Vector;”很糟糕,因为您必须将它放在您使用的每个文档中,而且它不是由编译器强制执行的)。

我尝试定义 3 个不同的类并覆盖每个类的运算符,然后进行隐式类型转换,这会使代码运行速度变慢,等等。

我尝试只定义 Vector,然后定义 Point:Vector 和 Direction:Vector,这样我只编写一次运算符,但之后我无法进行隐式类型转换 Point <-> Vector 或 Direction <->Vector。

我可以简单地定义 Vector 类并在任何地方使用它,但这会产生歧义,因为变量应该是空间中的位置 (Point)、空间中的相对位置 (Vector) 或单位向量 (方向)。例如函数:

Vector GetOrthogon(Vector a, Vector b) {
// ....
}

您无法知道它需要的是任何向量还是单位向量。在 C++ 中你可以做到这一点,那么为什么不在 C# 中呢?

注意:如果可能,使用结构而不是类是最理想的。

最佳答案

在数学上,点是向量。空间中没有绝对的点。点被定义为来自某个任意原点的向量。因此,我对点和点之间的差异都使用向量。

因为方向是单位向量,所以也没有必要进行区分。这就像尝试为整数 1 和其他整数定义不同的静态类型。所以我对两个方向和点之间的差异都使用向量。

因此,定义一个单一的 Vector 类型。它会让您的生活更轻松,因为您需要编写和测试的类和重载运算符/函数会更少,并且在数学上会更“纯粹”(如果这对您很重要)。

关于c# - 在 C# : Vector, 方向(单位向量)、点中实现这 3 个类的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/897455/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com