频道栏目
读书频道 > 软件开发 > C# > 精通C#游戏编程
8.2.3 向量的相等性
2012-08-01 16:21:34     我来说两句
收藏   我要投稿

本文所属图书 > 精通C#游戏编程

本书通过引导读者创建一个基本的游戏,展示了如何使用c#和OpenGL一步步地开发出简单、整洁而可靠的代码。C#是一种高级编程语言,而OpenGL是业界显示图形最常用的方法。本书概述了创建优秀游戏项目时采用的方法和...  立即去当当网订购

如果所有的成员值(X、Y和Z)都相等,则认为向量是相等的。向量没有位置,它们只是从某个原点开始的一个方向。图8-3显示了一组向量,可以看到,即使一些向量放到了不同的位置,它们仍然是相等的,因为它们的成员是相等的。不管是从你的房子向北3英里,还是从吉萨金字塔向北3英里,它都一样是向北3英里。

为向量创建一个Equals函数是很简单的。

public bool Equals(Vector v)

{

return (X == v.X) && (Y == v.Y) && (Z == v.Z);

}

在代码中,如果重载了==操作符的话,就更方便了。现在,还不能编写下面的代码。

// Cannot write this

if (vector1 == vector2)

{

System.Console.WriteLine("They're the same")

}

 

// Instead must write

if (vector1.Equals(vector2))

{

System.Console.WriteLine("They're the same")

}

要使用==操作符,需要重载该操作符,还需要重写其他一些函数或操作符,如GetHashCode、!=和Equals(Object obj)。


public override int GetHashCode()

{

return (int)X ^ (int)Y ^ (int)Z;

}

 

public static bool operator ==(Vector v1, Vector v2)

{

// If they're the same object or both null, return true.

if (System.Object.ReferenceEquals(v1, v2))

{

return true;

}

 

// If one is null, but not both, return false.

if (v1 == null || v2 == null)

{

return false;

}

 

return v1.Equals(v2);

}

 

public override bool Equals(object obj)

{

if (obj is Vector)

{

return Equals((Vector)obj);

}

return base.Equals(obj);

}

 

public static bool operator !=(Vector v1, Vector v2)

{

return !v1.Equals(v2);

}

重载= =操作符时使用了大量的代码。唯一有点新奇的函数是GetHashCode。哈希值是一个数值,尝试(但是并不保证)唯一地标识一个对象,C#的Dictionary结构中用到了哈希值。当重写相等性时,也需要重写哈希值,否则编译器很难知道哪一个才是正确的哈希值。

您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:8.2.2 长度操作
下一篇:8.2.4 向量加法、减法和乘法
相关文章
图文推荐
排行
热门
最新书评
文章
下载
读书
特别推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站