From c12e9f70f9bf1e192c7df7aa5a537164b4123eae Mon Sep 17 00:00:00 2001 From: Evgeny Redikultsev Date: Sun, 4 Sep 2022 19:47:09 +0500 Subject: [PATCH] Viewer of IsoFields is added --- .../Entities/ColorMaps/ColorMap.cs | 13 ++ .../ColorMaps/Factories/ColorMapFactory.cs | 86 +++++++++++ .../Entities/ColorMaps/IColorMap.cs | 13 ++ .../Entities/ColorMaps/IValueColorRange.cs | 19 +++ .../Entities/ColorMaps/ValueColorRange.cs | 19 +++ .../Entities/Values/IValueRange.cs | 12 ++ .../Entities/Values/Primitives/ICenter.cs | 14 ++ .../Values/Primitives/IPrimitiveSet.cs | 15 ++ .../Values/Primitives/IRectanglePrimitive.cs | 14 ++ .../Values/Primitives/IValuePrimitive.cs | 15 ++ .../Values/Primitives/PrimitiveSet.cs | 20 +++ .../Values/Primitives/RectanglePrimitive.cs | 17 +++ FieldVisualizer/Entities/Values/ValueRange.cs | 12 ++ FieldVisualizer/FieldVisualizer.csproj | 16 +++ FieldVisualizer/FieldVisualizer.csproj.user | 29 ++++ .../InfraStructures/Enums/ColorMapsTypes.cs | 14 ++ .../Exceptions/FieldVisulizerException.cs | 13 ++ .../InfraStructures/Strings/ErrorStrings.cs | 11 ++ .../Services/ColorServices/ColorOperations.cs | 61 ++++++++ .../PrimitiveServices/PrimitiveOperations.cs | 79 ++++++++++ .../ValueRanges/ValueRangeOperations.cs | 34 +++++ .../Windows/UserControls/FieldViewer.xaml | 41 ++++++ .../Windows/UserControls/FieldViewer.xaml.cs | 135 ++++++++++++++++++ .../Windows/UserControls/VerticalLegend.xaml | 47 ++++++ .../UserControls/VerticalLegend.xaml.cs | 36 +++++ .../Windows/VerticalLegendTemplates.xaml | 4 + FieldVisualizer/Windows/WndFieldViewer.xaml | 30 ++++ .../Windows/WndFieldViewer.xaml.cs | 40 ++++++ .../WindowsOperation/FieldViewerOperation.cs | 19 +++ FiledVisualzerDemo/App.config | 6 + FiledVisualzerDemo/DemoForm.Designer.cs | 61 ++++++++ FiledVisualzerDemo/DemoForm.cs | 44 ++++++ FiledVisualzerDemo/DemoForm.resx | 120 ++++++++++++++++ FiledVisualzerDemo/FiledVisualzerDemo.csproj | 89 ++++++++++++ FiledVisualzerDemo/Program.cs | 22 +++ FiledVisualzerDemo/Properties/AssemblyInfo.cs | 36 +++++ .../Properties/Resources.Designer.cs | 71 +++++++++ FiledVisualzerDemo/Properties/Resources.resx | 117 +++++++++++++++ .../Properties/Settings.Designer.cs | 30 ++++ .../Properties/Settings.settings | 7 + StructureHelper.sln | 12 ++ .../GetColorByValueTest.cs | 46 ++++++ .../StructureHelperTests.csproj | 12 +- 43 files changed, 1550 insertions(+), 1 deletion(-) create mode 100644 FieldVisualizer/Entities/ColorMaps/ColorMap.cs create mode 100644 FieldVisualizer/Entities/ColorMaps/Factories/ColorMapFactory.cs create mode 100644 FieldVisualizer/Entities/ColorMaps/IColorMap.cs create mode 100644 FieldVisualizer/Entities/ColorMaps/IValueColorRange.cs create mode 100644 FieldVisualizer/Entities/ColorMaps/ValueColorRange.cs create mode 100644 FieldVisualizer/Entities/Values/IValueRange.cs create mode 100644 FieldVisualizer/Entities/Values/Primitives/ICenter.cs create mode 100644 FieldVisualizer/Entities/Values/Primitives/IPrimitiveSet.cs create mode 100644 FieldVisualizer/Entities/Values/Primitives/IRectanglePrimitive.cs create mode 100644 FieldVisualizer/Entities/Values/Primitives/IValuePrimitive.cs create mode 100644 FieldVisualizer/Entities/Values/Primitives/PrimitiveSet.cs create mode 100644 FieldVisualizer/Entities/Values/Primitives/RectanglePrimitive.cs create mode 100644 FieldVisualizer/Entities/Values/ValueRange.cs create mode 100644 FieldVisualizer/FieldVisualizer.csproj create mode 100644 FieldVisualizer/FieldVisualizer.csproj.user create mode 100644 FieldVisualizer/InfraStructures/Enums/ColorMapsTypes.cs create mode 100644 FieldVisualizer/InfraStructures/Exceptions/FieldVisulizerException.cs create mode 100644 FieldVisualizer/InfraStructures/Strings/ErrorStrings.cs create mode 100644 FieldVisualizer/Services/ColorServices/ColorOperations.cs create mode 100644 FieldVisualizer/Services/PrimitiveServices/PrimitiveOperations.cs create mode 100644 FieldVisualizer/Services/ValueRanges/ValueRangeOperations.cs create mode 100644 FieldVisualizer/Windows/UserControls/FieldViewer.xaml create mode 100644 FieldVisualizer/Windows/UserControls/FieldViewer.xaml.cs create mode 100644 FieldVisualizer/Windows/UserControls/VerticalLegend.xaml create mode 100644 FieldVisualizer/Windows/UserControls/VerticalLegend.xaml.cs create mode 100644 FieldVisualizer/Windows/VerticalLegendTemplates.xaml create mode 100644 FieldVisualizer/Windows/WndFieldViewer.xaml create mode 100644 FieldVisualizer/Windows/WndFieldViewer.xaml.cs create mode 100644 FieldVisualizer/WindowsOperation/FieldViewerOperation.cs create mode 100644 FiledVisualzerDemo/App.config create mode 100644 FiledVisualzerDemo/DemoForm.Designer.cs create mode 100644 FiledVisualzerDemo/DemoForm.cs create mode 100644 FiledVisualzerDemo/DemoForm.resx create mode 100644 FiledVisualzerDemo/FiledVisualzerDemo.csproj create mode 100644 FiledVisualzerDemo/Program.cs create mode 100644 FiledVisualzerDemo/Properties/AssemblyInfo.cs create mode 100644 FiledVisualzerDemo/Properties/Resources.Designer.cs create mode 100644 FiledVisualzerDemo/Properties/Resources.resx create mode 100644 FiledVisualzerDemo/Properties/Settings.Designer.cs create mode 100644 FiledVisualzerDemo/Properties/Settings.settings create mode 100644 StructureHelperTests/FieldsVisualizerTests/ColorOperationTests/GetColorByValueTest.cs diff --git a/FieldVisualizer/Entities/ColorMaps/ColorMap.cs b/FieldVisualizer/Entities/ColorMaps/ColorMap.cs new file mode 100644 index 0000000..faf1a80 --- /dev/null +++ b/FieldVisualizer/Entities/ColorMaps/ColorMap.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Windows.Media; +using System.Text; + +namespace FieldVisualizer.Entities.ColorMaps +{ + public class ColorMap : IColorMap + { + public string Name { get; set; } + public List Colors { get; set; } + } +} diff --git a/FieldVisualizer/Entities/ColorMaps/Factories/ColorMapFactory.cs b/FieldVisualizer/Entities/ColorMaps/Factories/ColorMapFactory.cs new file mode 100644 index 0000000..e204fcb --- /dev/null +++ b/FieldVisualizer/Entities/ColorMaps/Factories/ColorMapFactory.cs @@ -0,0 +1,86 @@ +using FieldVisualizer.InfraStructures.Enums; +using FieldVisualizer.InfraStructures.Exceptions; +using FieldVisualizer.InfraStructures.Strings; +using System; +using System.Collections.Generic; +using System.Windows.Media; + +namespace FieldVisualizer.Entities.ColorMaps.Factories +{ + public static class ColorMapFactory + { + public static IColorMap GetColorMap(ColorMapsTypes mapsTypes) + { + if (mapsTypes == ColorMapsTypes.FullSpectrum) { return GetFullSpectrum(); } + if (mapsTypes == ColorMapsTypes.RedToWhite) { return GetRedToWhite(); } + if (mapsTypes == ColorMapsTypes.RedToBlue) { return GetRedToBlue(); } + if (mapsTypes == ColorMapsTypes.BlueToWhite) { return GetBlueToWhite(); } + else { throw new FieldVisulizerException(ErrorStrings.ColorMapTypeIsUnknown); } + } + + private static IColorMap GetFullSpectrum() + { + ColorMap colorMap = new ColorMap(); + colorMap.Name = "FullSpectrumColorMap"; + List colors = new List(); + byte Alpha = 0xff; + colors.AddRange(new Color[]{ + Color.FromArgb(Alpha, 0xFF, 0x80, 0x80) ,// + Color.FromArgb(Alpha, 0xFF, 0, 0x80) ,// + Color.FromArgb(Alpha, 0xFF, 0, 0) ,//Red + Color.FromArgb(Alpha, 0xFF, 0x45, 0) ,//Orange Red + Color.FromArgb(Alpha, 0xFF, 0xD7, 0) ,//Gold + Color.FromArgb(Alpha, 0xFF, 0xFF, 0) ,//Yellow + Color.FromArgb(Alpha, 0x9A, 0xCD, 0x32) ,//Yellow Green + Color.FromArgb(Alpha, 0, 0x80, 0) ,//Green + Color.FromArgb(Alpha, 0, 0x64, 0) ,//Dark Green + Color.FromArgb(Alpha, 0x2F, 0x4F, 0x4F) ,//Dark Slate Gray + Color.FromArgb(Alpha, 0, 0, 0xFF) ,//Blue + }); + colorMap.Colors = colors; + return colorMap; + } + + private static IColorMap GetRedToWhite() + { + ColorMap colorMap = new ColorMap(); + colorMap.Name = "FullSpectrumColorMap"; + List colors = new List(); + byte Alpha = 0xff; + colors.AddRange(new Color[]{ + Color.FromArgb(Alpha, 0xFF, 0, 0) ,//Red + Color.FromArgb(Alpha, 0xFF, 0xFF, 0xFF) ,//White + }); + colorMap.Colors = colors; + return colorMap; + } + + private static IColorMap GetRedToBlue() + { + ColorMap colorMap = new ColorMap(); + colorMap.Name = "FullSpectrumColorMap"; + List colors = new List(); + byte Alpha = 0xff; + colors.AddRange(new Color[]{ + Color.FromArgb(Alpha, 0xFF, 0, 0) ,//Red + Color.FromArgb(Alpha, 0, 0, 0xFF) ,//Blue + }); + colorMap.Colors = colors; + return colorMap; + } + + private static IColorMap GetBlueToWhite() + { + ColorMap colorMap = new ColorMap(); + colorMap.Name = "FullSpectrumColorMap"; + List colors = new List(); + byte Alpha = 0xff; + colors.AddRange(new Color[]{ + Color.FromArgb(Alpha, 0, 0, 0xFF) ,//Blue + Color.FromArgb(Alpha, 0xFF, 0xFF, 0xFF) ,//White + }); + colorMap.Colors = colors; + return colorMap; + } + } +} diff --git a/FieldVisualizer/Entities/ColorMaps/IColorMap.cs b/FieldVisualizer/Entities/ColorMaps/IColorMap.cs new file mode 100644 index 0000000..0d77ae3 --- /dev/null +++ b/FieldVisualizer/Entities/ColorMaps/IColorMap.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Windows.Media; +using System.Text; + +namespace FieldVisualizer.Entities.ColorMaps +{ + public interface IColorMap + { + string Name { get;} + List Colors { get; } + } +} diff --git a/FieldVisualizer/Entities/ColorMaps/IValueColorRange.cs b/FieldVisualizer/Entities/ColorMaps/IValueColorRange.cs new file mode 100644 index 0000000..d4da2bc --- /dev/null +++ b/FieldVisualizer/Entities/ColorMaps/IValueColorRange.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Media; + +namespace FieldVisualizer.Entities.ColorMaps +{ + public interface IValueColorRange + { + bool IsActive { get; set; } + double BottomValue { get; set; } + double AverageValue { get; set; } + double TopValue {get;set;} + Color BottomColor { get; set; } + Color TopColor { get; set; } + } +} diff --git a/FieldVisualizer/Entities/ColorMaps/ValueColorRange.cs b/FieldVisualizer/Entities/ColorMaps/ValueColorRange.cs new file mode 100644 index 0000000..92eaff5 --- /dev/null +++ b/FieldVisualizer/Entities/ColorMaps/ValueColorRange.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Media; + +namespace FieldVisualizer.Entities.ColorMaps +{ + public class ValueColorRange : IValueColorRange + { + public bool IsActive { get; set; } + public double BottomValue { get; set; } + public double AverageValue { get; set; } + public double TopValue { get; set; } + public Color BottomColor { get; set; } + public Color TopColor { get; set; } + } +} diff --git a/FieldVisualizer/Entities/Values/IValueRange.cs b/FieldVisualizer/Entities/Values/IValueRange.cs new file mode 100644 index 0000000..976e436 --- /dev/null +++ b/FieldVisualizer/Entities/Values/IValueRange.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace FieldVisualizer.Entities.Values +{ + public interface IValueRange + { + double TopValue { get; set; } + double BottomValue { get; set; } + } +} diff --git a/FieldVisualizer/Entities/Values/Primitives/ICenter.cs b/FieldVisualizer/Entities/Values/Primitives/ICenter.cs new file mode 100644 index 0000000..fcaa228 --- /dev/null +++ b/FieldVisualizer/Entities/Values/Primitives/ICenter.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FieldVisualizer.Entities.Values.Primitives +{ + public interface ICenter + { + double CenterX { get;} + double CenterY { get;} + } +} diff --git a/FieldVisualizer/Entities/Values/Primitives/IPrimitiveSet.cs b/FieldVisualizer/Entities/Values/Primitives/IPrimitiveSet.cs new file mode 100644 index 0000000..8cefb5f --- /dev/null +++ b/FieldVisualizer/Entities/Values/Primitives/IPrimitiveSet.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FieldVisualizer.Entities.Values.Primitives +{ + public interface IPrimitiveSet + { + string Name { get; } + IEnumerable ValuePrimitives { get; } + + } +} diff --git a/FieldVisualizer/Entities/Values/Primitives/IRectanglePrimitive.cs b/FieldVisualizer/Entities/Values/Primitives/IRectanglePrimitive.cs new file mode 100644 index 0000000..6d4db3f --- /dev/null +++ b/FieldVisualizer/Entities/Values/Primitives/IRectanglePrimitive.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FieldVisualizer.Entities.Values.Primitives +{ + internal interface IRectanglePrimitive : IValuePrimitive + { + double Height { get; set; } + double Width { get; set; } + } +} diff --git a/FieldVisualizer/Entities/Values/Primitives/IValuePrimitive.cs b/FieldVisualizer/Entities/Values/Primitives/IValuePrimitive.cs new file mode 100644 index 0000000..93a36f9 --- /dev/null +++ b/FieldVisualizer/Entities/Values/Primitives/IValuePrimitive.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FieldVisualizer.Entities.Values.Primitives +{ + public interface IValuePrimitive + { + double Value { get; } + double CenterX { get; } + double CenterY { get; } + } +} diff --git a/FieldVisualizer/Entities/Values/Primitives/PrimitiveSet.cs b/FieldVisualizer/Entities/Values/Primitives/PrimitiveSet.cs new file mode 100644 index 0000000..732a515 --- /dev/null +++ b/FieldVisualizer/Entities/Values/Primitives/PrimitiveSet.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FieldVisualizer.Entities.Values.Primitives +{ + public class PrimitiveSet : IPrimitiveSet + { + public string Name { get; set; } + public IEnumerable ValuePrimitives { get; set;} + + public PrimitiveSet() + { + Name = "New set of primitives"; + ValuePrimitives = new List(); + } + } +} diff --git a/FieldVisualizer/Entities/Values/Primitives/RectanglePrimitive.cs b/FieldVisualizer/Entities/Values/Primitives/RectanglePrimitive.cs new file mode 100644 index 0000000..134d596 --- /dev/null +++ b/FieldVisualizer/Entities/Values/Primitives/RectanglePrimitive.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FieldVisualizer.Entities.Values.Primitives +{ + public class RectanglePrimitive : IRectanglePrimitive + { + public double Height { get; set; } + public double Width { get; set; } + public double Value { get; set; } + public double CenterX { get; set; } + public double CenterY { get; set; } + } +} diff --git a/FieldVisualizer/Entities/Values/ValueRange.cs b/FieldVisualizer/Entities/Values/ValueRange.cs new file mode 100644 index 0000000..bc0c379 --- /dev/null +++ b/FieldVisualizer/Entities/Values/ValueRange.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace FieldVisualizer.Entities.Values +{ + public class ValueRange : IValueRange + { + public double TopValue { get; set; } + public double BottomValue { get; set; } + } +} diff --git a/FieldVisualizer/FieldVisualizer.csproj b/FieldVisualizer/FieldVisualizer.csproj new file mode 100644 index 0000000..f8cca6d --- /dev/null +++ b/FieldVisualizer/FieldVisualizer.csproj @@ -0,0 +1,16 @@ + + + + net48 + true + Library + + + + + + + + + + diff --git a/FieldVisualizer/FieldVisualizer.csproj.user b/FieldVisualizer/FieldVisualizer.csproj.user new file mode 100644 index 0000000..ef6a2d2 --- /dev/null +++ b/FieldVisualizer/FieldVisualizer.csproj.user @@ -0,0 +1,29 @@ + + + + + + Code + + + Code + + + Code + + + + + Designer + + + Designer + + + Designer + + + Designer + + + \ No newline at end of file diff --git a/FieldVisualizer/InfraStructures/Enums/ColorMapsTypes.cs b/FieldVisualizer/InfraStructures/Enums/ColorMapsTypes.cs new file mode 100644 index 0000000..5be9d8c --- /dev/null +++ b/FieldVisualizer/InfraStructures/Enums/ColorMapsTypes.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace FieldVisualizer.InfraStructures.Enums +{ + public enum ColorMapsTypes + { + FullSpectrum = 0, + RedToWhite = 1, + RedToBlue = 2, + BlueToWhite = 3 + } +} diff --git a/FieldVisualizer/InfraStructures/Exceptions/FieldVisulizerException.cs b/FieldVisualizer/InfraStructures/Exceptions/FieldVisulizerException.cs new file mode 100644 index 0000000..2cf8f61 --- /dev/null +++ b/FieldVisualizer/InfraStructures/Exceptions/FieldVisulizerException.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace FieldVisualizer.InfraStructures.Exceptions +{ + public class FieldVisulizerException : Exception + { + public FieldVisulizerException(string errorString) : base(errorString) + { + } + } +} diff --git a/FieldVisualizer/InfraStructures/Strings/ErrorStrings.cs b/FieldVisualizer/InfraStructures/Strings/ErrorStrings.cs new file mode 100644 index 0000000..2531717 --- /dev/null +++ b/FieldVisualizer/InfraStructures/Strings/ErrorStrings.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace FieldVisualizer.InfraStructures.Strings +{ + public static class ErrorStrings + { + public static string ColorMapTypeIsUnknown => "#0001: ColorMap type is unknown"; + } +} diff --git a/FieldVisualizer/Services/ColorServices/ColorOperations.cs b/FieldVisualizer/Services/ColorServices/ColorOperations.cs new file mode 100644 index 0000000..c444279 --- /dev/null +++ b/FieldVisualizer/Services/ColorServices/ColorOperations.cs @@ -0,0 +1,61 @@ +using FieldVisualizer.Entities.ColorMaps; +using FieldVisualizer.Entities.Values; +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Media; + +namespace FieldVisualizer.Services.ColorServices +{ + public static class ColorOperations + { + const byte Alpha = 0xff; + public static Color GetColorByValue(IValueRange range, IColorMap map, double val) + { + double minVal = range.BottomValue; + double maxVal = range.TopValue; + if (range.TopValue == minVal || map.Colors.Count == 0) { return map.Colors[0]; } + if (val > maxVal || val < minVal) { return Colors.Gray; } + if (val == minVal) { return map.Colors[0]; } + if (val == maxVal) { return map.Colors[map.Colors.Count - 1]; } + + double valPerc = (val - minVal) / (maxVal - minVal);// value% + double colorPerc = 1d / (map.Colors.Count - 1); // % of each block of color. the last is the "100% Color" + double blockOfColor = valPerc / colorPerc;// the integer part repersents how many block to skip + int blockIdx = (int)Math.Truncate(blockOfColor);// Idx of + double valPercResidual = valPerc - (blockIdx * colorPerc);//remove the part represented of block + double percOfColor = valPercResidual / colorPerc;// % of color of this block that will be filled + + Color cTarget = map.Colors[blockIdx]; + Color cNext = map.Colors[blockIdx + 1]; + + var deltaR = cNext.R - cTarget.R; + var deltaG = cNext.G - cTarget.G; + var deltaB = cNext.B - cTarget.B; + + var R = cTarget.R + (deltaR * percOfColor); + var G = cTarget.G + (deltaG * percOfColor); + var B = cTarget.B + (deltaB * percOfColor); + + Color c = map.Colors[0]; + c = Color.FromArgb(Alpha, (byte)R, (byte)G, (byte)B); + return c; + } + public static IEnumerable GetValueColorRanges(IValueRange fullRange, IEnumerable valueRanges, IColorMap colorMap) + { + var colorRanges = new List(); + foreach (var valueRange in valueRanges) + { + IValueColorRange valueColorRange = new ValueColorRange(); + valueColorRange.IsActive = true; + valueColorRange.BottomValue = valueRange.BottomValue; + valueColorRange.AverageValue = (valueRange.BottomValue + valueRange.TopValue) / 2; + valueColorRange.TopValue = valueRange.TopValue; + valueColorRange.BottomColor = GetColorByValue(fullRange, colorMap, valueColorRange.BottomValue); + valueColorRange.TopColor = GetColorByValue(fullRange, colorMap, valueColorRange.TopValue); + colorRanges.Add(valueColorRange); + } + return colorRanges; + } + } +} diff --git a/FieldVisualizer/Services/PrimitiveServices/PrimitiveOperations.cs b/FieldVisualizer/Services/PrimitiveServices/PrimitiveOperations.cs new file mode 100644 index 0000000..a476d05 --- /dev/null +++ b/FieldVisualizer/Services/PrimitiveServices/PrimitiveOperations.cs @@ -0,0 +1,79 @@ +using FieldVisualizer.Entities.Values; +using FieldVisualizer.Entities.Values.Primitives; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + + +namespace FieldVisualizer.Services.PrimitiveServices +{ + public static class PrimitiveOperations + { + public static IValueRange GetValuRange(IEnumerable valuePrimitives) + { + double minVal =0d, maxVal = 0d; + foreach (var primitive in valuePrimitives) + { + minVal = Math.Min(minVal, primitive.Value); + maxVal = Math.Max(maxVal, primitive.Value); + } + return new ValueRange() { BottomValue = minVal, TopValue = maxVal }; + } + + public static double[] GetMinMaxX(IEnumerable valuePrimitives) + { + List coords = GetXs(valuePrimitives); + return new double[] { coords.Min(), coords.Max() }; + } + + public static double GetSizeX(IEnumerable valuePrimitives) + { + double[] coords = GetMinMaxX(valuePrimitives); + return coords[1] - coords[0]; + } + + public static double[] GetMinMaxY(IEnumerable valuePrimitives) + { + List coords = GetYs(valuePrimitives); + return new double[] { coords.Min(), coords.Max() }; + } + + public static double GetSizeY(IEnumerable valuePrimitives) + { + double[] coords = GetMinMaxY(valuePrimitives); + return coords[1] - coords[0]; + } + + public static List GetXs(IEnumerable valuePrimitives) + { + List coords = new List(); + foreach (var primitive in valuePrimitives) + { + if (primitive is IRectanglePrimitive) + { + IRectanglePrimitive rectanglePrimitive = primitive as IRectanglePrimitive; + coords.Add(rectanglePrimitive.CenterX + rectanglePrimitive.Width / 2); + coords.Add(rectanglePrimitive.CenterX - rectanglePrimitive.Width / 2); + } + } + return coords; + } + + public static List GetYs(IEnumerable valuePrimitives) + { + List coords = new List(); + foreach (var primitive in valuePrimitives) + { + if (primitive is IRectanglePrimitive) + { + IRectanglePrimitive rectanglePrimitive = primitive as IRectanglePrimitive; + coords.Add(rectanglePrimitive.CenterY + rectanglePrimitive.Height / 2); + coords.Add(rectanglePrimitive.CenterY - rectanglePrimitive.Height / 2); + } + } + return coords; + } + } +} diff --git a/FieldVisualizer/Services/ValueRanges/ValueRangeOperations.cs b/FieldVisualizer/Services/ValueRanges/ValueRangeOperations.cs new file mode 100644 index 0000000..a88f302 --- /dev/null +++ b/FieldVisualizer/Services/ValueRanges/ValueRangeOperations.cs @@ -0,0 +1,34 @@ +using FieldVisualizer.Entities.Values; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FieldVisualizer.Services.ValueRanges +{ + public static class ValueRangeOperations + { + public static IEnumerable DivideValueRange (IValueRange valueRange, int divisionNumber) + { + List valueRanges = new List(); + if (valueRange.BottomValue == valueRange.TopValue) + { + var newRange = new ValueRange() { BottomValue = valueRange.BottomValue, TopValue = valueRange.TopValue }; + valueRanges.Add(newRange); + } + else + { + double dVal = (valueRange.TopValue - valueRange.BottomValue) / divisionNumber; + double currentBottom = valueRange.BottomValue; + for (int i = 0; i < divisionNumber; i++ ) + { + currentBottom = i * dVal; + var newRange = new ValueRange() { BottomValue = currentBottom, TopValue = currentBottom + dVal }; + valueRanges.Add(newRange); + } + } + return valueRanges; + } + } +} diff --git a/FieldVisualizer/Windows/UserControls/FieldViewer.xaml b/FieldVisualizer/Windows/UserControls/FieldViewer.xaml new file mode 100644 index 0000000..a6ee17a --- /dev/null +++ b/FieldVisualizer/Windows/UserControls/FieldViewer.xaml @@ -0,0 +1,41 @@ + + + + + + + + + + + + +