Пример #1
0
        /// <summary>
        /// Processes the specified args.
        /// </summary>
        /// <param name="args">The args.</param>
        public override void Process([NotNull] ServicePipelineArgs args)
        {
            Assert.ArgumentNotNull(args, "args");

            using (var nopServiceClient = this.GetClient())
            {
                var categories = nopServiceClient.GetAllCategories();

                var productClassifications =
                    categories.Select(
                        x =>
                {
                    Classification classification   = this.InstantiateEntity <Classification>();
                    classification.ExternalId       = x.Id;
                    classification.ExternalParentId = x.ParentCategoryId;
                    classification.Description      = x.Description;
                    classification.Name             = x.Name;
                    classification.Created          = x.CreatedOnUtc;
                    classification.Updated          = x.UpdatedOnUtc;
                    return(classification);
                }).ToList();

                ClassificationGroup classificationGroup = this.InstantiateEntity <ClassificationGroup>();

                classificationGroup.Classifications = productClassifications.AsReadOnly();
                classificationGroup.Name            = this.productClassificationGroupName;
                classificationGroup.ExternalId      = this.productClassificationGroupExternalId;
                classificationGroup.Updated         = DateTime.UtcNow;

                args.Request.Properties["ClassificationGroups"] = new List <ClassificationGroup>
                {
                    classificationGroup
                };
                nopServiceClient.Close();
            }
        }
        public static ClassificationResult Classify(IList <Color> colors)
        {
            if (colors == null || colors.Count() != 96)
            {
                throw new Exception("Impossible d'obtenir le cube car une quantité différente de 96 couleurs a été transmise au classifier");
            }

            var groups = new List <ClassificationGroup>(6);


            var points = new List <ClassifiedPoint>(96);

            for (int i = 0; i < 96; i++)
            {
                points.Add(new ClassifiedPoint(colors[i]));
            }

            //  distances entre points deux à deux trier par ordre croissant
            var distances = new List <Distance>();

            for (int i = 0; i < 96; i++)
            {
                for (int j = i + 1; j < 96; j++)
                {
                    var dx = (points[i].MeasuredColor.R - points[j].MeasuredColor.R);
                    var dy = (points[i].MeasuredColor.G - points[j].MeasuredColor.G);
                    var dz = (points[i].MeasuredColor.B - points[j].MeasuredColor.B);
                    var d  = dx * dx + dy * dy + dz * dz;

                    points[i].Distance[points[j]] = d;
                    points[j].Distance[points[i]] = d;

                    distances.Add(new Distance(points[i], points[j], d));
                }
            }

            distances.Sort((x, y) => x.PointDistance - y.PointDistance);

            for (int igGrp = 0; igGrp < 6; igGrp++)
            {
                // trouver la paire de point la plus proche qui n'appartient pas encore à un groupe
                var nearest = distances.FirstOrDefault((x) => x.Point1.Group == null && x.Point2.Group == null);

                var group = new ClassificationGroup(igGrp);

                // les ajouter au groupe
                group.Add(nearest.Point1);
                group.Add(nearest.Point2);

                // ajouter les 14 plus proches
                for (int i = 0; i < 14; i++)
                {
                    group.AddNearest();
                }

                groups.Add(group);
            }

            var res = new ClassificationResult();

            res.Groups = groups;
            res.Points = points;

            return(res);
        }