如何在MATLAB中找到两个椭圆的交集

kne*_*elp 3 matlab intersection ellipse

我有两个方程式:

ellipseOne = '((x-1)^2)/6^2 + y^2/3^2 = 1';
Run Code Online (Sandbox Code Playgroud)

ellipseTwo = '((x+2)^2)/2^2 + ((y-5)^2)/4^2 = 1';
Run Code Online (Sandbox Code Playgroud)

我画了他们:

ezplot(ellipseOne, [-10, 10, -10, 10])
hold on
ezplot(ellipseTwo, [-10, 10, -10, 10])
title('Ellipses')
hold off
Run Code Online (Sandbox Code Playgroud)

现在我试图找到两个椭圆的交集.我试过了:

intersection = solve(ellipseOne, ellipseTwo)
intersection.x
intersection.y
Run Code Online (Sandbox Code Playgroud)

找到它们相交的点,但是MATLAB给了我一个矩阵和一个方程作为答案,我不明白.谁能指出我正确的方向来获得交叉点的坐标?

ray*_*ica 6

解决方案是符号形式.您需要采取的最后一步是将其转换为数字.只需使用转换结果double.然而,因为这是一对二次方程,由于符号模糊(即+/-),有4种可能的解,并且可能给出虚数根.因此,找出真正的解决方案,剩下的应该是你的答案.

因此:

% Your code
ellipseOne = '((x-1)^2)/6^2 + y^2/3^2 = 1';
ellipseTwo = '((x+2)^2)/2^2 + ((y-5)^2)/4^2 = 1';
intersection = solve(ellipseOne, ellipseTwo);

% Find the points of intersection
X = double(intersection.x);
Y = double(intersection.y);
mask = ~any(imag(X), 2) | ~any(imag(Y), 2);
X = X(mask); Y = Y(mask);
Run Code Online (Sandbox Code Playgroud)

前三行代码就是你所做的.接下来的四行以数字形式提取根,然后我创建一个logical仅隔离真实点的掩码.这会查看所有根的坐标XY坐标的虚部,如果有任何根的这样的组件,我们想要消除它们.我们最终删除了想象中的根,我们应该留下两个真正的根源.

因此,我们得到了我们的交叉点:

>> disp([X Y])
   -3.3574    2.0623
   -0.2886    2.9300
Run Code Online (Sandbox Code Playgroud)

第一列是X坐标,第二列是Y坐标.这也似乎与情节一致.我将使用您的椭圆绘图代码,并使用上述解决方案将交叉点插入为蓝点:

ezplot(ellipseOne, [-10, 10, -10, 10])
hold on
ezplot(ellipseTwo, [-10, 10, -10, 10])
% New - place intersection points
plot(X, Y, 'b.');
title('Ellipses');
hold off;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 这正是我所需要的。非常感谢 (2认同)