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

Algorithm 如何过滤以某种方式移动的一组二维点,algorithm,matlab,geometry,physics,computational-geometry,Algorithm,Matlab,Geometry,Physics,Computational Geometry,我有一个在二维(x轴和y轴)中移动的点列表,表示为数组中的行。我可能有N个点,即N行: 其中Ti、席和Yi是时间点、X坐标和I点的Y坐标。时间索引ti是从1到T的整数。每个这样的可能时间索引的点数可以从0到N不等(仍然总共只有N个点) 我的目标是过滤掉所有不以某种方式移动的点;或者只保留那些做的。一个点必须沿抛物线轨迹移动——x坐标和y坐标减小(即,仅向左和向下移动)。必须删除具有其他动态行为的点 我可以在这个数组上使用一个简单的排序机制,然后分析时间索引的顺序吗?我还考虑到,具有相同时间索引t

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

其中Ti、席和Yi是时间点、X坐标和I点的Y坐标。时间索引ti是从1到T的整数。每个这样的可能时间索引的点数可以从0到N不等(仍然总共只有N个点)

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

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

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

更多信息

% 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
我已经提供了一些数据文件:

必要的上下文

% 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
数据文件包含一个包含176行和5列的uint32数组。各栏分别为:

  • 175×175晶格中的像素x坐标
  • 175×175晶格中的像素y坐标
  • 离散θ角指数
  • 时间指数(从1到T=10)
  • 此原始排序的行索引
  • 这些点“活”在一个175×175像素的晶格中,并且同样位于半径为175的圆的上象限内。这些点在圆周上以逆时针方向旋转,与水平方向成一定角度θ,在这里它们被抛到接近抛物线轨道的位置。第3列将离散索引保存到一个列表中,该列表的索引1到45为0到90度(因此一个索引跨越2度)。θ角最初是通过建立简单的运动方程并求解角度,仅从点推导得出的。这就产生了一个准对称四次函数,它可以用封闭形式求解。圆的实际公制半径为0.2 m,使用简单的线性插值将像素坐标从像素坐标转换为公制(但我们在这里看到的是原始像素空间中的点)

    我的问题是,有些点的行为不正常,因为我需要对θ角进行统计,所以我需要删除那些当然不会在抛物线轨迹中移动的点。这些错误是预期的,也是完全自然的,但仍然需要过滤掉

    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\u i
    x\u i
    y\u i
    都是向量?@yuk我的数据在MATLAB中是一个普通的2d数组。栏目如问题中所述。数组是uint32,每个值都是点的像素空间索引,时间如所述(从1到T的整数)。感谢您的回答。实际上,这些物体只是在实验室规模的分拣机中移动的种子(谷物)。我正在分析机器分离两种种子的能力()。答案是:1:是(目前只引入重力,不引入阻力);2:没有;3:没有一般规律;4:抛物线轨迹是一个假设——希望是一个有用的假设。我发现这种假设不太可能导致任何极端错误/异常值(如果有)。你是对的-排序当然不是问题。这确实是第二部分。我想如果人们能设计一种算法,在一个数字列表中,能找到最小大小为2的排序子集,那将会很有用。但是我自己没有时间。