【问题标题】:How to filter a set of 2D points moving in a certain way如何过滤一组以某种方式移动的二维点
【发布时间】:2012-04-08 06:32:12
【问题描述】:

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

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

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

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

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

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

更多信息

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

必要的上下文

数据文件包含一个 176 行 5 列的 uint32 数组。列是:

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

这些点“活”在一个 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_ix_iy_i 都是向量?
  • @yuk 我的数据是 MATLAB 中的普通二维数组。列如问题中所述。该数组是 uint32 ,每个值都是像素空间中点的索引,时间如所述(从 1 到 T 的整数)。

标签: algorithm matlab geometry physics computational-geometry


【解决方案1】:

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

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

我们需要更多信息:

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

【讨论】:

  • 感谢您的回答。实际上,这些物体只是在实验室规模的分拣机中移动的种子(谷物)。我正在分析机器分离两种种子的能力(youtube.com/watch?v=yi-5wpw_oGM)。答案是: 1:是的(目前只引入重力,没有引入阻力); 2:没有; 3:没有一般规律; 4:抛物线轨迹是一个假设——希望是一个有用的假设。我发现这种假设不太可能导致任何极端错误/异常值(如果有的话)。
【解决方案2】:

以(索引,时间)为键对数据进行排序,对于一个点的所有位置,我看看它们是否遵循抛物线轨迹?

您面临哪一部分的问题?排序应该很容易。恕我直言,这是困难的第二部分(测试一组点是否遵循抛物线轨迹)。

【讨论】:

  • 你是对的——排序当然不是问题。这确实是第二部分。我想如果可以设计一种算法,在数字列表中找到最小大小为 2 的排序子集,那将很有用。但我自己没有时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-23
  • 2014-03-23
  • 1970-01-01
  • 1970-01-01
  • 2021-03-07
  • 2018-12-28
  • 2022-01-03
相关资源
最近更新 更多