Exemple #1
0
        public void AddInitialPos(RobotPos initialPos)
        {
            if(initialPos != null)
            {
                if (_initialPos == null)
                    _initialPos = new List<RobotPos>();

                Boolean isNewData = true;

                // On verifie si la position n'existe pas déjà)
                foreach (RobotPos currentRobotPos in _initialPos)
                {
                    if ((initialPos.x == currentRobotPos.x) && (initialPos.y == currentRobotPos.y) && (initialPos.angle == currentRobotPos.angle) && (initialPos.statusFlag.GetValueString() == currentRobotPos.statusFlag.GetValueString()))
                        isNewData = false;
                }

                // L'objet n'a pas été trouvé, on l'ajoute
                if (isNewData == true)
                    _initialPos.Add(new RobotPos(initialPos.x, initialPos.y, initialPos.angle, initialPos.statusFlag));
            }
        }
Exemple #2
0
        public RobotPos GetOutputPos(int index)
        {
            RobotPos Ret = null;

            if ((index >= 0) && (_initialPos != null))
            {
                List<RobotPos> resultList = GetOutputPos();

                if ((resultList != null) && (resultList.Count() > index))
                {
                    Ret = resultList[index];
                }
            }

            if (Ret == null)
                Ret =  new RobotPos();

            return Ret;
        }
        public void ComputeRobotPos(Strategy currentStrategy)
        {
            DisplayPos currentDisplayPos = null;
            List<DisplayPos> nextList = new List<DisplayPos>();
            RobotPos currentRobotPos = new RobotPos();
            List<RobotAction> allRobotActions = null;

            if (currentStrategy != null)
            {
                // On commence par détruire les anciens éléments
                _displayPos = null;
                _displayPos = new List<DisplayPos>();

                // Creation de la liste
                allRobotActions = currentStrategy.GetAllRobotAction();
                foreach (RobotAction currentRobotAction in allRobotActions)
                {
                    currentDisplayPos = new DisplayPos(currentRobotAction);
                    _displayPos.Add(currentDisplayPos);
                }

                // Creation de l'objet initial
                currentRobotPos.x = currentStrategy.DefaultPosX;
                currentRobotPos.y = currentStrategy.DefaultPosY;
                currentRobotPos.angle = currentStrategy.DefaultPosA;
                currentRobotPos.statusFlag = new RobotStatusFlag();

                // Creation du premier élément
                nextList.Clear();
                currentDisplayPos = GetDisplayPosByID(1);
                if (currentDisplayPos != null)
                {
                    currentDisplayPos.AddInitialPos(currentRobotPos);
                    nextList.Add(currentDisplayPos);
                }

                // On ajoute tous les élements de la stratégie principale
                foreach (DisplayPos current in _displayPos)
                {
                    if ((current.actionID >= 1) && (current.actionID < 1000))
                        nextList.Add(current);
                }

                int loopDetection = 0;

                while ((nextList.Count() > 0) && (loopDetection < loopDetectionMaxValue))
                {
                    loopDetection = loopDetection + 1;

                    // Etape 1 : On transfert les données de la liste nextIDs vers currentIDs
                    List<DisplayPos> currentList = new List<DisplayPos>(nextList);
                    DisplayPos currentItem = null;
                    nextList.Clear();

                    // Etape 2 : Pour chaque élément de la liste
                    while (currentList.Count() > 0)
                    {
                        // On récupère le premier élément de la liste et on le supprimer de la liste courante
                        currentItem = currentList[0];
                        currentList.RemoveAt(0);

                        // Etape 2.1 : On calcule la position de sortie
                        List<RobotPos> outputPos = currentItem.GetOutputPos();

                        if ((outputPos != null) && (outputPos.Count() > 0))
                        {
                            // On ajoute les données que si on ne boucle pas sur nous même et qu'on a un ID valide
                            if((currentItem.nextID != currentItem.actionID) && (currentItem.nextID > 0))
                            {
                                // On ajoute que si on est dans la stratégie principale
                                if (((currentItem.actionID > 0) && (currentItem.actionID <100)) || ((currentItem.actionID >=100) && (currentItem.nextID > 100)))
                                {
                                    currentDisplayPos = GetDisplayPosByID(currentItem.nextID);
                                    if (currentDisplayPos != null)
                                    {
                                        Boolean addNewItemToList = true;

                                        currentDisplayPos.AddInitialPos(outputPos);
                                        foreach(DisplayPos current in nextList)
                                        {
                                            if (current.actionID == currentDisplayPos.actionID)
                                                addNewItemToList = false;
                                        }

                                        foreach (DisplayPos current in currentList)
                                        {
                                            if (current.actionID == currentDisplayPos.actionID)
                                                addNewItemToList = false;
                                        }

                                        if(addNewItemToList == true)
                                            nextList.Add(currentDisplayPos);
                                    }
                                }
                            }
                        }
                    }

                    currentList.Clear();
                    currentList = null;
                }

                if (loopDetection >= loopDetectionMaxValue)
                    MessageBox.Show("Une Loop a été détectée dans la stratégie!\nLa génération de la trajectoire est stoppée.", "Strategy Générator", MessageBoxButton.OK, MessageBoxImage.Warning);
            }
        }