/// <summary>
        /// Tries to convert each axis of the metric of the quantity once.
        /// </summary>
        /// <returns>true if a change has been made</returns>
        private bool canonicalize(ref Quantity quantity)
        {
            List<Metric.Axis> axes = new List<Metric.Axis>();
            Exponential value = quantity.Value;
            bool modified = false;

            foreach (Metric.Axis axis in quantity.Metric.Axes)
            {
                Conversion conversion = Find(axis.Unit);
                if (conversion != null)
                {
                    Quantity part = conversion.Convert(1);
                    part.Metric = part.Metric.MultiplyExponents(axis.Exponent);
                    part.Value = Exponential.Power(part.Value, axis.Exponent);
                    axes.AddRange(part.Metric.Axes);
                    value *= part.Value;
                    modified = true;
                }
                else
                {
                    axes.Add(Metric.Axis.CopyOf(axis));
                }
            }
            Metric metric = new Metric(axes);
            if (modified)
                quantity = new Quantity(value, new Metric(axes));

            return modified;
        }
Exemple #2
0
 public bool Approximates(Quantity q)
 {
     Quantity a = this.UnPrefixed();
     Quantity b = q.UnPrefixed();
     
     bool met = a.Metric.Equals(b.Metric);
     bool val = a.Value.Approximates(b.Value);
     return met && val;
 }
        public Quantity Convert(Quantity quantity, Conversion conversion)
        {
            Quantity baseq = quantity.UnPrefixed();
            if (!baseq.Metric.Equals(conversion.To))
                throw new InvalidCastException(string.Format("Quantity {0} cannot be converted to {1}", quantity, conversion.To));

            Quantity output = conversion.Convert(baseq.Value);
            return output;
        }
Exemple #4
0
 public static bool SameDimension(Quantity a, Quantity b)
 {
     return(a.Metric.Equals(b.Metric));
 }
Exemple #5
0
 public static Quantity operator -(Quantity a, Quantity b)
 {
     return(Quantity.Substract(a, b));
 }
 public Quantity Convert(Quantity quantity, Metric metric)
 {
     return Conversions.Convert(quantity, metric);
 }
 public Quantity Convert(Quantity quantity, Metric metric)
 {
     return(Conversions.Convert(quantity, metric));
 }
        /// <summary>
        /// Converts a quantity to standardized units without a prefix
        /// </summary>
        public Quantity Canonical(Quantity quantity)
        {
            Quantity outcome = Conversions.Canonical(quantity);

            return(outcome.UnPrefixed());
        }
 public Quantity Convert(Quantity quantity, Metric metric)
 {
     throw new NotImplementedException();
 }
Exemple #10
0
 public static Quantity CopyOf(Quantity q)
 {
     return new Quantity(q.Value, q.Metric);
 }
Exemple #11
0
 public static bool SameDimension(Quantity a, Quantity b)
 {
     return a.Metric.Equals(b.Metric);
 }
Exemple #12
0
        public static Quantity Substract(Quantity a, Quantity b)
        {

            if (!Quantity.SameDimension(a, b))
                throw new ArgumentException("Quantities of a different dimension cannot be added ");

            a = a.UnPrefixed();
            b = b.UnPrefixed();

            Exponential value = Exponential.Substract(a.Value, b.Value);
            return new Quantity(value, a.Metric);
        }
Exemple #13
0
 public static Quantity Divide(Quantity a, Quantity b)
 {
     Exponential value = Exponential.Divide(a.Value, b.Value);
     Metric metric = Metric.Divide(a.Metric, b.Metric);
     return new Quantity(value, metric);
 }
 public Quantity Convert(Quantity quantity, string metric)
 {
     Metric m = Metrics.ParseMetric(metric);
     return this.Convert(quantity, m);
 }
Exemple #15
0
 public static Quantity CopyOf(Quantity q)
 {
     return(new Quantity(q.Value, q.Metric));
 }
        /// <summary>
        /// Converts a Quantity to it's canonical form in base units without prefixes
        /// </summary>
        public Quantity Canonical(Quantity quantity)
        {
            Quantity output = Quantity.CopyOf(quantity).UnPrefixed();
            bool canonicalized;
            do
            {
                canonicalized = canonicalize(ref output);
                output = output.UnPrefixed();
            }
            while (canonicalized);

            if (!output.IsInBaseUnits())
                throw new InvalidCastException("Quantity could not be converted to base units");

            output.Metric = output.Metric.Reduced();
            return output;
        }
Exemple #17
0
 public static Quantity Multiply(Quantity a, Quantity b)
 {
     Exponential value = Exponential.Multiply(a.Value, b.Value);
     Metric metric = Metric.Multiply(a.Metric, b.Metric);
     return new Quantity(value, metric);
 }
Exemple #18
0
 public Quantity Convert(Exponential value)
 {
     Exponential output = this.method(value);
     Quantity quantity = new Quantity(output, To);
     return quantity;
 }
Exemple #19
0
 public static Quantity operator *(Quantity a, Quantity b)
 {
     return(Quantity.Multiply(a, b));
 }
Exemple #20
0
 public Quantity Convert(Quantity quantity, Metric metric)
 {
     throw new NotImplementedException();
 }
Exemple #21
0
 public static Quantity operator /(Quantity a, Quantity b)
 {
     return(Quantity.Divide(a, b));
 }
Exemple #22
0
        /// <summary>
        /// Interprets an expression as a quantity and converts this to standardized units without a prefix
        /// </summary>
        public Quantity Canonical(string expression)
        {
            Quantity quantity = this.Quantity(expression);

            return(this.Canonical(quantity));
        }
Exemple #23
0
 public static Quantity operator +(Quantity a, Quantity b)
 {
     return(Quantity.Add(a, b));
 }
Exemple #24
0
        public Quantity Convert(Quantity quantity, string metric)
        {
            Metric m = Metrics.ParseMetric(metric);

            return(this.Convert(quantity, m));
        }
 /// <summary>
 /// Converts a quantity to standardized units without a prefix
 /// </summary>
 public Quantity Canonical(Quantity quantity)
 {
     Quantity outcome = Conversions.Canonical(quantity);
     return outcome.UnPrefixed();
 }