在Matlab中找到曲线的交点

3
我有一个几何问题,如下图所示: enter image description here 我已经准备好了问题的草图,如右上角所示。基本上,从点C或在草图中标记为M开始,我想要:
1. 测量L2,即点C到关联极点(黑线)的距离。已知点C的坐标。该极点基本上是从原点{0,0}沿着360度每30度向外移动的。该极点将始终与蓝色点相交,其坐标也已知。 2. 测量L1,即从原点到通过L3与蓝色曲线相交处得到的点的距离。很难解释,但我希望草图能够帮助理解。
如何使用Matlab解决此问题?
以下是数字数据集:
对于蓝色点(在绘图中标记为“实际”)
Theta(deg)      x          y
================================
       0    1.0148         0
   20.0000    0.9397    0.3420
   40.0000    0.8042    0.6748
   60.0000    0.5727    0.9919
   80.0000    0.2073    1.1757
  100.0000   -0.2073    1.1757
  120.0000   -0.5727    0.9919
  140.0000   -0.8042    0.6748
  160.0000   -0.9397    0.3420
  180.0000   -1.0148         0
  200.0000   -0.9397   -0.3420
  220.0000   -0.8042   -0.6748
  240.0000   -0.5727   -0.9919
  260.0000   -0.2073   -1.1757
  280.0000    0.2073   -1.1757
  300.0000    0.5727   -0.9919
  320.0000    0.8042   -0.6748
  340.0000    0.9397   -0.3420
  360.0000    1.0148         0

对于标记为“predicted”的那个

   x-pred     y-pred
===========================
    1.0953    0.2897
    1.0292    0.6399
    0.8390    0.9013
    0.5476    1.1899
    0.1902    1.2300
   -0.1902    1.3091
   -0.5476    1.0693
   -0.8390    0.9247
   -1.0292    0.4744
   -1.0953    0.2070
   -1.0292   -0.2885
   -0.8390   -0.5168
   -0.5476   -0.8711
   -0.1902   -0.9193
    0.1902   -1.0086
    0.5476   -0.8278
    0.8390   -0.6483
    1.0292   -0.3125
    1.0953   -0.0000

任何想法都将不胜感激。
提前致谢。

如果您不知道此计算涉及的方程式,则此问题超出了 Stack Overflow 的范围(请尝试数学 SE 网站?)。如果您知道这些方程式,请展示您实现它们的尝试,并让我们知道遇到的困难在哪里。 - Cris Luengo
@CrisLuengo,显然我从下面得到了答案。它确切地产生了结果。 - BeeTiau
1个回答

2

步骤1:找到点BD

D是蓝色曲线中的一条线段与射线AC相交的点。要找到射线和线段之间的交点,我们可以按照以下方法执行。给定线段端点处的点,我们称之为p1p2,以及从A开始并通过C的射线,我们解决向量方程p1 + t1*(p2-p1) == A + t2*(C-A),以获取标量t1t2的值。 t1t2的值告诉我们是否有交点以及交点在哪里。

  • 只有当t2 >= 00 <= t1 <= 1时才存在交点。
  • 如果存在交点,则它在D = p1 + t1*(p2-p1)处发生。

B只是p1p2中的一个点,具体取决于所使用的符号表示法。

代码:

% Assuming C and A are represented as 1x2 matrices.
% Assuming blue is an Nx2 matrix containing the x-y coordinates of
%   the points in the blue curve in order of increasing theta.

% Search for intersecting line segment to find B and D
N = size(blue,1);
for bidx = 1:N
    p1 = blue(bidx,:);
    p2 = blue(mod(bidx,N)+1,:);
    % solve for t1 and t2
    t = [(p2-p1).' (A-C).']\((A-p1).');
    % if we find intersection we are done.
    if t(2) >= 0 && t(1) >= 0 && t(1) <= 1
        D = p1 + t(1)*(p2-p1);
        B = p2;
        break;
    end
end

步骤二:计算L1L2

L2是与AB垂直的AC分量。

L1是与AB平行的AD分量。

使用这些知识按照以下方式计算L1L2...

AB = B-A;
AC = C-A;
AD = D-A;
% projection of vector X onto vector Y.
proj = @(X,Y) Y * dot(X,Y)/dot(Y,Y);

% get the desired distances
L2 = norm(AC - proj(AC,AB));
L1 = norm(proj(AD,AB));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接