aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio
diff options
context:
space:
mode:
authorRoy Ben Shabat <Roy.mail.net@gmail.com>2024-11-25 06:28:37 +0200
committerRoy Ben Shabat <Roy.mail.net@gmail.com>2024-11-25 06:28:37 +0200
commitec3b8fd0d0b4d980a5d93c5fa11b4717cbd0c875 (patch)
tree7cf7ab368d5456003ef8a1010e0abda93530d0a6 /Software/Visual_Studio
parent9e9a565b76877c7bcedd82639c4b5f851196ea90 (diff)
downloadTango-ec3b8fd0d0b4d980a5d93c5fa11b4717cbd0c875.tar.gz
Tango-ec3b8fd0d0b4d980a5d93c5fa11b4717cbd0c875.zip
Blending calibration interpolation.
Diffstat (limited to 'Software/Visual_Studio')
-rw-r--r--Software/Visual_Studio/Tango.ColorConversion/ColorBlending/BlendableColor.cs45
-rw-r--r--Software/Visual_Studio/Tango.ColorConversion/ColorBlending/ColorBlender.cs5
-rw-r--r--Software/Visual_Studio/Tango.ColorConversion/DefaultColorConverter.cs31
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);