通常、 float を で比較する==
のは間違いであることはよく知られています。3D ベクトル クラス (float コンポーネント X、Y、Z) では、距離がゼロと見なされる場合、2 つのベクトルは等しいと見なされます。
public override bool Equals(object obj)
{
if (obj == null) {
return false;
}
if (GetType () != obj.GetType ()) {
return false;
}
float d = DistSq ((Vec) obj);
return IsConsideredZero (d);
}
public float DistSq(Vec p)
{
Vec d = this - p;
return d.LengthSq ();
}
public float LengthSq()
{
return X * X + Y * Y + Z * Z;
}
private const float VEC_COMPARE_EPSILON_ABS = 1E-05f;
public static bool IsConsideredZero(float f)
{
return Math.Abs (f) < VEC_COMPARE_EPSILON_ABS;
}
これまでのところ、すべてうまくいきました。ただし、ベクターのハッシュコードを取得したいと思います。hash = (int)X^(int)Y^(int)Z
のようなものは必ず失敗することがわかります。
私が思いついた最高のものは次のとおりです。
public override int GetHashCode()
{
return 0;
}
もちろん、これはちょっと面倒です。妥当なハッシュコードを取得する方法はありますか? NaN やその他の特別な値は可能ですが、それが重要な場合はほとんどありません。