【问题标题】:Finding coordinates of a point on a line求直线上一点的坐标
【发布时间】:2014-03-05 15:18:25
【问题描述】:

这应该很容易。我试图在一条直线上找到一个点的坐标。我在 MATLAB 中实现。我知道,端点的坐标和到某一点的距离。

我使用以下公式来计算坐标(请注意,我不能使用中点公式,因为距离可能会有所不同)。

当斜率为负时,我得到了错误的结果。您能否建议使用此公式需要考虑哪些条件?我也不知道任何其他公式。

【问题讨论】:

    标签: matlab math


    【解决方案1】:

    对于如此简单的任务来说,这太复杂了。使用直接向量计算:

    function P = point_on_line(A, B, AP)
      D = B - A;
      P = A + D / norm(D) * AP;
    end
    

    这样调用:

    P = point_on_line([x1 y1], [x2 y2], len);
    x = P(1);
    y = P(2);
    

    询问您是否需要任何说明。

    【讨论】:

      【解决方案2】:

      您的解决方案没有问题,但是当您取反正切来计算角度 θ 时,您需要注意象限的模糊性。

      在大多数编程语言中都有一个很好的解决方案:atan2。因此:

      %// Your points (fill in any values)
      A = [-10 0];
      B = [-1 -1];
      
      %// Use atan2!
      th = atan2( B(2)-A(2) , B(1)-A(1) );
      
      %// Distance from A to the point of interest
      AP = sqrt( (B(2)-A(2))^2 + (B(1)-A(1))^2 ) / 2;
      
      %// The point of interest
      C = [
          A(1) + AP*cos( th )
          A(2) + AP*sin( th )];
      
      %// Verify correctness with plots
      figure(1), clf, hold on
      line([A(1); B(1)], [A(2); B(2)])
      plot(...
          A(1), A(2), 'r.',... 
          B(1), B(2), 'b.',...
          C(1), C(2), 'k.', 'markersize', 20)
      

      一般来说,无论何时何地需要取反正切,请使用atan2 而不是atan。普通的atan 仅适用于您不知道部门y/x 的各个组成部分的情况。

      请注意,您的解决方案不能扩展到 3D,而这里其他人提出的矢量解决方案 。所以总的来说,我确实建议你开始使用向量。它不仅在许多情况下更简单,而且用途更广泛。

      【讨论】:

        【解决方案3】:

        这是一种错误的解决方案,因为解决方案不是唯一的。你的线上有两个点与点 A 的距离 AP 相同:一个向左,另一个向右。

        解决这个问题的方法有很多,我更喜欢向量表示法。

        向量 ab 是一个 2x1 matlab 矩阵:

        ab = B-A 
        

        abN 是归一化向量

        abN = ab/norm(ab) 
        

        从 A 沿 abN 方向的距离为 d(在您的情况下为 AP)是:

        A + abN*d
        

        希望对您有所帮助。

        天啊

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多