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

C#编程

开发平台:

Others

  1. using System;
  2. using System.Text;
  3. namespace Wrox.ProCSharp.FormattableVector
  4. {
  5.    class MainEntryPoint
  6.    {
  7.       static void Main()
  8.       {
  9.          Vector v1 = new Vector(1,32,5);
  10.          Vector v2 = new Vector(845.4, 54.3, -7.8);
  11.          Console.WriteLine("nIn IJK format,nv1 is {0,30:IJK}nv2 is {1,30:IJK}", v1, v2);
  12.          Console.WriteLine("nIn default format,nv1 is {0,30}nv2 is {1,30}", v1, v2);
  13.          Console.WriteLine("nIn VE formatnv1 is {0,30:VE}nv2 is {1,30:VE}", v1, v2);
  14.          Console.WriteLine("nNorms are:nv1 is {0,20:N}nv2 is {1,20:N}", v1, v2);
  15.       }
  16.    }
  17.    struct Vector : IFormattable
  18.    {
  19.       public double x, y, z;
  20.       public Vector(double x, double y, double z)
  21.       {
  22.          this.x = x;
  23.          this.y = y;
  24.          this.z = z;
  25.       }
  26.       public string ToString(string format, IFormatProvider formatProvider)
  27.       {
  28.          if (format == null)
  29.             return ToString();
  30.          string formatUpper = format.ToUpper();
  31.          switch (formatUpper)
  32.          {
  33.             case "N":
  34.                return "|| " + Norm().ToString() + " ||";
  35.             case "VE":
  36.                return String.Format("( {0:E}, {1:E}, {2:E} )", x, y, z);
  37.             case "IJK":
  38.                StringBuilder sb = new StringBuilder(x.ToString(), 30);
  39.                sb.Append(" i + ");
  40.                sb.Append(y.ToString());
  41.                sb.Append(" j + ");
  42.                sb.Append(z.ToString());
  43.                sb.Append(" k");
  44.                return sb.ToString();
  45.             default:
  46.                return ToString();
  47.          }
  48.       }
  49.       public Vector(Vector rhs)
  50.       {
  51.          x = rhs.x;
  52.          y = rhs.y;
  53.          z = rhs.z;
  54.       }
  55.       public override string ToString()
  56.       {
  57.          return "( " + x + " , " + y + " , " + z + " )"; 
  58.       }
  59.       public double this [uint i]
  60.       {
  61.          get
  62.          {
  63.             switch (i)
  64.             {
  65.                case 0:
  66.                   return x;
  67.                case 1:
  68.                   return y;
  69.                case 2:
  70.                   return z;
  71.                default:
  72.                   throw new IndexOutOfRangeException(
  73.                      "Attempt to retrieve Vector element" + i) ;
  74.             }
  75.          }
  76.          set
  77.          {
  78.             switch (i)
  79.             {
  80.                case 0:
  81.                   x = value;
  82.                   break;
  83.                case 1:
  84.                   y = value;
  85.                   break;
  86.                case 2:
  87.                   z = value;
  88.                   break;
  89.                default:
  90.                   throw new IndexOutOfRangeException(
  91.                      "Attempt to set Vector element" + i) ;
  92.             }
  93.          }
  94.       }
  95.          /* public static bool operator == (Vector lhs, Vector rhs)
  96.             {
  97.                if (lhs.x == rhs.x && lhs.y == rhs.y && lhs.z == rhs.z)
  98.                   return true;
  99.                else
  100.                   return false;
  101.             }*/
  102.       private const double Epsilon = 0.0000001;
  103.       public static bool operator == (Vector lhs, Vector rhs)
  104.       {
  105.          if (System.Math.Abs(lhs.x - rhs.x) < Epsilon && 
  106.             System.Math.Abs(lhs.y - rhs.y) < Epsilon &&
  107.             System.Math.Abs(lhs.z - rhs.z) < Epsilon )
  108.             return true;
  109.          else
  110.             return false;
  111.       }
  112.       public static bool operator != (Vector lhs, Vector rhs)
  113.       {
  114.          return ! (lhs == rhs);
  115.       }
  116.       public static Vector operator + (Vector lhs, Vector rhs)
  117.       {
  118.          Vector Result = new Vector(lhs);
  119.          Result.x += rhs.x;
  120.          Result.y += rhs.y;
  121.          Result.z += rhs.z;
  122.          return Result;
  123.       }
  124.       public static Vector operator * (double lhs, Vector rhs)
  125.       {
  126.          return new Vector(lhs*rhs.x, lhs*rhs.y, lhs*rhs.z);
  127.       }
  128.       public static Vector operator * (Vector lhs, double rhs)
  129.       {
  130.          return rhs*lhs;
  131.       }
  132.       public static double operator * (Vector lhs, Vector rhs)
  133.       {
  134.          return lhs.x*rhs.x + lhs.y+rhs.y + lhs.z*rhs.z;
  135.       }
  136.       public double Norm()
  137.       {
  138.          return x*x + y*y + z*z;
  139.       }
  140.    }
  141. }