diff --git a/FieldVisualizer/Entities/ColorMaps/Factories/ColorMapFactory.cs b/FieldVisualizer/Entities/ColorMaps/Factories/ColorMapFactory.cs index e204fcb..b5c0010 100644 --- a/FieldVisualizer/Entities/ColorMaps/Factories/ColorMapFactory.cs +++ b/FieldVisualizer/Entities/ColorMaps/Factories/ColorMapFactory.cs @@ -7,6 +7,9 @@ using System.Windows.Media; namespace FieldVisualizer.Entities.ColorMaps.Factories { + /// + /// Factory for creating of different color maps + /// public static class ColorMapFactory { public static IColorMap GetColorMap(ColorMapsTypes mapsTypes) diff --git a/FieldVisualizer/Entities/Values/Primitives/CirclePrimitive.cs b/FieldVisualizer/Entities/Values/Primitives/CirclePrimitive.cs new file mode 100644 index 0000000..b44a723 --- /dev/null +++ b/FieldVisualizer/Entities/Values/Primitives/CirclePrimitive.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 CirclePrimitive : ICirclePrimitive + { + public double Diameter { get; set; } + public double Value { get; set; } + public double CenterX { get; set; } + public double CenterY { get; set; } + public double Area => Math.PI * Math.Pow(Diameter, 2) / 4; + } +} diff --git a/FieldVisualizer/Entities/Values/Primitives/ICirclePrimitive.cs b/FieldVisualizer/Entities/Values/Primitives/ICirclePrimitive.cs new file mode 100644 index 0000000..af9d2d5 --- /dev/null +++ b/FieldVisualizer/Entities/Values/Primitives/ICirclePrimitive.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FieldVisualizer.Entities.Values.Primitives +{ + /// + /// Represent circle primitive + /// + public interface ICirclePrimitive : IValuePrimitive + { + double Diameter { get; set; } + } +} diff --git a/FieldVisualizer/Entities/Values/Primitives/IValuePrimitive.cs b/FieldVisualizer/Entities/Values/Primitives/IValuePrimitive.cs index 93a36f9..57cbda4 100644 --- a/FieldVisualizer/Entities/Values/Primitives/IValuePrimitive.cs +++ b/FieldVisualizer/Entities/Values/Primitives/IValuePrimitive.cs @@ -11,5 +11,6 @@ namespace FieldVisualizer.Entities.Values.Primitives double Value { get; } double CenterX { get; } double CenterY { get; } + double Area { get; } } } diff --git a/FieldVisualizer/Entities/Values/Primitives/RectanglePrimitive.cs b/FieldVisualizer/Entities/Values/Primitives/RectanglePrimitive.cs index 134d596..d4d2ae5 100644 --- a/FieldVisualizer/Entities/Values/Primitives/RectanglePrimitive.cs +++ b/FieldVisualizer/Entities/Values/Primitives/RectanglePrimitive.cs @@ -13,5 +13,6 @@ namespace FieldVisualizer.Entities.Values.Primitives public double Value { get; set; } public double CenterX { get; set; } public double CenterY { get; set; } + public double Area => Height * Width; } } diff --git a/FieldVisualizer/InfraStructures/Comands/RelayCommand.cs b/FieldVisualizer/InfraStructures/Comands/RelayCommand.cs new file mode 100644 index 0000000..130de8f --- /dev/null +++ b/FieldVisualizer/InfraStructures/Comands/RelayCommand.cs @@ -0,0 +1,27 @@ +using System; +using System.Windows.Input; + +namespace FieldVisualizer.Infrastructure.Commands +{ + public class RelayCommand : ICommand + { + private Action execute; + private Func canExecute; + + public event EventHandler CanExecuteChanged + { + add => CommandManager.RequerySuggested += value; + remove => CommandManager.RequerySuggested -= value; + } + + public RelayCommand(Action execute, Func canExecute = null) + { + this.execute = execute; + this.canExecute = canExecute; + } + + public bool CanExecute(object parameter) => canExecute == null || canExecute(parameter); + + public void Execute(object parameter) => execute(parameter); + } +} diff --git a/FieldVisualizer/InfraStructures/Strings/ErrorStrings.cs b/FieldVisualizer/InfraStructures/Strings/ErrorStrings.cs index 2531717..dd2e0da 100644 --- a/FieldVisualizer/InfraStructures/Strings/ErrorStrings.cs +++ b/FieldVisualizer/InfraStructures/Strings/ErrorStrings.cs @@ -7,5 +7,6 @@ namespace FieldVisualizer.InfraStructures.Strings public static class ErrorStrings { public static string ColorMapTypeIsUnknown => "#0001: ColorMap type is unknown"; + public static string PrimitiveTypeIsUnknown => "#0002: Type of primitive is unknown"; } } diff --git a/FieldVisualizer/Services/ColorServices/ColorOperations.cs b/FieldVisualizer/Services/ColorServices/ColorOperations.cs index c444279..17f0386 100644 --- a/FieldVisualizer/Services/ColorServices/ColorOperations.cs +++ b/FieldVisualizer/Services/ColorServices/ColorOperations.cs @@ -12,17 +12,19 @@ namespace FieldVisualizer.Services.ColorServices const byte Alpha = 0xff; public static Color GetColorByValue(IValueRange range, IColorMap map, double val) { - double minVal = range.BottomValue; - double maxVal = range.TopValue; + double minVal = range.BottomValue - 1e-15d*(Math.Abs(range.BottomValue)); + double maxVal = range.TopValue + 1e-15d * (Math.Abs(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" + //if (valPerc == 1d) + //{ return map.Colors[map.Colors.Count - 1]; } + double colorPerc = 1d / (map.Colors.Count - 1d); // % 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 + 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 diff --git a/FieldVisualizer/Services/PrimitiveServices/PrimitiveOperations.cs b/FieldVisualizer/Services/PrimitiveServices/PrimitiveOperations.cs index a476d05..c043a8c 100644 --- a/FieldVisualizer/Services/PrimitiveServices/PrimitiveOperations.cs +++ b/FieldVisualizer/Services/PrimitiveServices/PrimitiveOperations.cs @@ -1,5 +1,7 @@ using FieldVisualizer.Entities.Values; using FieldVisualizer.Entities.Values.Primitives; +using FieldVisualizer.InfraStructures.Exceptions; +using FieldVisualizer.InfraStructures.Strings; using System; using System.Collections.Generic; using System.Linq; @@ -11,7 +13,7 @@ namespace FieldVisualizer.Services.PrimitiveServices { public static class PrimitiveOperations { - public static IValueRange GetValuRange(IEnumerable valuePrimitives) + public static IValueRange GetValueRange(IEnumerable valuePrimitives) { double minVal =0d, maxVal = 0d; foreach (var primitive in valuePrimitives) @@ -57,6 +59,13 @@ namespace FieldVisualizer.Services.PrimitiveServices coords.Add(rectanglePrimitive.CenterX + rectanglePrimitive.Width / 2); coords.Add(rectanglePrimitive.CenterX - rectanglePrimitive.Width / 2); } + else if (primitive is ICirclePrimitive) + { + ICirclePrimitive circlePrimitive = primitive as ICirclePrimitive; + coords.Add(circlePrimitive.CenterX + circlePrimitive.Diameter / 2); + coords.Add(circlePrimitive.CenterX - circlePrimitive.Diameter / 2); + } + else { throw new FieldVisulizerException(ErrorStrings.PrimitiveTypeIsUnknown);} } return coords; } @@ -72,6 +81,13 @@ namespace FieldVisualizer.Services.PrimitiveServices coords.Add(rectanglePrimitive.CenterY + rectanglePrimitive.Height / 2); coords.Add(rectanglePrimitive.CenterY - rectanglePrimitive.Height / 2); } + else if (primitive is ICirclePrimitive) + { + ICirclePrimitive circlePrimitive = primitive as ICirclePrimitive; + coords.Add(circlePrimitive.CenterY + circlePrimitive.Diameter / 2); + coords.Add(circlePrimitive.CenterY - circlePrimitive.Diameter / 2); + } + else { throw new FieldVisulizerException(ErrorStrings.PrimitiveTypeIsUnknown); } } return coords; } diff --git a/FieldVisualizer/Services/ValueRanges/ValueRangeOperations.cs b/FieldVisualizer/Services/ValueRanges/ValueRangeOperations.cs index a88f302..bdd6adb 100644 --- a/FieldVisualizer/Services/ValueRanges/ValueRangeOperations.cs +++ b/FieldVisualizer/Services/ValueRanges/ValueRangeOperations.cs @@ -20,10 +20,11 @@ namespace FieldVisualizer.Services.ValueRanges else { double dVal = (valueRange.TopValue - valueRange.BottomValue) / divisionNumber; - double currentBottom = valueRange.BottomValue; + double startBottom = valueRange.BottomValue; for (int i = 0; i < divisionNumber; i++ ) { - currentBottom = i * dVal; + + double currentBottom = startBottom + i * dVal; var newRange = new ValueRange() { BottomValue = currentBottom, TopValue = currentBottom + dVal }; valueRanges.Add(newRange); } diff --git a/FieldVisualizer/Windows/UserControls/FieldViewer.xaml b/FieldVisualizer/Windows/UserControls/FieldViewer.xaml index a6ee17a..6ba2b54 100644 --- a/FieldVisualizer/Windows/UserControls/FieldViewer.xaml +++ b/FieldVisualizer/Windows/UserControls/FieldViewer.xaml @@ -17,10 +17,10 @@ -