У меня есть список точек, перемещающихся в двух измерениях ( x - и y -ось), представленных в виде строк в массиве. У меня может быть N баллов - т.е. N строк:
1 t1 x1 y1
2 t2 x2 y2
.
.
.
N tN xN yN
где ti , xi и yi , это временной индекс, координата x и координата y для точки i. Индекс времени ti является целым числом от 1 до T . Количество точек в каждом таком возможном временном индексе может варьироваться от 0 до N (по-прежнему всего N баллов).
Моя цель - отфильтровать все точки, которые не движутся определенным образом; или оставить только те, которые делают. Точка должна двигаться по параболической траектории - с уменьшающейся x - и y -координатой (то есть, перемещаясь влево и вниз только). Точки с другим динамическим поведением должны быть удалены.
Могу ли я использовать простой механизм сортировки для этого массива, а затем проанализировать порядок индекса времени? Я также учел тот факт, что каждая точка, имеющая один и тот же временной индекс ti , является физически отличными точками, и поэтому должна сочетаться с другими точками. Сложность проблемы возросла - и теперь я перехожу к вам.
ПРИМЕЧАНИЕ. Можно предположить, что точки ограничены подобластью плоскости (x, y) между двумя параболическими кривыми. Эти кривые пересекаются только в одной точке: точке, близкой к началу движения для любой точки.
Дополнительная информация :
Я сделал доступными некоторые файлы данных:
Необходимый контекст :
Файл данных содержит один массив uint32 с 176 строками и 5 столбцами. Столбцы:
- пиксельная x-координата в решетке 175 на 175
- пиксельная y-координата в решетке 175 на 175
- дискретный тета-индекс угла
- индекс времени (от 1 до T = 10)
- индекс строки для этой оригинальной сортировки
Точки «живут» в пиксельной решетке 175 на 175 - и снова в верхнем квадранте круга с радиусом 175. Точки перемещаются по окружности круга при вращении против часовой стрелки на определенный угол тета с горизонталью, где они выбрасываются в нечто, близкое к параболической орбите. Столбец 3 содержит дискретный индекс в списке с индексами от 1 до 45 от 0 до 90 градусов (таким образом, один индекс охватывает 2 градуса). Первоначально тета-угол выводился исключительно из точек путем установки тривиальных уравнений движения и решения для угла. Это приводит к квазисимметричной квартике, которая может быть решена в близкой форме. Фактический радиус метрики круга равен 0,2 м, и координаты пикселя были преобразованы из координаты пикселя в метрику с помощью простой линейной интерполяции (но мы видим здесь точки в исходном пиксельном пространстве).
Моя проблема в том, что некоторые точки не работают должным образом, и, поскольку мне нужно собрать статистику по углу тета, мне нужно удалить точки, которые, безусловно, НЕ движутся в параболической траектории. Эти ошибки ожидаемы и полностью естественны, но все же должны быть отфильтрованы.
Код участка MATLAB :
% load data and setup variables:
load mat_points.mat;
num_r = 175;
num_T = 10;
num_gridN = 20;
% begin plotting:
figure(1000);
clf;
plot( ...
num_r * cos(0:0.1:pi/2), ...
num_r * sin(0:0.1:pi/2), ...
'Color', 'k', ...
'LineWidth', 2 ...
);
axis equal;
xlim([0 num_r]);
ylim([0 num_r]);
hold all;
% setup grid (yea... went crazy with one):
vec_tickValues = linspace(0, num_r, num_gridN);
cell_tickLabels = repmat({''}, size(vec_tickValues));
cell_tickLabels{1} = sprintf('%u', vec_tickValues(1));
cell_tickLabels{end} = sprintf('%u', vec_tickValues(end));
set(gca, 'XTick', vec_tickValues);
set(gca, 'XTickLabel', cell_tickLabels);
set(gca, 'YTick', vec_tickValues);
set(gca, 'YTickLabel', cell_tickLabels);
set(gca, 'GridLineStyle', '-');
grid on;
% plot points per timeindex (with increasing brightness):
vec_grayIndex = linspace(0,0.9,num_T);
for num_kt = 1:num_T
vec_xCoords = mat_points((mat_points(:,4) == num_kt), 1);
vec_yCoords = mat_points((mat_points(:,4) == num_kt), 2);
plot(vec_xCoords, vec_yCoords, 'o', ...
'MarkerEdgeColor', 'k', ...
'MarkerFaceColor', vec_grayIndex(num_kt) * ones(1,3) ...
);
end
Спасибо:)