Пример #1
0
        public static ColourAngleSet GetEachAvgAngle(xyYColour colour)
        {
            ColourAngleSet avgColours = new ColourAngleSet();

            IEnumerable <IGrouping <double, ObserverDataSetColourEntity> > colAngleGroups = GetAngleGroupsForColour(colour);

            foreach (var colAngleGroup in colAngleGroups)
            {
                double x = 0, y = 0, Y = colour.Y;
                int    colourCount = colAngleGroup.Count();


                foreach (ObserverDataSetColourEntity colourEntity in colAngleGroup)
                {
                    x += colourEntity.XyY_x;
                    y += colourEntity.XyY_y;
                }

                x = x / colourCount;
                y = y / colourCount;
                xyYColour newAvg = xyYColour.FromxyY(x, y, Y);
                avgColours.Add(colAngleGroup.Key, newAvg);
            }

            return(avgColours);
        }
Пример #2
0
        private void LoadData()
        {
            _colourData = new Dictionary <xyYColour, ColourAngleSet>();


            var meta = new LinqMetaData();


            //We get all control colours that are not set to skip
            IQueryable <ControlSetColourEntity> controlCOlours = from col in meta.ControlSetColour
                                                                 where col.Skip == false
                                                                 select col;

            foreach (ControlSetColourEntity controlSetColourEntity in controlCOlours)
            {
                //Create an xyY Colour
                xyYColour xyYControlCOlour = xyYColour.FromxyY(controlSetColourEntity.XyY_x, controlSetColourEntity.XyY_y,
                                                               controlSetColourEntity.XyY_YY);

                ColourAngleSet angleSet = GetEachAvgAngle(xyYControlCOlour);

                _colourData.Add(xyYControlCOlour, angleSet);
            }

            CalculateMinMaxRange();
        }
Пример #3
0
        public static void GetInfluence(xyYColour pK,
                                        xyYColour pA,
                                        xyYColour pB,
                                        xyYColour pC,
                                        out double influenceA,
                                        out double influenceB,
                                        out double influenceC)
        {
            //1.	Get the 3 delta's (Euclidian distance) A, B, C from point K to point pA, pB, pC
            double deltaA = ColourUtil.Delta3D(pK.x, pK.y, pK.Y, pA.x, pA.y, pA.Y, 8);
            double deltaB = ColourUtil.Delta3D(pK.x, pK.y, pK.Y, pB.x, pB.y, pB.Y, 8);
            double deltaC = ColourUtil.Delta3D(pK.x, pK.y, pK.Y, pC.x, pC.y, pC.Y, 8);

            //2.	Inverse each distance and call invA, invB, invC
            double inverseA = 1 / deltaA;
            double inverseB = 1 / deltaB;
            double inverseC = 1 / deltaC;

            //3.	Let  t = invA + invB + invC
            double total = inverseA + inverseB + inverseC;

            //4.	divide each invA invB and invC by t. This yields the resulting influence  ia, ib, ic
            influenceA = inverseA / total;
            influenceB = inverseB / total;
            influenceC = inverseC / total;
        }
Пример #4
0
        private void btnUpdateRGB_Click(object sender, RoutedEventArgs e)
        {
            SetOutOfGamut(false);
            double r = double.Parse(txtR.Text);
            double g = double.Parse(txtG.Text);
            double b = double.Parse(txtB.Text);

            RGBColour rgb = RGBColour.FromRGB(r, g, b);

            XYZColour xyzcColour = ColourUtil.RGBtoXYZ(rgb);

            xyYColour xyYCol = xyYColour.FromXYZ(xyzcColour);

            txtXYZ_X.Text = xyzcColour.X.ToString();
            txtXYZ_Y.Text = xyzcColour.Y.ToString();
            txtXYZ_Z.Text = xyzcColour.Z.ToString();

            txtxyY_x.Text = xyYCol.x.ToString();
            txtxyY_y.Text = xyYCol.y.ToString();
            txtxyY_Y.Text = xyYCol.Y.ToString();

            Color newColourForRectangle = Color.FromRgb((byte)r, (byte)g, (byte)b);

            SolidColorBrush brush = new SolidColorBrush(newColourForRectangle);

            rectColour.Fill = brush;
        }
Пример #5
0
        private void btnUpdatexyY_Click(object sender, RoutedEventArgs e)
        {
            SetOutOfGamut(false);
            double x = double.Parse(txtxyY_x.Text);
            double y = double.Parse(txtxyY_y.Text);
            double Y = double.Parse(txtxyY_Y.Text);

            xyYColour xyYCol = xyYColour.FromxyY(x, y, Y);

            XYZColour xyzColour = xyYCol.ToXYZColour();

            RGBColour rgbColour = ColourUtil.XYZTosRGB(xyzColour);

            txtR.Text = rgbColour.R.ToString();
            txtG.Text = rgbColour.G.ToString();
            txtB.Text = rgbColour.B.ToString();

            txtXYZ_X.Text = xyzColour.X.ToString();
            txtXYZ_Y.Text = xyzColour.Y.ToString();
            txtXYZ_Z.Text = xyzColour.Z.ToString();

            Color newColourForRectangle = Color.FromRgb((byte)rgbColour.R, (byte)rgbColour.G, (byte)rgbColour.B);

            SolidColorBrush brush = new SolidColorBrush(newColourForRectangle);

            rectColour.Fill = brush;

            SetOutOfGamut(rgbColour.OutOfGamut);
        }
