图片缩略图

曲线的交点

版本1.5.0.0 (2.47 KB) NS
利用矢量化快速计算曲线的交点和自交点。

283下载

更新9月24日

查看许可协议

虽然在FEX中已经存在其他一些计算曲线交点的函数,但这段简短的代码是以速度为最高优先级编写的。整个过程中不使用循环,充分利用MATLAB的向量化功能

我欢迎任何评论,建议,错误报告等。

------------------------------------------------------------------------------

曲线的交点
P = INTERX(L1,L2)返回两条曲线L1的交点
和L2。曲线L1,L2可以是闭合的,也可以是开放的
通过两行矩阵,其中每行包含它的x和y坐标。
曲线组的交点(如等高线、乘法)
连接区域等)也可以通过用a分隔它们来计算
列的nan为例

L = [x11 x12 x13…]NaN x21 x22 x23…
Y11 y12 y13…NaN y21 y22 y23…]

P具有与L1和L2相同的结构,它的行对应于
L1和L2交点的x坐标和y坐标。如果没有
如果找到交点,返回的P为空。

P = INTERX(L1)返回L1的自交点。保持
代码很简单,曲线与自身相切的点是
不包括在内。P = INTERX(L1,L1)返回曲线上的所有点
和任何自交点一起。

例子:
T = linspace(0,2*pi);
R1 = sin(4*t)+2;X1 = r1 *cos(t);Y1 = r1 * sint;
R2 = sin(8*t)+2;X2 = r2 *cos(t);Y2 = r2 * sint;
P = InterX([x1;y1],[x2;y2]);
情节(x1, y1, x2, y2, P(1:)、P(2:),“罗”)

引用作为

