Example #1
0
        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);
        }
Example #2
0
        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));
        }
Example #3
0
        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));
        }
Example #4
0
 private static double GetWeightingFactor2(double distance, ObserverData observerData)
 {
     return(1 / (distance / observerData.AverageRange));
 }
Example #5
0
        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));
        }
Example #6
0
        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));
        }