예제 #1
0
파일: Exo6.cs 프로젝트: tgy/CSharp
        public void AddInterval(float begin, float end)
        {
            Interval toAdd = new Interval(begin, end);
            List<int> toMerge = new List<int>();
            bool toMergeEmpty = true;

            if (_intervals.Count == 0)
            {
                _intervals.Add(toAdd);
                return;
            }

            for (int i = 0; i < _intervals.Count; i++)
            {
                // Interval situe a droite du ieme interval, aucun float en commun
                if (toAdd.BeginFloat > _intervals[i].EndFloat)
                {
                    if ((i + 1 < _intervals.Count && _intervals[i + 1].BeginFloat > toAdd.EndFloat) || _intervals.Count == 1)
                    {
                        _intervals.Insert(i + 1, toAdd);
                        return;
                    }

                    continue;
                }

                if (toAdd.EndFloat < _intervals[i].BeginFloat)
                {
                    if (toMergeEmpty || i == 0)
                    {
                        _intervals.Insert(i, toAdd);
                        return;
                    }
                    break;
                }

                // Interval entierement inclu dans le ieme interval
                if (toAdd.EndFloat < _intervals[i].EndFloat && toAdd.BeginFloat > _intervals[i].BeginFloat && toMergeEmpty)
                    return;

                toMerge.Add(i);
                if (toMergeEmpty)
                    toMergeEmpty = false;
            }

            if (!toMergeEmpty)
            {
                if (_intervals[toMerge[0]].BeginFloat > toAdd.BeginFloat)
                    _intervals[toMerge[0]].BeginFloat = toAdd.BeginFloat;

                _intervals[toMerge[0]].EndFloat = _intervals[toMerge[toMerge.Count - 1]].EndFloat > toAdd.EndFloat ? _intervals[toMerge[toMerge.Count - 1]].EndFloat : toAdd.EndFloat;

                if (toMerge.Count > 1)
                    for (int i = toMerge[1]; i <= toMerge[toMerge.Count - 1]; i++)
                    {
                        _intervals.RemoveAt(i);
                        i++;
                    }
            }
        }
예제 #2
0
파일: Exo6.cs 프로젝트: tgy/CSharp
        public void DeleteInterval(float begin, float end)
        {
            Interval toDelete = new Interval(begin, end);
            List<int> toMerge = new List<int>();
            bool toMergeEmpty = true;

            if (_intervals.Count == 0)
                return;

            for (int i = 0; i < _intervals.Count; i++)
            {
                if (toDelete.BeginFloat > _intervals[i].EndFloat)
                    continue;

                if (toDelete.EndFloat < _intervals[i].BeginFloat && (toMergeEmpty || i == 0))
                    break;

                if (toDelete.EndFloat < _intervals[i].EndFloat && toDelete.BeginFloat > _intervals[i].BeginFloat)
                {
                    _intervals.Insert(i + 1, new Interval(toDelete.EndFloat + float.Epsilon, _intervals[i].EndFloat));
                    _intervals[i].EndFloat = toDelete.BeginFloat - float.Epsilon;
                    return;
                }

                toMerge.Add(i);
                if (toMergeEmpty)
                    toMergeEmpty = false;
            }

            if (!toMergeEmpty)
            {
                _intervals[toMerge[0]].EndFloat = toDelete.BeginFloat;
                _intervals[toMerge[toMerge.Count - 1]].BeginFloat = toDelete.EndFloat;

                if (toMerge.Count > 1)
                    for (int i = toMerge[1]; i <= toMerge[toMerge.Count - 1]; i++)
                    {
                        _intervals.RemoveAt(i);
                        i++;
                    }
            }
        }