NS(2020)。曲线的交点(//www.tatmou.com/matlabcentral/fileexchange/22441-curve-intersections), MATLAB中央文件交换。检索

意见及评分(113

完美的工作。非常感谢。

官厅苏

吕杨

嗨,NS,
我试着把它翻译成fortran语言。你能帮我详细理解一下C1和C2或者它背后的逻辑理论吗?

伟大的功能。我用它来自动读取x轴,我的曲线相交于一条水平线。在遵循INTERX(L1,L2)的说明后,它完美地工作了。

Chamanth

高度资源丰富的功能。

谢谢这个非常有用的功能!
我只需要确定在一组递减的线函数(即具有负斜率)之上的交点。如何修改代码以达到这些点?
问候,

Ned气

西蒙周

一个非常有用的函数。谢谢!

你好,
我尝试了你的代码来寻找一个正方形相交于一个闭合曲线(多边形)。我得到以下错误:
使用bsxfun时出错
两个输入数组的非单例维度必须相互匹配。
InterX错误(第63行)
C1 = feval(hF,D(bsxfun(@times,dx1,y2)-bsxfun(@times,dy1,x2),S1),0);
Pixelize_Collimator_Aperture_v2错误(第107行)
P = InterX([X;Y],[sqx;sqy]);

多边形是由42个点组成的闭合曲线。
方形是由5个点组成的封闭方形曲线
这两条曲线上的点必须相等吗?你的描述中没有提到。
如果你愿意,我可以把我的曲线和正方形发给你。
谢谢你!
莫拉

Mindaugas

如果自交点在输入中,InterX函数返回空点列表。
例如,InterX返回空列表,但自交点在这段代码中为[1 1]:
X =[0 1 2 1 1];
Y =[1 1 1 2 0];
图;持有(上);
i = 1:长度(x) 1;plot(x([i i+1]),y([i i+1]),'LineWidth',i);结束;
P = InterX ((x, y))

R2019a中没有这样的命令

朱尔斯雷

它可以工作,但没有承诺的那么快。在与“交叉”函数进行测试比较后,给出了非常相似的结果:

InterX =运行时间为10.502146秒。
intersecsections =运行时间为10.567976秒。

两者都使用相同的两条曲线进行比较,各由1200点构成。

萨利姆汗

嗨,我是Matlab的新手,我在试图运行这段代码时得到了这个错误,有人可以帮助我。

文件c:\ users \ omar - pc \ desktop \算法问题\数据集\octave\code_samp附近的第176行解析错误
les \ octave.m

在此上下文中没有实现嵌套函数

>>>函数u = D(x,y)

任何帮助都将不胜感激,谢谢!

嗨,我正试图计算一条垂直线和由两个数据向量描述的曲线之间的交点。这个函数看起来是可行的,但它给了我两组坐标,并且只有一个可能的交集给出了我输入的信息。也许这与曲线是数据点的数组而不是数学曲线有关?因为曲线来自输入的数据点列表,我试图确定的x值y值是在两点之间。任何对解密这一输出的帮助都将是巨大的。

我的matlab告诉我“InterX”是一个未定义的函数

吕杨

嗨,NS,

代码运行得非常好。我求出交点的值但现在我要求下标。当我使用find函数时,它没有找到交点的正确索引,而是空值。你能告诉我如何找到交点的正确索引吗?

提前谢谢!

杨。

Aurea94

你好,我一直得到错误如下。

使用symengine时出错(第59行)
数组大小必须匹配。

sym/privBinaryOp错误(第903行)
Csym = mupadmex(op,args{1}。年代,args{2}授予,
变长度输入宗量{:});

*中的错误(第238行)
X = privBinaryOp(A, B, 'symobj::zip', '_mult');

InterX错误(第60行)
S1 = dx1.*y1(1:end-1) - dy1.*x1(1:end-1);

solve_equation中的错误(第28行)
P = InterX(L1,L2);

大卫Stolnis

不管用。有2条线确实交叉,但我没有邢信息....空数组!不过看起来其他人运气不错。

杜米尼克

本Mohankumar

伟大的剧本-工作完美。我有一个问题-我有几个十字路口要计算,我想知道向量化计算来提高代码性能有多容易?干杯,本

严特陈

它给出的交点是空的当它们相交的时候。
L1 = [1152.3 1069.6;
559.6 - 656.1)
L2 = [1570.3 1564.1;
884.1 - 937.2)

嗨,代码工作得很好。谢谢!

我有一个问题,有没有可能用这个函数以向量化的方式求出多条曲线的交点?假设我们有一组曲线,存储为矩阵a的列,还有另一组曲线,存储为矩阵B的列,是否有可能在不使用for循环的情况下找到a (:,i)与B(:,i)的交集?

sundar

完美的工作!非常感谢你的代码。

它运行得非常好!谢谢你!

非常快,简单,有用。

尼科

Ashutosh

很好奇D在给定函数中是什么?对于未定义的变量D一直给出错误

太好了。使用简单。非常感谢!

不能处理超出给定点的线

HiWave

工作很棒,但如果知道输入包含多条曲线时与谁相交会很好

这段代码工作得很好,但是,这段代码表明,即使直线只是重叠,它们也会相交。例如:
xA = [0 0 1];yA = [0 1 1];LineA = [xA;yA];
xB = [0 0 .25 .25 0 0 .25 .25 .5 .5 1];yB = [0 .5 .5 .75 .75 1 1 .75 .75 1 1];LineB = [xB;yB];
情节(xA,是的,xB, yB);
P = InterX(LineA,LineB)

P =

000 0.2500 0.5000
0.5000 0.7500 1.0000 1.0000 1.0000

我在寻找一种代码,它会说,两条线只有在实际相交时才相交。什么好主意吗?

r p

大卫Onywoki

@JonathanCamilleri有什么问题。我得到了同样的错误

程曾

KSSV

很棒的功能,谢谢!

Yuanjun赵

伟大的代码,帮助我很多!谢谢! !

很棒的代码!非常感谢!

忽略我之前的评论。意识到哪里出了问题。

嗨,我正在尝试使用这个函数,但我一直得到以下错误:

InterX错误(第60行)
S1 = dx1.*y1(1:end-1) - dy1.*x1(1:end-1);

data_vis中的错误(第66行)
inter = InterX(f1, f2);

然而,我的曲线,f1和f2都是相同的大小,25525 x 1 double.#

有什么建议吗?

cebum

PH值

希瑟

例子中的一些问题:
T = 0:pi/200:2*pi;
R1 = 2;X1 = r1 *cos(t)+2;Y1 = r1 *sin(1*t);
X2 = t;Y2 = t-3;
P = InterX([x1;y1],[x2;y2]);
情节(x1, y1, x2, y2, P(1:)、P(2:),“罗”)
轴平等

太好了!
是否有可能获得交点以及表示交点所涉及的相应曲线/直线的逻辑向量?之后,我想根据直线/曲线为交点分配权重。
任何帮助都非常感激。谢谢!

稍后会有更详细的评论。

这正是我要找的。谢谢!

Brian Kim

顺便说一下,我想知道这段代码是否适用于非线性。

我如何下载这个文件?

评论我的评论(见下文):当你不仅对点感兴趣,而且对索引感兴趣时,我现在认为,最好不要使用'unique'或'uniquetol'。(当你在研究自我交叉时,这一点尤其重要。然后,一个交点导致P中i和j中不同指标处的多个元素。)
否则你可能会失去从点到下标i和j的正确分配。

如果你绘制的两个数据序列矩阵大小相同,那么效果很好。我认为这就是那个“它不管用”的人遇到的问题。对于我手头的任务,我的两个数据序列的大小不一样,所以它给出了一个horzcat错误。如果它也可以处理两个大小不相同的矩阵/数据系列,那么这将是更新代码的好方法。:)

非常好,非常快。
我想我发现了一个小错误,只有当你对指数I和j感兴趣时,它才有意义,因为它们的交集是预期的。
我建议将第76行和第77行改为:
[P,印第安纳州]= uniquetol ([dx2 (j)。* S1 (i) - dx1 (i)。* S2 (j), dy2 (j)。* S1 (i) -₁(i)。* S2 (j)]。/ (L L)、eps、“ByRows”,真正的);
P = P ';
我=(印第安纳州)+ 1;
j =(印第安纳州)+ 1;

通过这种方式,排序(来自unique或更好的uniquetol)也被分配给索引。另外,我将指数增加了1,但这或多或少是一个品味问题。

作为

谢谢你写了这么棒的代码。

阿施施

Yongshou梁

Yongshou梁

嗨,NS。感谢这段优秀的代码。它跑得很快。然而,我也有和埃米尔一样的问题。当输入点是超过20000列的向量时,内存不足。我的matlab版本是2014a (windows上64位)。你能把修改后的代码发给我或者给我一些建议吗?我的邮箱是:Liangys363@gmail.com。非常感谢。

埃里克·V

谢谢。太好了。工作很好。

这是行不通的。

事实证明,这个功能对我很有帮助。谢谢你的分享,谢谢你写了这么漂亮,整洁的代码。

非常感谢。伟大的算法,工作完美和超快。

说不出话来

Ilya

这将有助于展示如何获得“t”的(所有)值,在交叉点发生。

也就是说,参数“t”的两个值对应于每个自交。

Ilya

这将有助于展示如何获得“t”的(所有)值,在交叉点发生。

我已经寻找了一个快速的交叉函数,我找不到一个比这个更快的。

我有点惊讶,重复的子函数调用和它们对大曲线的调用一样快。向量化某些操作可以加快函数的速度,但仅适用于较小的曲线。

NS

致埃米尔:谢谢你的评论。不幸的是,对此没有太多办法,除非使用for循环,这可能会大大延迟执行时间。

为了使执行时间尽可能快,我需要创建N x M个矩阵,其中N和M是每条曲线中的段数。

也许您可以尝试File Exchange上不使用向量化的其他贡献,但它可能非常慢(对于这种大小的向量的交叉应该有大约4e10个测试!)

或者,与我联系,向您发送修改我的代码测试与您的数据。然而,我不能保证结果的准确性,因为我没有做大量的测试,但它似乎工作。

我经常使用这个函数来分析运动数据中的阈值跨越,我喜欢它!然而,自从2012年在一台64位windows机器上使用它以来,即使只是测试20000个列向量,我的内存也一直不够用。有什么解决办法吗?

派Mes

非常好的,快速和多功能的代码。大的UPS。

默罕默德

嗨NS
请忽略上面的评论。我找到了一种方法,使用你的代码。

致以最亲切的问候。

默罕默德

嗨NS

谢谢分享!
在我的例子中,我在点数据形式中有两条线。例如,我有三列数据Y X1和X2。第一行L1由作图连接(X1,Y)得到,第二行L2由作图连接(X2,Y)得到。
你能解释一下我如何将这个点数据转换为这里描述的“两行矩阵”吗?

最好的

NS

致Aviator:是的,它应该处理这些情况。

飞行员

如果图形的一段是垂直的,这个代码是否适应交点?

亚当

非常感谢这个功能!!工作正确的其他交叉函数没有!!

缬草

真的很有帮助.....非常感谢

亚当

完全按照上面说的做。没有问题。

Oguzcan

有用、高效、快速

更新

1.5.0.0

修正了刘敏杰发现的两点线段有时会出现的错误。

1.3.0.0

更快的执行和更好的内存管理

MATLAB版本兼容性
使用R2008a创建
与任何版本兼容
平台的兼容性
窗户 macOS Linux