Пример #1
0
        private void DoAnalysis(List <Individual> indvds, Rectangle viewport)
        {
            if (indvds.Count() > 0)
            {
                //string robinstxt = "";
                //foreach (var indvd in indvds)
                //{
                //    robinstxt += "" + Normalizer.NormalizeWidthCentered((float)indvd.X) + "," + Normalizer.NormalizeHeight((float)indvd.Y) + ",";
                //}

                tempClusters.Clear();

                tempClusters.Add(new Cluster()
                {
                    indvds[0]
                });

                for (int i = 0; i < indvds.Count; i++)
                {
                    ResetColor(indvds[i]);
                    if (!InExistingCluster(indvds[i]))
                    {
                        tempClusters.Add(new Cluster()
                        {
                            indvds[i]
                        });
                    }
                }

                RemoveSmallClusters();

                #region Update
                foreach (Cluster cluster in tempClusters)
                {
                    cluster.Update();
                }
                #endregion

                #region Persisted Clusters
                //Update persisting clusters


                for (int n = 0; n < trackedClusters.Count; n++)
                {
                    var trackedClusterValues = trackedClusters.Select(e => e.Value.IdentifyingAgent).ToList();

                    #region Try to add cluster to tracked clusters
                    //Can only add if there is an open cluster
                    if (trackedClusterValues[n] == -2)
                    {
                        Cluster tempCluster = null;

                        foreach (Cluster cluster in tempClusters)
                        {
                            bool flag = false;

                            foreach (Individual indvd in cluster)
                            {
                                foreach (int value in trackedClusterValues)
                                {
                                    if (indvd.ID == value)
                                    {
                                        flag = true;
                                    }
                                }
                            }

                            if (!flag)
                            {
                                tempCluster = cluster;
                            }
                        }


                        if (tempCluster != null)
                        {
                            //TODO: Why should i have to do this
                            bool really = trackedClusterValues.Contains(tempCluster.GetPointNearestToCenter());
                            if (!really && trackedClusters[n].IdentifyingAgent == -2)
                            {
                                //SoundEngine.StartCluster(n);
                                trackedClusters[n] = new PersistedCluster()
                                {
                                    IdentifyingAgent = tempCluster.GetPointNearestToCenter(), ColorID = trackedClusters[n].ColorID
                                };
                                continue;
                            }
                        }
                    }
                    #endregion

                    bool updated = false;

                    foreach (Cluster cluster in tempClusters.Where(c => c.Any(g => trackedClusterValues.Contains(g.ID))).ToList <Cluster>())
                    {
                        if (cluster.Any(i => i.ID == trackedClusters[n].IdentifyingAgent))
                        {
                            var multiples = cluster.Where(z => trackedClusterValues.Contains(z.ID));
                            if (multiples.Count() <= 1)
                            {
                                //this cluster is being tracked
                                SetClusterColor(cluster, n);
                                updated = true;
                            }
                            else
                            {
                                //There is more than one id tracked id in the cluster
                                var  multiplesValues = multiples.Select(i => i.ID);
                                bool firstpass       = true;
                                for (int i = 0; i < trackedClusters.Count(); i++)//var t in  trackedClusters)
                                {
                                    if (multiplesValues.Contains(trackedClusters[i].IdentifyingAgent))
                                    {
                                        //Reset the tracked agents of cluster
                                        if (firstpass)
                                        {
                                            trackedClusters[i] = new PersistedCluster()
                                            {
                                                IdentifyingAgent = multiplesValues.First(), ColorID = trackedClusters[n].ColorID
                                            };
                                            SetClusterColor(cluster, i);
                                            firstpass = false;
                                            updated   = true;
                                        }
                                        else
                                        {
                                            //Reset
                                            trackedClusters[i] = new PersistedCluster()
                                            {
                                                IdentifyingAgent = -2, ColorID = trackedClusters[n].ColorID
                                            };
                                            updated = true;
                                            continue;
                                        }
                                    }
                                }
                            }
                        }
                    }

                    if (!updated && trackedClusters[n].IdentifyingAgent >= 0)
                    {
                        //SoundEngine.StopCluster(n);
                    }
                }


                #endregion

                GenerateMessages();
                GenerateFilterResult();



                if (tempClusters.Count > 0)
                {
                    Cluster firstTrackedCluster  = tempClusters.FirstOrDefault(c => c.Any(i => i.ID == trackedClusters[0].IdentifyingAgent));
                    Cluster secondTrackedCluster = tempClusters.FirstOrDefault(c => c.Any(i => i.ID == trackedClusters[1].IdentifyingAgent));
                    Cluster thirdTrackedCluster  = tempClusters.FirstOrDefault(c => c.Any(i => i.ID == trackedClusters[2].IdentifyingAgent));
                    Cluster forthTrackedCluster  = tempClusters.FirstOrDefault(c => c.Any(i => i.ID == trackedClusters[3].IdentifyingAgent));

                    if (firstTrackedCluster != null)
                    {
                        SoundEngine.UpdateCluster_1(firstTrackedCluster.Agents,
                                                    new Vector2(Normalizer.NormalizeWidthCentered(firstTrackedCluster.Center.X), Normalizer.NormalizeHeightCentered0to1(firstTrackedCluster.Center.Y)),
                                                    firstTrackedCluster.Area,
                                                    Normalizer.Normalize0ToOne(firstTrackedCluster.AverageAgentEnergy),
                                                    Normalizer.Normalize0ToOne(firstTrackedCluster.ClusterVelocity),
                                                    new Vector3(firstTrackedCluster.Symmetry.X, firstTrackedCluster.Symmetry.Y, firstTrackedCluster.Symmetry.Z));
                    }

                    if (secondTrackedCluster != null)
                    {
                        SoundEngine.UpdateCluster_2(secondTrackedCluster.Agents,
                                                    new Vector2(Normalizer.NormalizeWidthCentered(secondTrackedCluster.Center.X), Normalizer.NormalizeHeightCentered0to1(secondTrackedCluster.Center.Y)),
                                                    secondTrackedCluster.Area,
                                                    Normalizer.Normalize0ToOne(secondTrackedCluster.AverageAgentEnergy),
                                                    Normalizer.Normalize0ToOne(secondTrackedCluster.ClusterVelocity),
                                                    new Vector3(secondTrackedCluster.Symmetry.X, secondTrackedCluster.Symmetry.Y, secondTrackedCluster.Symmetry.Z));
                    }

                    if (thirdTrackedCluster != null)
                    {
                        SoundEngine.UpdateCluster_3(thirdTrackedCluster.Agents,
                                                    new Vector2(Normalizer.NormalizeWidthCentered(thirdTrackedCluster.Center.X), Normalizer.NormalizeHeightCentered0to1(thirdTrackedCluster.Center.Y)),
                                                    thirdTrackedCluster.Area,
                                                    Normalizer.Normalize0ToOne(thirdTrackedCluster.AverageAgentEnergy),
                                                    Normalizer.Normalize0ToOne(thirdTrackedCluster.ClusterVelocity),
                                                    new Vector3(thirdTrackedCluster.Symmetry.X, thirdTrackedCluster.Symmetry.Y, thirdTrackedCluster.Symmetry.Z));
                    }

                    if (forthTrackedCluster != null)
                    {
                        SoundEngine.UpdateCluster_4(forthTrackedCluster.Agents,
                                                    new Vector2(Normalizer.NormalizeWidthCentered(forthTrackedCluster.Center.X), Normalizer.NormalizeHeightCentered0to1(forthTrackedCluster.Center.Y)),
                                                    forthTrackedCluster.Area,
                                                    Normalizer.Normalize0ToOne(forthTrackedCluster.AverageAgentEnergy),
                                                    Normalizer.Normalize0ToOne(forthTrackedCluster.ClusterVelocity),
                                                    new Vector3(forthTrackedCluster.Symmetry.X, forthTrackedCluster.Symmetry.Y, forthTrackedCluster.Symmetry.Z));
                    }

                    //Cluster firstTrackedCluster = clusters.OrderBy(x => x.Area).First();
#if WINDOWS
                    //SoundEngine.AgentDataRefresh(cluster.GetEveryOtherIndvd());
                    //SoundEngine.SendAgentEnergy(Normalizer.Normalize120To800(cluster.AverageAgentEnergy));
                    //SoundEngine.SendXYsymmetry(cluster.Symmetry);
                    //SoundEngine.SendNumAgents(cluster.Agents);
                    //SoundEngine.SendArea(cluster.Area);
                    //SoundEngine.SendClusterXY(cluster.Center.X, cluster.Center.Y);
                    //SoundEngine.StartCluster();
                    //SoundEngine.UpdateCluster(biggestCluster.Agents,
                    //                          biggestCluster.Center,
                    //                          biggestCluster.Area,
                    //                          Normalizer.Normalize0ToOne(biggestCluster.AverageAgentEnergy),
                    //                          biggestCluster.ClusterVelocity,
                    //                          new Vector3(biggestCluster.Symmetry.X, biggestCluster.Symmetry.Y, biggestCluster.Symmetry.Z));
                    //SoundEngine.StopCluster();
#endif
                    //SoundEngine.UpdateCluster(1, new Vector2(.1f, .2f), 1.1f, 1.1f, 1, new Vector3(1, 1, 1));
                    //SoundEngine.SendClusterXY(Normalizer.NormalizeWidthCentered(cluster.Center.X), Normalizer.NormalizeHeight(cluster.Center.Y));
                    //}
//                    if (firstTrackedCluster != null)
//                    {

//#if  !NETFX_CORE

//                        SoundEngine.UpdateCluster(firstTrackedCluster.Agents,
//                                                  new Vector2(Normalizer.NormalizeWidthCentered(firstTrackedCluster.Center.X), Normalizer.NormalizeHeightCentered0to1(firstTrackedCluster.Center.Y)),
//                                                  firstTrackedCluster.Area,
//                                                  Normalizer.Normalize0ToOne(firstTrackedCluster.AverageAgentEnergy),
//                                                  Normalizer.Normalize0ToOne(firstTrackedCluster.ClusterVelocity),
//                                                  new Vector3(firstTrackedCluster.Symmetry.X, firstTrackedCluster.Symmetry.Y, firstTrackedCluster.Symmetry.Z));
//#endif
//                    }
                }
            }
        }