Пример #6
0
        private Color GetColorFromXYY(xyYColour xyy)
        {
            XYZColour xyz   = xyy.ToXYZColour();
            RGBColour rgb   = ColourUtil.XYZTosRGB(xyz);
            Color     color = Color.FromRgb((byte)rgb.R, (byte)rgb.G, (byte)rgb.B);

            return(color);
        }
Пример #7
0
        public ColourStepEngine(double startOffset, double adjustSize, double x, double y, double Y)
        {
            _startOffset = startOffset;
            _adjustSize  = adjustSize;

            _controlxyYColour = xyYColour.FromxyY(x, y, Y);

            //Generate All colours for steps before hand!

            NextAngle();
        }
Пример #8
0
        private bool IsOutOfGamut(xyYColour xyy)
        {
            double x = Math.Round(xyy.x, 5, MidpointRounding.ToEven);
            double y = Math.Round(xyy.y, 5, MidpointRounding.ToEven);

            xyYColour temp = xyYColour.FromxyY(x, y, xyy.Y);

            XYZColour xyz = temp.ToXYZColour();
            RGBColour rgb = ColourUtil.XYZTosRGB(xyz);

            return(rgb.OutOfGamut);
        }
Пример #9
0
        public static double GetAvgDistanceForPerceptualLikeness(xyYColour xyYControlCol,
                                                                 IDictionary <double, xyYColour> averagedColours)
        {
            double distAvg = 0;

            foreach (var avgColour in averagedColours)
            {
                distAvg += ColourUtil.Delta3D(avgColour.Value.x, avgColour.Value.y, 0, xyYControlCol.x,
                                              xyYControlCol.y, 0, 4);
            }

            return(distAvg / 8);
        }
Пример #10
0
        private bool SetNextControlColour()
        {
            if (CurrentControlColourIndex == _controlColours.Length - 1)
            {
                return(true);
            }
            _currentControlColourIndex = CurrentControlColourIndex + 1;

            xyYColour currentColour = _controlColours[CurrentControlColourIndex];

            ColourStepEngine = new ColourStepEngine(StartOffset, AdjustSize, currentColour.x, currentColour.y, currentColour.Y);
            return(false);
        }
Пример #11
0
        private Color GetColorFromXYY(xyYColour xyy)
        {
            double x = Math.Round(xyy.x, 5, MidpointRounding.ToEven);
            double y = Math.Round(xyy.y, 5, MidpointRounding.ToEven);

            xyYColour temp = xyYColour.FromxyY(x, y, xyy.Y);

            XYZColour xyz   = temp.ToXYZColour();
            RGBColour rgb   = ColourUtil.XYZTosRGB(xyz);
            Color     color = Color.FromArgb(0, (byte)rgb.R, (byte)rgb.G, (byte)rgb.B);

            return(color);
        }
Пример #12
0
        public static xyYColour GetClosestAngleColour(ColourAngleSet angleSet, double 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;
                }
            }
            return(closestAngleColour);
        }
Пример #13
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));
        }
Пример #14
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);
        }
Пример #15
0
        public bool AcceptColourAtAngle()
        {
            CurrentStep++;
            xyYColour currentColour  = CurrentControlColour;
            xyYColour acceptedCOlour = ColourStepEngine.CurrentStepColour;

            ObserverDataSetColourEntity observerDataSetColourEntity = new ObserverDataSetColourEntity();

            //observerDataSetColourEntity.ObserverDataSetUID = _observerDataSet.UID;
            //observerDataSetColourEntity.ObserverDataSet = _observerDataSet;
            observerDataSetColourEntity.ControlSetColourUID = 0;
            observerDataSetColourEntity.SubmitDateTime      = DateTime.Now;
            //TODO: Do Not Accept Out Of Gamut
            observerDataSetColourEntity.OutOfGamut    = false;
            observerDataSetColourEntity.Angle         = ColourStepEngine.CurrentAngle;
            observerDataSetColourEntity.ControlxyY_x  = currentColour.x;
            observerDataSetColourEntity.ControlxyY_y  = currentColour.y;
            observerDataSetColourEntity.ControlxyY_YY = currentColour.Y;
            observerDataSetColourEntity.XyY_x         = acceptedCOlour.x;
            observerDataSetColourEntity.XyY_y         = acceptedCOlour.y;
            observerDataSetColourEntity.XyY_YY        = acceptedCOlour.Y;

            _observerDataSet.ObserverDataSetColourCollection.Add(observerDataSetColourEntity);
            //observerDataSetColourEntity.Save();

            if (!this.ColourStepEngine.NextAngle())
            {
                return(false);
            }

            bool done = SetNextControlColour();

            if (done)
            {
                //Email Dave
                _observerDataSet.EndDateTime = DateTime.Now;
                _observerDataSet.Save(true);
            }

            return(done);
        }
Пример #16
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));
        }
Пример #17
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));
        }
Пример #18
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));
        }
Пример #19
0
        private static IEnumerable <IGrouping <double, ObserverDataSetColourEntity> > GetAngleGroupsForColour(xyYColour colour)
        {
            var meta = new LinqMetaData();

            return((from col in meta.ObserverDataSetColour
                    where
                    col.ControlxyY_x == colour.x &&
                    col.ControlxyY_y == colour.y
                    group col by col.Angle
                    into gcol
                    select gcol).AsEnumerable());
        }