一条线在哪里穿过我的曲线?

时间:2013-04-29 14:46:00

标签: matlab geometry

我有一个起点(X,Y)和一个起始方向(V1,V2)。我还有两条特定的曲线

g1: 2*x - (y)^2 - 1 = 0;
g2: 9 - 0.8*(x)^2 - 2*y = 0;

我需要知道在任何(X,Y)(V1,V2)的情况下,第一次交叉会在哪里发生(或者如果它根本不发生的话)在一些固定的 R 距离内)。

最简单的方法是什么?我应该考虑哪些标准的MatLab方法?


例如(X,Y)=(0,0)(V1,V2)=(1,1)。第一个交点发生在(1,1),它是 g1 曲线的一个点。

intersection

3 个答案:

答案 0 :(得分:1)

找到两条曲线的交点:

将g1和g2声明为显式匿名函数

g1 = @(x)(sqrt(2*x - 1));
g2 = @(x)(-0.4*x.^2 + 4.5);

选择要测试的x范围:

xmin = 0;
xmax = 100;
xres = 0.1;
x = xmin:xres:xmax;

在曲线中查找

G1 = g1(x);
G2 = g2(x);

现在找到图表相互交叉的索引:

ind = find(diff(G1 > G2));

现在很容易将该索引转换为x值:

xval = xmin + (ind(1)-1)*xres

修改

所以我现在假设您的(V1,V2)只是来自原点的单位方向向量?如果是这样,我们可以创建一条直线y = mx + c并找到与g1和g2相交的位置。

m = V2/V1;
c = Y - m*X;
line = @(x)(m*x + c);

现在只需按照上述步骤查找lineg1以及lineg2的交点。如果V1为负数,则设置xmax = X,否则设置xmin = X,以便在正确的方向上查找交点。如果没有交点,xval行可能会出错,因此在那里添加一些错误检查。如果V1为正,则选择最小的xval;如果V1为负,则选择较大的xval

if V1 >= 0
    xmin = X;
    xmax = X + 100;
else
    xmin = X - 100;
    xmax = X; 
end;

xres = 0.1;
x = xmin:xres:xmax;

G1 = g1(x);
G2 = g2(x);
L = line(x);
ind1 = find(diff(G1 > L));
xval1 = xmin + (ind1(1)-1)*xres
ind2 = find(diff(G2 > L));
xval2 = xmin + (ind2(1)-1)*xres

xval = (V1 > 0)*max(xval1, xval2) + (V2 < 0)*max(xval1, xval2);
yval = line(xval);

答案 1 :(得分:0)

我会这样做,但我目前无法测试它:

编辑3

现在我应该以正确的方式解释问题:所以我会这样做:

f1 = @(x) x - (sqrt( 2.*x - 1 ));
f2 = @(x) x - (4.5 - 0.4.*(x).^2);
x1 = fsolve(f1,x01)
x2 = fsolve(f2,x02)

这会引导您达到预期的结果:

x1 = 1;
x2 = 2.3295;

或者,您也可以遵循符号方法:

syms x;
x1 = double(solve(x - sqrt(2*x - 1)));
x2 = double(solve(x - (4.5 - 0.4*x^2)));

答案 2 :(得分:0)

% find intersect point of two curves
% x -> independent variable
% y1, y2 -> curves that intersects
% xc, yc -> intersect cordinate

function [xc, yc, crossIdx] = findIntersectPoint(x, y1, y2)
    crossIdx = inf;
    xRes = (x(end) - x(1))/(length(x) - 1);
    for xVal = x(1):xRes:x(end)
        idx = fix((xVal - x(1)) / xRes + 2);
        if ( (y1(idx-1) <= y2(idx-1)) && (y1(idx) >= y2(idx)) )  
            crossIdx = idx;
            break;
        end
    end
    if(crossIdx ~= inf)
        xc = x(crossIdx);
        yc = y1(crossIdx);
    else
        xc = nan;
        yc = nan;
    end
end