Created
August 3, 2015 13:00
-
-
Save MovGP0/d8708489eabd489f233e to your computer and use it in GitHub Desktop.
Nominal Size
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Linq; | |
using static System.Math; | |
namespace NominalSize | |
{ | |
public sealed class Size | |
{ | |
public Size(decimal basicValue, decimal upperTolerance, decimal lowerTolerance) | |
{ | |
BasicValue = basicValue; | |
if (upperTolerance == lowerTolerance) | |
{ | |
throw new ArgumentException(nameof(lowerTolerance), "Upper tolerance must differ from lower tolerance."); | |
} | |
if (lowerTolerance > upperTolerance) | |
{ | |
UpperTolerance = lowerTolerance; | |
LowerTolerance = upperTolerance; | |
} | |
else | |
{ | |
UpperTolerance = upperTolerance; | |
LowerTolerance = lowerTolerance; | |
} | |
} | |
/// <summary> | |
/// Nennmaß | |
/// </summary> | |
public decimal BasicValue { get; } | |
/// <summary> | |
/// Sollmaß | |
/// </summary> | |
public decimal NominalValue => (LowerDimension + UpperDimension) / 2.0m; | |
public decimal UpperDimension => BasicValue + UpperTolerance; | |
public decimal LowerDimension => BasicValue + LowerTolerance; | |
public decimal UpperTolerance { get; } | |
public decimal LowerTolerance { get; } | |
public static Size operator +(Size left, Size right) | |
{ | |
var newBasicValue = left.BasicValue + right.BasicValue; | |
var newUpperTolerance = left.UpperTolerance + right.UpperTolerance; | |
var newLowerTolerance = left.LowerTolerance + right.LowerTolerance; | |
return new Size(newBasicValue, newUpperTolerance, newLowerTolerance); | |
} | |
public static Size operator -(Size left, Size right) | |
{ | |
var newBasicValue = left.BasicValue - right.BasicValue; | |
var newUpperTolerance = Max(left.UpperTolerance - right.UpperTolerance, left.UpperTolerance - right.LowerTolerance); | |
var newLowerTolerance = Min(left.LowerTolerance - right.LowerTolerance, left.LowerTolerance - right.UpperTolerance); | |
return new Size(newBasicValue, newUpperTolerance, newLowerTolerance); | |
} | |
public static Size operator *(Size left, Size right) | |
{ | |
var newBasicValue = left.BasicValue * right.BasicValue; | |
var newDimensions = new [] | |
{ | |
left.UpperDimension * right.UpperDimension, | |
left.UpperDimension * right.LowerDimension, | |
left.LowerDimension * right.UpperDimension, | |
left.LowerDimension * right.LowerDimension | |
}; | |
var upperDimension = newDimensions.Max(); | |
var lowerDimension = newDimensions.Min(); | |
return new Size(newBasicValue, upperDimension - newBasicValue, lowerDimension - newBasicValue); | |
} | |
public static Size operator /(Size left, Size right) | |
{ | |
var newBasicValue = left.BasicValue / right.BasicValue; | |
var newDimensions = new [] | |
{ | |
left.UpperDimension / right.UpperDimension, | |
left.UpperDimension / right.LowerDimension, | |
left.LowerDimension / right.UpperDimension, | |
left.LowerDimension / right.LowerDimension | |
}; | |
var upperDimension = newDimensions.Max(); | |
var lowerDimension = newDimensions.Min(); | |
return new Size(newBasicValue, upperDimension - newBasicValue, lowerDimension - newBasicValue); | |
} | |
private static decimal Pow(decimal @base, decimal exponent) | |
{ | |
return (decimal) Math.Pow((double) @base, (double) exponent); | |
} | |
public static Size Power(Size @base, Size exponent) | |
{ | |
var newBasicValue = Pow(@base.BasicValue, exponent.BasicValue); | |
var newDimensions = new[] | |
{ | |
Pow(@base.UpperDimension, exponent.UpperDimension), | |
Pow(@base.UpperDimension, exponent.LowerDimension), | |
Pow(@base.LowerDimension, exponent.UpperDimension), | |
Pow(@base.LowerDimension, exponent.LowerDimension) | |
}; | |
var upperDimension = newDimensions.Max(); | |
var lowerDimension = newDimensions.Min(); | |
return new Size(newBasicValue, upperDimension - newBasicValue, lowerDimension - newBasicValue); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment