diff options
| author | Roy Ben Shabat <Roy.mail.net@gmail.com> | 2024-11-25 06:28:37 +0200 |
|---|---|---|
| committer | Roy Ben Shabat <Roy.mail.net@gmail.com> | 2024-11-25 06:28:37 +0200 |
| commit | ec3b8fd0d0b4d980a5d93c5fa11b4717cbd0c875 (patch) | |
| tree | 7cf7ab368d5456003ef8a1010e0abda93530d0a6 /Software/Visual_Studio | |
| parent | 9e9a565b76877c7bcedd82639c4b5f851196ea90 (diff) | |
| download | Tango-ec3b8fd0d0b4d980a5d93c5fa11b4717cbd0c875.tar.gz Tango-ec3b8fd0d0b4d980a5d93c5fa11b4717cbd0c875.zip | |
Blending calibration interpolation.
Diffstat (limited to 'Software/Visual_Studio')
3 files changed, 79 insertions, 2 deletions
diff --git a/Software/Visual_Studio/Tango.ColorConversion/ColorBlending/BlendableColor.cs b/Software/Visual_Studio/Tango.ColorConversion/ColorBlending/BlendableColor.cs index 231c6602d..194dc9ac4 100644 --- a/Software/Visual_Studio/Tango.ColorConversion/ColorBlending/BlendableColor.cs +++ b/Software/Visual_Studio/Tango.ColorConversion/ColorBlending/BlendableColor.cs @@ -5,6 +5,7 @@ using System.Text; using System.Threading.Tasks; using System.Windows.Media; using Tango.Core.Helpers; +using Tango.PMR.ColorLab; namespace Tango.ColorConversion.ColorBlending { @@ -15,6 +16,16 @@ namespace Tango.ColorConversion.ColorBlending // Blending level (0 to 100) public double Volume { get; set; } + public CalibrationData CalibrationData { get; set; } + + // Get corrected volume using the calibration table + public double CorrectedVolume => GetCalibratedVolume(Volume); + + public BlendableColor() + { + CalibrationData = new CalibrationData(); + } + public BlendableColor(Color color, double volume) { Color = color; @@ -25,5 +36,39 @@ namespace Tango.ColorConversion.ColorBlending { } + + public BlendableColor(int color, double volume, CalibrationData calibrationData) : this(color, volume) + { + CalibrationData = calibrationData; + } + + public double GetCalibratedVolume(double input) + { + if (CalibrationData == null || CalibrationData.CalibrationPoints.Count < 2) return input; + + // If the input is less than the first point, return the first Y value + if (input <= CalibrationData.CalibrationPoints[0].X) + return CalibrationData.CalibrationPoints[0].Y; + + // If the input is greater than the last point, return the last Y value + if (input >= CalibrationData.CalibrationPoints[CalibrationData.CalibrationPoints.Count - 1].X) + return CalibrationData.CalibrationPoints[CalibrationData.CalibrationPoints.Count - 1].Y; + + // Find the correct interval for interpolation + for (int i = 0; i < CalibrationData.CalibrationPoints.Count - 1; i++) + { + var p1 = CalibrationData.CalibrationPoints[i]; + var p2 = CalibrationData.CalibrationPoints[i + 1]; + + if (p1.X <= input && input <= p2.X) + { + // Perform linear interpolation + return p1.Y + (input - p1.X) * (p2.Y - p1.Y) / (p2.X - p1.X); + } + } + + // Fallback, though we shouldn't reach here + throw new InvalidOperationException("Interpolation failed. Check calibration points."); + } } } diff --git a/Software/Visual_Studio/Tango.ColorConversion/ColorBlending/ColorBlender.cs b/Software/Visual_Studio/Tango.ColorConversion/ColorBlending/ColorBlender.cs index c344bdb08..91813b91f 100644 --- a/Software/Visual_Studio/Tango.ColorConversion/ColorBlending/ColorBlender.cs +++ b/Software/Visual_Studio/Tango.ColorConversion/ColorBlending/ColorBlender.cs @@ -11,6 +11,8 @@ namespace Tango.ColorConversion.ColorBlending { public static Color BlendColors(Color baseColor, List<BlendableColor> colorsToBlend) { + colorsToBlend.Where(x => x.CalibrationData == null || x.CalibrationData.CalibrationPoints.Count < 2).ToList().ForEach(x => x.Volume.Clamp(0, 100)); + // Convert base color to [0, 1] range double baseR = baseColor.R / 255.0; double baseG = baseColor.G / 255.0; @@ -29,7 +31,8 @@ namespace Tango.ColorConversion.ColorBlending double blendB = blendableColor.Color.B / 255.0; // Calculate the weight factor (volume scaled to [0, 1]) - double weight = blendableColor.Volume / 100.0; + double correctedVolume = blendableColor.CorrectedVolume; + double weight = correctedVolume / 100.0; // Apply subtractive blending blendedR = blendedR * (1 - weight) + blendR * weight; diff --git a/Software/Visual_Studio/Tango.ColorConversion/DefaultColorConverter.cs b/Software/Visual_Studio/Tango.ColorConversion/DefaultColorConverter.cs index e6c28add5..59741cb5d 100644 --- a/Software/Visual_Studio/Tango.ColorConversion/DefaultColorConverter.cs +++ b/Software/Visual_Studio/Tango.ColorConversion/DefaultColorConverter.cs @@ -107,7 +107,7 @@ namespace Tango.ColorConversion foreach (var input in conversionInput.InputCoordinates.InputLiquids.Where(x => x.IsExtraInk && x.Volume > 0)) { - extraInkColors.Add(new BlendableColor(input.Color, input.Volume)); + extraInkColors.Add(new BlendableColor(input.Color, input.Volume, input.CalibrationData)); } BlendOutputCoordinates(output.SingleCoordinates, extraInkColors); @@ -121,10 +121,39 @@ namespace Tango.ColorConversion } } } + else + { + ResetExtraInks(output.SingleCoordinates, conversionInput); + + if (conversionInput.GenerateHive) + { + foreach (var coords in output.HiveCoordinates) + { + ResetExtraInks(coords, conversionInput); + } + } + } return output; } + private void ResetExtraInks(OutputCoordinates output, ConversionInput input) + { + foreach (var inputLiquid in input.InputCoordinates.InputLiquids.Where(x => x.IsExtraInk)) + { + var outputLiquid = output.OutputLiquids.FirstOrDefault(x => x.LiquidType == inputLiquid.LiquidType); + + if (outputLiquid != null) + { + outputLiquid.Volume = 0; + } + else + { + output.OutputLiquids.Add(new OutputLiquid() { LiquidType = inputLiquid.LiquidType, Volume = 0 }); + } + } + } + private void BlendOutputCoordinates(OutputCoordinates output, List<BlendableColor> blendableColors) { Color baseColor = Color.FromRgb((byte)output.Red, (byte)output.Green, (byte)output.Blue); |
