Это отличный вопрос, и что делает его таким интересным, так это то, что точки данных следует считать случайными.Это означает, что вы не можете ожидать начала и конца графа данных, который представляет собой хорошо себя ведущий полином (например, волна SINE или COS).Таким образом, вам придется работать с небольшими приращениями, чтобы значения на вашей оси x (так сказать) не колебались, то есть Xn не может быть меньше Xn-1.Следующим соображением будет случай перекрытия или близкого перекрытия точек данных.Представьте, что я записываю свои GPS-координаты, и мы остановились, чтобы поболтать или отдохнуть, и я иду случайным образом в пределах 25-футового круга в течение следующих пяти минут.Таким образом, вопрос заключается в том, как игнорировать этот тип «шума данных»?
Для простоты давайте рассмотрим линейные вычисления, где нет аппроксимации между двумя точками;это прямая линияЭто, вероятно, будет более чем достаточно для ваших расчетов.Теперь, учитывая приведенный выше комментарий относительно случайных точек данных, вы захотите последовательно пройти через ваши данные от начальной точки до конечной точки.Последовательное завершение происходит, когда вы превышаете последнюю точку данных или превышаете общее расстояние для получения координат (например, подмножество).Давайте предположим, что ваша точность графика равна X. Это будут ваши 20 метров.При прохождении будет три условия:
- Расстояние между двумя точками больше, чем ваша точность.Поэтому сохраните начальную точку плюс точность X. Это также станет вашей новой начальной точкой.
- Расстояние между двумя точками равно вашей точности.Поэтому сохраните начальную точку плюс точность X (или сохраните конечную точку).Это также станет вашей новой начальной точкой.
- Расстояние между двумя точками меньше вашей точности.Поэтому точность регулируется с точностью до минус конечной точки.Конечная точка станет вашей новой начальной точкой.
Вот псевдокод, который может помочь вам начать работу.Обратите внимание, точка у минус точка х = расстояние между.И точка x плюс значение = новая точка на линии между позицией x и точкой y на значении расстояния.
recordedPoints = received from trace;
newPlotPoints = emplty list of coordinates;
plotPrecision = 20
immedPrecision = plotPrecision;
startPoint = recordedPoints[0];
for(int i = 1; i < recordedPoints.Length – 1; i++)
{
Delta = recordedPoints[i] – startPoint;
if (immedPrecision < Delta)
{
newPlotPoints.Add(startPoint + immedPrecision);
startPoint = startPoint + immedPrecision;
immedPrecsion = plotPrecsion;
i--;
}
else if (immedPrecision = Delta)
{
newPlotPoints.Add(startPoint + immedPrecision);
startPoint = startPoint + immediatePrecision;
immedPrecision = plotPrecision;
}
else if (immedPrecision > Delta)
{
// Store last data point regardless
if (i == recordedPoints.Length - 1)
{
newPlotPoints.Add(startPoint + Delta)
}
startPoint = recordedPoints[i];
immedPrecision = Delta - immedPrecision;
}
}
Ранее я упоминал «шум данных».Вы можете обернуть слова «если» и «еще, если» в другое «если», которое определяет этот фактор.Самый простой способ - игнорировать точку данных, если она не сдвинулась на заданное расстояние.Имейте в виду, что это магическое число должно быть достаточно маленьким, чтобы последовательно записанные точки данных, которые игнорируются, не суммировались с чем-то большим и ценным.Поэтому ограничение числа игнорируемых точек данных может быть полезным.
С учетом всего сказанного существует множество способов точно выполнить эту операцию.Одним из предложений поднять эту тему на следующий уровень является интерполяция.Для .NET есть библиотека с открытым исходным кодом на http://www.mathdotnet.com.. Вы можете использовать их библиотеку чисел, которая содержит Интерполяцию на http://numerics.mathdotnet.com/interpolation/.. Если вы выберете такой маршрут, вашим следующим основным препятствием будет выбор подходящей техники интерполяции.Если вы не математический гуру, вот немного информации, с чего можно начать http://en.wikipedia.org/wiki/Interpolation. Откровенно говоря, полиномиальная интерполяция с использованием двух смежных точек была бы более чем достаточной для ваших приближений, если вы считаете, что идея Xn не
Последний пункт, на который следует обратить внимание, эти расчеты двумерные и учитывают высоту (азимут) или кривизну Земли.Вот некоторая дополнительная информация по этому вопросу: Рассчитать расстояние между двумя точками широты и долготы?(Формула Haversine) .
Тем не менее, надеюсь, это укажет вам правильное направление.Без сомнения, это не тривиальная проблема, поэтому поддержание диапазона точек данных настолько малым, насколько это возможно, но при этом остается точным, будет в ваших интересах.
One otее рассмотрение могло бы состоять в том, чтобы приблизиться, используя фактические точки данных, используя точность, чтобы игнорировать чрезмерные данные.Поэтому вы по сути не сохраняете два списка координат.
Cheers, Jeff