代码之家  ›  专栏  ›  技术社区  ›  NLed

使用polyfit预测物体下落的位置?

  •  2
  • NLed  · 技术社区  · 14 年前

    我有一个物体被抛成抛物线的信息。从开始位置到结束,以特定的间隔共拍摄30幅图像。

    现在我已经成功地提取了被抛出的物体在所有30张图像中的x,y坐标… 我认为使用PolyFit(或者可能是PolyVal?)可能有助于我预测物体在前15幅图像之后会落在哪里…

    我只想知道,polyfit如何能和我的30 x,y坐标一起使用?

    (我有一个循环,每次从一个mat文件中提取一行图像,直到30。然后画出那个图像……那么,在绘图之前/之后,我应该在同一个循环中使用polyfit吗????

    有什么想法吗??

    谢谢!

    编辑

    这是我当前的代码:

    load objects.mat
    for G=1:30
        x=objects(G,1);
        y=objects(G,2);
        plot(x,y,'0')
        hold on
        drawnow()
    end
    
    1 回复  |  直到 14 年前
        1
  •  3
  •   gnovice    14 年前

    下面是一种方法,可以使用函数 POLYFIT 将抛物线拟合到 x y ,函数 POLYVAL 在一组 X 值,以及 SET 命令修改打印对象,而不必重新加载它们:

    load objects.mat   %# Load the data
    x = objects(:,1);  %# Get the x data
    y = objects(:,2);  %# Get the y data
    N = numel(x);      %# The number of points
    hPoints = plot(x(1),y(1),'r*');       %# Plot first point as a red asterisk,
                                          %#   saving the handle
    hold on;                              %# Add to the plot
    hFitLine = plot(x,nan(N,1),'b-');     %# Initialize the plot for the fit line,
                                          %#   saving the handle and using NaN for
                                          %#   the y values so it doesn't appear yet
    axis([min(x) max(x) min(y) max(y)]);  %# Set the axis limits
    for k = 1:N
      set(hPoints,'XData',x(1:k),'YData',y(1:k));  %# Update the points
      if k >= 15                       %# Plot a fit line starting at k = 15
        p = polyfit(x(1:k),y(1:k),2);  %# Fit a parabola with points 1 through k
        yFit = polyval(p,x);           %# Evaluate the polynomial at all x
        set(hFitLine,'YData',yFit);    %# Update the fit line
      end
      drawnow();    %# Force the plot to refresh
      pause(0.25);  %# Pause for a quarter second
    end
    

    关于matlab图形的注释…

    任何时候发布绘图命令(如 PLOT ,然后一个或多个 handle graphics objects 在当前轴中创建。这些对象有一个“句柄”或数字标识符,用作对绘图对象的引用,可用于访问和修改对象的属性。这个 GET 集合 命令可用于分别访问和修改使用其句柄的图形对象的属性,这些句柄通常作为打印命令的输出参数返回。

    每种类型的句柄图形对象都有一组属性。这个 情节 命令创建 lineseries 具有许多可以找到的属性的对象 here . 例如, 'XData' property 存储打印点的X值,而 'YData' property 存储Y值。通过修改 线列 对象。

    在matlab中制作图形动画时,通常先创建对象,然后在动画过程中更新其属性,而不是在动画过程中创建、删除对象,然后重新创建对象,这样效率更高。在上面的代码中,在动画循环之前为各个点创建一个绘图对象,该对象的句柄存储在变量中。 hPoints . 抛物线的绘图对象也在动画循环之前创建,其句柄存储在 hFitLine . 然后, 集合 循环中使用命令修改这两个打印对象。

    因为抛物线最初是不可见的,所以将初始Y值设置为“全部” NaN 使线条不呈现(尽管对象仍然存在)。也可以通过设置 'Visible' property 'off' .