VectorClass.cs
上传用户:lxycoco
上传日期:2022-07-21
资源大小:38457k
文件大小:5k
源码类别:

C#编程

开发平台:

Others

  1. using System;
  2. using Wrox.ProCSharp.WhatsNewAttributes;
  3. using System.Collections;
  4. using System.Text;
  5. [assembly: SupportsWhatsNew]
  6. namespace Wrox.ProCSharp.VectorClass
  7. {
  8.    [LastModified("14 Feb 2002", "IEnumerable interface implemented " +
  9.        "So Vector can now be treated as a collection")]
  10.    [LastModified("10 Feb 2002", "IFormattable interface implemented " +
  11.        "So Vector now responds to format specifiers N and VE")]
  12.    class Vector : IFormattable, IEnumerable
  13.    {
  14.       public double x, y, z;
  15.       public Vector(double x, double y, double z)
  16.       {
  17.          this.x = x;
  18.          this.y = y;
  19.          this.z = z;
  20.       }
  21.       [LastModified("10 Feb 2002", "Method added in order to provide formatting support")]
  22.       public string ToString(string format, IFormatProvider formatProvider)
  23.       {
  24.          if (format == null)
  25.             return ToString();
  26.          string formatUpper = format.ToUpper();
  27.          switch (formatUpper)
  28.          {
  29.             case "N":
  30.                return "|| " + Norm().ToString() + " ||";
  31.             case "VE":
  32.                return String.Format("( {0:E}, {1:E}, {2:E} )", x, y, z);
  33.             case "IJK":
  34.                StringBuilder sb = new StringBuilder(x.ToString(), 30);
  35.                sb.Append(" i + ");
  36.                sb.Append(y.ToString());
  37.                sb.Append(" j + ");
  38.                sb.Append(z.ToString());
  39.                sb.Append(" k");
  40.                return sb.ToString();
  41.             default:
  42.                return ToString();
  43.          }
  44.       }
  45.       public Vector(Vector rhs)
  46.       {
  47.          x = rhs.x;
  48.          y = rhs.y;
  49.          z = rhs.z;
  50.       }
  51.       [LastModified("14 Feb 2002", "Method added in order to provide collection support")]
  52.       public IEnumerator GetEnumerator()
  53.       {
  54.          return new VectorEnumerator(this);
  55.       }
  56.       public override string ToString()
  57.       {
  58.          return "( " + x + " , " + y + " , " + z + " )"; 
  59.       }
  60.       public double this [uint i]
  61.       {
  62.          get
  63.          {
  64.             switch (i)
  65.             {
  66.                case 0:
  67.                   return x;
  68.                case 1:
  69.                   return y;
  70.                case 2:
  71.                   return z;
  72.                default:
  73.                   throw new IndexOutOfRangeException(
  74.                      "Attempt to retrieve Vector element" + i) ;
  75.             }
  76.          }
  77.          set
  78.          {
  79.             switch (i)
  80.             {
  81.                case 0:
  82.                   x = value;
  83.                   break;
  84.                case 1:
  85.                   y = value;
  86.                   break;
  87.                case 2:
  88.                   z = value;
  89.                   break;
  90.                default:
  91.                   throw new IndexOutOfRangeException(
  92.                      "Attempt to set Vector element" + i) ;
  93.             }
  94.          }
  95.       }
  96.       public static bool operator == (Vector lhs, Vector rhs)
  97.       {
  98.          if (System.Math.Abs(lhs.x - rhs.x) < double.Epsilon && 
  99.             System.Math.Abs(lhs.y - rhs.y) < double.Epsilon &&
  100.             System.Math.Abs(lhs.z - rhs.z) < double.Epsilon )
  101.             return true;
  102.          else
  103.             return false;
  104.       }
  105.       public static bool operator != (Vector lhs, Vector rhs)
  106.       {
  107.          return ! (lhs == rhs);
  108.       }
  109.       public static Vector operator + (Vector lhs, Vector rhs)
  110.       {
  111.          Vector Result = new Vector(lhs);
  112.          Result.x += rhs.x;
  113.          Result.y += rhs.y;
  114.          Result.z += rhs.z;
  115.          return Result;
  116.       }
  117.       public static Vector operator * (double lhs, Vector rhs)
  118.       {
  119.          return new Vector(lhs*rhs.x, lhs*rhs.y, lhs*rhs.z);
  120.       }
  121.       public static Vector operator * (Vector lhs, double rhs)
  122.       {
  123.          return rhs*lhs;
  124.       }
  125.       public static double operator * (Vector lhs, Vector rhs)
  126.       {
  127.          return lhs.x*rhs.x + lhs.y+rhs.y + lhs.z*rhs.z;
  128.       }
  129.       public double Norm()
  130.       {
  131.          return x*x + y*y + z*z;
  132.       }
  133.       #region enumerator class
  134.       [LastModified("14 Feb 2002", "Class created as part of collection support for Vector")]
  135.       private class VectorEnumerator : IEnumerator
  136.       {
  137.          Vector theVector;      // Vector object that this enumerato refers to 
  138.          int location;   // which element of theVector the enumerator is currently referring to 
  139.          public VectorEnumerator(Vector theVector)
  140.          {
  141.             this.theVector = theVector;
  142.             location = -1;
  143.          }
  144.          public bool MoveNext()
  145.          {
  146.             ++location;
  147.             return (location > 2) ? false : true;
  148.          }
  149.          public object Current
  150.          {
  151.             get
  152.             {
  153.                if (location < 0 || location > 2)
  154.                   throw new InvalidOperationException(
  155.                      "The enumerator is either before the first element or " +
  156.                      "after the last element of the Vector");
  157.                return theVector[(uint)location];
  158.             }
  159.          }
  160.          public void Reset()
  161.          {
  162.             location = -1;
  163.          }
  164.       }
  165.       #endregion
  166.    }
  167. }