public static xyYColour GetClosestXy(xyYColour xyYcolour, ObserverData observerData) { var meta = new LinqMetaData(); xyYColour closestColour = null; double closestDistance = double.MaxValue; foreach (xyYColour colour in observerData.ColourData.Keys) { double distance = ColourUtil.Delta3D(colour.x, colour.y, 0, xyYcolour.x, xyYcolour.y, 0, 8); if (distance < closestDistance) { closestDistance = distance; closestColour = xyYColour.FromxyY(colour.x, colour.y, colour.Y); } } return(closestColour); }
public static double GetWeightingFactor(xyYColour xyYControlCol, double angle, ColourAngleSet angleSet, ObserverData observerData) { //Get the closest angle xyYColour closestAngleColour = null; //TODO: Increase accuracy only if this whole colour system seems to be working foreach (var colourAtAngle in angleSet) { if (ColourUtil.Delta(angle, colourAtAngle.Key) < 45) { closestAngleColour = colourAtAngle.Value; } } double realDeltaDIff = ColourUtil.Delta3D(closestAngleColour.x, closestAngleColour.y, 0, xyYControlCol.x, xyYControlCol.y, 0, 4); return(1 / (realDeltaDIff / observerData.AverageRange)); }
public static IEnumerable <xyYColour> GetThreeClosestColours(xyYColour refColour, ObserverData observer) { var closest = new List <xyYColour>(); var orderedByDistance = observer.ColourData.Select(kvp => new { Colour = kvp.Key, Distance = ColourUtil.Delta3D(refColour.x, refColour.y, refColour.Y, kvp.Key.x, kvp.Key.y, kvp.Key.Y, 8) }); orderedByDistance = orderedByDistance.OrderBy(item => item.Distance); return(orderedByDistance.Take(3).Select(item => item.Colour)); }
private static double GetWeightingFactor2(double distance, ObserverData observerData) { return(1 / (distance / observerData.AverageRange)); }
public static double GetWeight2(RGBColour rgbColourSource, RGBColour rgbColourCompare, ObserverData observerData) { XYZColour xyzColSource = ColourUtil.RGBtoXYZ(rgbColourSource); xyYColour colAsxyYSource = xyYColour.FromXYZ(xyzColSource); XYZColour xyzColCompare = ColourUtil.RGBtoXYZ(rgbColourCompare); xyYColour colAsxyYCompare = xyYColour.FromXYZ(xyzColCompare); //****Do calc**** double angle = ColourUtil.CalcAngle(colAsxyYSource.x, colAsxyYSource.y, colAsxyYCompare.x, colAsxyYCompare.y); //NEW BRANCH: Get 3 closest xy colours IEnumerable <xyYColour> closest3 = Interpolation.GetThreeClosestColours(colAsxyYSource, observerData); double influenceA, influenceB, influenceC; xyYColour pA = closest3.ElementAt(0); xyYColour pB = closest3.ElementAt(1); xyYColour pC = closest3.ElementAt(2); Interpolation.GetInfluence(colAsxyYSource, pA, pB, pC, out influenceA, out influenceB, out influenceC); xyYColour colourAtAngleA = GetClosestAngleColour(observerData.ColourData[pA], angle); xyYColour colourAtAngleB = GetClosestAngleColour(observerData.ColourData[pB], angle); xyYColour colourAtAngleC = GetClosestAngleColour(observerData.ColourData[pC], angle); double distanceA = ColourUtil.Delta3D(pA.x, pA.y, 0, colourAtAngleA.x, colourAtAngleA.y, 0, 8); double distanceB = ColourUtil.Delta3D(pB.x, pB.y, 0, colourAtAngleB.x, colourAtAngleB.y, 0, 8); double distanceC = ColourUtil.Delta3D(pC.x, pC.y, 0, colourAtAngleC.x, colourAtAngleC.y, 0, 8); double interpolatedDistance = Interpolation.GetInterpolatedDistance(distanceA, distanceB, distanceC, influenceA, influenceB, influenceC); return(GetWeightingFactor2(interpolatedDistance, observerData)); }
public static double GetWeight(RGBColour rgbColourSource, RGBColour rgbColourCompare, ObserverData observerData) { XYZColour xyzColSource = ColourUtil.RGBtoXYZ(rgbColourSource); xyYColour colAsxyYSource = xyYColour.FromXYZ(xyzColSource); XYZColour xyzColCompare = ColourUtil.RGBtoXYZ(rgbColourCompare); xyYColour colAsxyYCompare = xyYColour.FromXYZ(xyzColCompare); //****Do calc**** double angle = ColourUtil.CalcAngle(colAsxyYSource.x, colAsxyYSource.y, colAsxyYCompare.x, colAsxyYCompare.y); xyYColour closestObserverSample = GetClosestXy(colAsxyYSource, observerData); //NEW BRANCH: Get 3 closest xy colours ColourAngleSet angleSet = observerData.ColourData[closestObserverSample]; return(GetWeightingFactor(closestObserverSample, angle, angleSet, observerData)); }