algorithm - 如何过滤一组以某种方式移动的二维点

标签 algorithm matlab geometry physics computational-geometry

我有一个在二维(xy 轴)上移动的点列表,表示为数组中的行。我可能有 N 个点 - 即 N 行:

1 t1 x1 y1
2 t2 x2 y2
. 
.
.
N tN xN yN

其中 tixiyi 是点 i 的时间索引、x 坐标和 y 坐标.时间索引-索引ti是一个从1到T的整数。每个这样的可能时间索引的点数可以从 0 到 N 不等(总共仍然只有 N 个点)。

我的目标是过滤掉所有不以某种方式移动的点;或者只保留那些做的。一个点必须沿抛物线轨迹移动 - 具有递减 xy 坐标(即移动到仅左侧和下方)。必须删除具有其他动态行为的点。

我可以在这个数组上使用一个简单的排序机制——然后分析时间索引的顺序吗?我还考虑到每个具有相同时间索引 ti 的点在物理上都是不同的点,因此应该与其他点配对。问题变得越来越复杂 - 现在我转向你。

注意:您可以假设这些点被限制在两条抛物线曲线之间的 (x,y) 平面的子区域中。这些曲线仅在一点相交:靠近任何一点运动原点的一点。

更多信息:

我已经提供了一些数据文件:

必要的上下文:

数据文件包含一个具有 176 行和 5 列的 uint32 数组。这些列是:

  1. 175×175 格子中的像素 x 坐标
  2. 175×175 格子中的像素 y 坐标
  3. 离散θ角指数
  4. 时间索引(从1到T=10)
  5. 原始排序的行索引

这些点“存在”在 175 x 175 像素的格子中 - 并且再次位于半径为 175 的圆的上象限内。这些点在圆周上以逆时针旋转特定角度移动 theta 与水平线,在那里它们被扔到接近抛物线轨道的地方。第 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

谢谢:)

最佳答案

为什么,这看起来几乎就像是在模拟雷达跟踪两枚导弹碰撞产生的碎片......

无论如何,让我们创造一个新术语:对象。物体沿着抛物线运动,在某些时候它们可能会发出以形式出现的闪光。我们还试图过滤掉其他一些点。

我们需要更多信息:

  1. 我们可以假设物体遵循重力下落的物理规律吗?
  2. 每个对象都必须在其生命周期中的每个时间步发出一个点吗?
  3. 说到生命周期,所有的对象都是同时开始的吗?有些会比其他的先过期吗?
  4. 数据的精确度如何?准确吗?有误差的衡量标准吗?换句话说,我们是否了解一个物体的点与完美抛物线的拟合程度有多差?

关于algorithm - 如何过滤一组以某种方式移动的二维点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9843593/

相关文章:

python - 在 python 中打开 .mat 文件时出错

algorithm - 计算不同引用系中的坐标

javascript - 根据 Angular 查找旋转图像的大小以匹配顶线

algorithm - 有什么简单的方法可以进行 2^32 - 1 运算的模数吗?

c# - 从无序点绘制连续线

algorithm - 使用 dincis 算法和 ford fulkerson 解决最大流问题的最佳算法是什么?

image - 使用 MATLAB 查找圆形物体边缘缺陷的位置

matlab - 蒙特卡罗方法的向量化来近似 pi

r - 在 Shiny Leaflet 中为空间子集绘制刷亮或访问绘制的形状几何图形

algorithm - 使用广度优先搜索按排序顺序列出二进制堆中的值?