【发布时间】:2012-04-08 06:32:12
【问题描述】:
我有一个在二维(x-和y-轴)中移动的点列表,表示为数组中的行。我可能有 N 个点 - 即 N 行:
1 t1 x1 y1
2 t2 x2 y2
.
.
.
N tN xN yN
其中 ti、xi 和 yi 是点 i 的时间索引、x 坐标和 y 坐标.时间索引-索引ti是一个从1到T的整数。每个此类可能的时间索引处的点数可以从 0 到 N 不等(仍然只有 N 个点)。
我的目标是过滤掉所有不以某种方式移动的点;或只保留那些这样做的。一个点必须在 抛物线 轨迹上移动 - 递减 x - 和 y - 坐标(即,移动到仅向左和向下)。必须删除具有其他动态行为的点。
我可以在这个数组上使用一个简单的排序机制 - 然后分析时间索引的顺序吗?我还考虑了具有相同时间索引 ti 的每个点都是物理上不同的点,因此应该与其他点配对。问题的复杂性越来越大 - 现在我求助于您。
注意:您可以假设这些点被限制在两条抛物线曲线之间的 (x,y) 平面的子区域内。这些曲线仅在一个点相交:任何一点都靠近运动原点。
更多信息:
我已经提供了一些数据文件:
必要的上下文:
数据文件包含一个 176 行 5 列的 uint32 数组。列是:
- 175×175 晶格中的像素 x 坐标
- 175×175 晶格中的像素 y 坐标
- 离散θ角指数
- 时间索引(从 1 到 T = 10)
- 此原始排序的行索引
这些点“活”在一个 175×175 像素的格子中 - 并且再次位于半径为 175 的圆的上象限内。这些点在圆周上逆时针旋转一定角度 θ 与水平,在那里它们被抛入接近抛物线轨道的东西。第 3 列将离散索引保存到列表中,索引 1 到 45 从 0 到 90 度(一个索引因此跨越 2 度)。 θ角最初是通过建立平凡的运动方程并求解角度仅从点推导出来的。这产生了一个准对称四次方程,它可以以封闭形式求解。圆的实际公制半径为 0.2 m,像素坐标使用简单的线性插值从像素坐标转换为公制(但我们在这里看到的是原始像素空间中的点)。
我的问题是某些点的行为不正常,因为我需要统计 theta 角,所以我需要删除肯定不会在抛物线轨迹中移动的点。这些错误是预期的并且完全自然,但仍需要过滤掉。
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
谢谢:)
【问题讨论】:
-
你能发布一些示例数据吗?
-
您的数据结构如何适应时间变化?如果一个点是一行,它是否只有一个
x和一个y?你有更多的列还是第三维?或者它实际上是一个元胞数组,每个t_i、x_i、y_i都是向量? -
@yuk 我的数据是 MATLAB 中的普通二维数组。列如问题中所述。该数组是 uint32 ,每个值都是像素空间中点的索引,时间如所述(从 1 到 T 的整数)。
标签: algorithm matlab geometry physics computational-geometry