// Метод вычисляет значения показателей надежности отслеживания точек // и сохраняет их в индексированный список. private void m_CalcErrorList( List <PointF> srcPts, // координаты точек на предыдущем кадре List <PointF> retPts, // координаты точек после отслеживания точек // с предыдущего кадра на следующий и обратно List <byte> retStatus, // признаки успешного отслеживания retPts List <float> dstError, // погрешность отслеживания точек с // предыдущего кадра на следующий List <float> retError, // погрешность отслеживания точек со // следующего кадра на предыдущий out List <IndexedDouble> indexedError // сводные показатели ) // надежности отслеживания точек { IndexedDouble error; indexedError = new List <IndexedDouble>(); for (int i = 0; i < srcPts.Count; i++) { if (retStatus[i] == 1) { double distX = retPts[i].X - srcPts[i].X; double distY = retPts[i].Y - srcPts[i].Y; double dist = Math.Sqrt(distX * distX + distY * distY); error = new IndexedDouble(); error.Value = dist; error.Index = i; indexedError.Add(error); } } }
// Метод сортировки индексированного списка ошибок по возрастанию private void m_SortErrorList(List <IndexedDouble> indexedError, out List <IndexedDouble> sortedIndexedError) { sortedIndexedError = new List <IndexedDouble>(); IndexedDouble[] indexedErrorArr = indexedError.ToArray(); int numel = indexedError.Count; IndexedDouble minError = new IndexedDouble(); int minIndex; for (int i = 0; i < numel - 1; i++) { minError = indexedErrorArr[i]; minIndex = i; for (int j = i + 1; j < numel; j++) { if (indexedErrorArr[j].Value < minError.Value) { minError = indexedErrorArr[j]; minIndex = j; } } // Переставляем местами текущий элемент с наименьшим if (minIndex != i) { indexedErrorArr[minIndex] = indexedErrorArr[i]; indexedErrorArr[i] = minError; } // Добавляем наименьший элемент в результирующий список sortedIndexedError.Add(minError); } }