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

C#编程

开发平台:

Others

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