图像缩略图

曲线交叉口

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

316下载

更新2010年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 =罪(4 * t) + 2;x1 = r1。* cos (t);日元= r1。* sin (t);
r2 =罪(8 * t) + 2;x2 = r2。* cos (t);y2 = r2。* sin (t);
p = Interx([x1; y1],[x2; y2]);
绘图(X1,Y1,X2,Y2,P(1,:),p(2,:),'Ro')

引用

ns(2020)。曲线交叉口(//www.tianjin-qmedu.com/matlabcentral/fileexchange/22441-curve-Intersections),Matlab中央文件兑换。检索到

意见及评分(113.

效果完美。非常感谢。

gu

杨璐

嗨,NS,
我试图将它转换为Fortran。你能帮我详细了解C1和C2还是背后的逻辑理论?

伟大的功能。我用它来自动阅读我的曲线与水平线相交的X轴。在以下对Interx(L1,L2)进行以下说明后,它完美无瑕地工作。

Chamanth

高度灵感的功能。

卢卡斯

感谢这个非常有用的功能!
我需要仅确定高于一组减少线函数的交叉点(即,带负斜率)。如何更改此代码以达到这些要点?
问候,

Ned气

一个非常有用的功能。谢谢!

你好,
我尝试了在查找方面的代码,如果广场与闭合曲线(多边形)相交。我收到以下错误:
使用bsxfun时出错
两个输入数组的非单维必须彼此匹配。
Interx中的错误(第63行)
C1 = FeVal(HF,D(BSXFUN(@次,DX1,Y2)-BSXFUN(@次,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;绘图(x([i i + 1]),y([i i + 1]),'linewidth',i);结尾;
p = Interx([x; y])

R2019A中没有这样的命令

它的工作,但并不像承诺那样快。在与“交叉点”函数的测试比较后给出相似的结果:

Interx =经过时间为10.502146秒。
交叉点=经过时间为10.567976秒。

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

苏打汗

嗨,我是matlab的新手,我在尝试运行这个代码时获得这个错误,有人请帮帮我。

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

在此上下文中未实施的嵌套功能

函数u = D(x,y)

任何帮助都会受到欣赏,谢谢!

嗨,我正在尝试计算垂直线和两个数据向量描述的曲线之间的交叉点。这个功能似乎有效,但它给了我两套坐标,只有一个可能的十字路口给出了我输入的信息。也许这与曲线是一系列数据点而不是数学曲线的事实有关?因为曲线来自输入的DataPoints的列表,所以我尝试确定Y值的X值在两点之间。任何解密此输出的帮助都将是巨大的。

我的matlab告诉我“interx”是一个未定义的功能

杨璐

嗨,NS,

代码非常好。我找到了十字路口的价值,但现在我想找到索引。当我使用查找函数时,它找不到交叉点的正确索引,但是空值。你能帮我找到找到交叉点的正确索引的方法吗?

提前致谢!

杨。

AUREA94

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

使用Symengine时出错(第59行)
阵列大小必须匹配。

sym / privbinaryop中的错误(第903行)
csym = mupadmex(op,args {1} .s,args {2} .s,
变长度输入宗量{:});

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

Interx错误(第60行)
s1 = dx1。* y1(1:end-1) - dy1。* x1(1:结束-1);

solve_equation错误(第28行)
p = Interx(L1,L2);

不起作用。有2行确实交叉,但我没有xing信息....空数组!看起来别人有幸了。

多米尼克

伟大的脚本-工作完美。我有一个问题-我有几个交叉计算,我想知道它将是多么容易的矢量计算,以提高代码性能?干杯,本

陈而调

它给出了这两条线的交点。
L1 = [1152.3 1069.6;
559.6 - 656.1)
L2 = [1570.3 1564.1;
884.1 937.2]

ozan celik

嗨,代码非常好。谢谢!

我有一个问题,是否有可能使用此功能来查找传感器时尚的多条曲线的交点?假设我们有一组被存储为矩阵A的列的曲线,并且我们具有另一组存储作为矩阵B的列。是否可以找到与B的(:,i)的交叉点(:我)不使用循环?

sundar

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

它工作得非常好!谢谢你!

非常快,简单,有用。

尼科

ashutosh.

好奇在给定的函数中是什么?不断为未定义的变量D表示错误

伟大的。易于使用。非常感谢!!!

如果线的兴趣超出给定的点,则无法处理

HiWave

作品伟大,然而知道当输入包含多个生物系统时交叉点是谁的

Ryan MeeEre.

然而,此代码非常适合,即使它们仅重叠,此代码也表示即使它们也相交。例如:
xA = [0 0 1];yA = [0 1 1];线= (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 =

0 0 0 0.2500 0.5000
0.5000 0.7500 1.0000 1.0000 1.0000

我正在寻找一个代码,这些代码会说如果他们实际交叉,那么行就会相交。有任何想法吗?

r p.

@jonathancamilleri问题是什么。我得到了同样的错误

郑增

KSSV

令人敬畏的功能,谢谢!

元君赵

很棒的代码,对我有很大帮助!谢谢! !

Erik官员

很棒的代码!非常感谢!

忽略我以前的评论。意识到出了什么问题。

嗨,我正在尝试使用此功能,但我继续收到以下错误:

Interx错误(第60行)
s1 = dx1。* y1(1:end-1) - dy1。* x1(1:结束-1);

data_vis中的错误(第66行)
Inter = Interx(F1,F2);

但是,我的曲线,F1和F2都是相同的尺寸,25525 x 1双倍。#

有什么建议?

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,:),'Ro')
轴相等

海蒂湖

asif asif

太好了!
是否可以获得交叉点以及逻辑向量,该逻辑矢量表示交叉点涉及的相应曲线/线?稍后,我想基于线/曲线为交叉点分配权重。
非常感谢任何帮助。谢谢!

博士

更详细的评论来。

Hojoon Choo.

这正是我所寻找的。谢谢!

E. Cheynet.

纽丁

Brian Kim

顺便说一下,我想知道这个代码是否足够在非线性。

我怎样才能下载这个文件?

评论我的评论(见下文):当您不仅在分数中感兴趣而且在指数中,我现在想,这是最好不要使用“独特”或“unquetol”。(当您正在调查自交叉点时,这尤其重要。然后一个交叉点在I和J中的不同索引处导致P中的多个条目。)
否则,您可能会向指数I和J的指数松开正确的分配。

BBOYSLUG.

备注很好,因为您的绘制数据序列矩阵均具有相同的尺寸。我认为这是“它不起作用”的问题。对于我手头的任务,我的两个数据序列的尺寸不相同,因此它给出了一个horzcat错误。这将是更新代码的良好方法,如果它也可以使用与不同大小不同的两个矩阵/数据系列。:)

非常好,非常快。
我想我发现了一个次要的错误,只有您对预期交叉点的指数I和J感兴趣。
我建议替换第76行和77号线:
[p,ind] = Unquetol([Dx2(j)。* s1(i) - dx1(i)。* s2(j),dy2(j)。* s1(i) - dy1(i)。* s2(j)]./[L L],eps,'ByRows',true);
p = p';
我= i(ind)+1;
j =(印第安纳州)+ 1;

通过这种方式,对指数的分类也会分配排序(来自唯一或更好的Uniquetol)。此外,我将义肢增加1,但这或多或少的味道问题。

作为

谢谢你这个梦幻般的代码。

永寿梁

永寿梁

嗨,ns。谢谢你的优秀代码。它真的很快运行。但是,我也有问题是emil的问题。当输入点为2000多列时,它就会脱离内存。MATLAB的版本是2014A(Windows上的64位)。你能给我发给我修改的代码或给我一些建议吗?我的电子邮件是:liangys363@gmail.com。非常感谢。

埃里克五

谢谢。那太棒了。工作正常。

这是行不通的。

这一功能证明对我非常有帮助。谢谢你分享,并感谢您编写如此漂亮的简洁的代码。

太感谢了。伟大的算法和效果完美而超快。

无话语

Ilya

展示如何获取(全部)的“T”,它会出现“T”,这将是有帮助的。

即参数“t”的两个值对应于每个自交。

Ilya

展示如何获取(全部)的“T”,它会出现“T”,这将是有帮助的。

我搜索了一个快速的交叉点函数,我找不到比这个更快的函数。

我有点惊讶的是,重复的子函数调用与它们在大曲线上的速度一样快。对一些运算进行矢量化可以加快函数的速度,但只适用于较小的曲线。

ns.

对Emil:谢谢你的评论。遗憾的是,除非用来循环,否则没有多少可以做到这一点,这可能很可能会延迟执行时间。

为了尽可能快地制作执行时间,我需要创建n×m矩阵,其中n和m是每个曲线中的段的数量。

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

或者,与我联系,向您发送修改我的代码以使用您的数据测试。但是,我无法保证结果的准确性,因为我没有对它进行广泛的测试,但似乎工作。

我经常使用此功能来分析机置数据中的阈值交叉,我喜欢它!但是,自2012B在2012B上的64位Windows机器上,即使只测试20000列向量,我也会继续内存耗尽内存。解决这个问题的任何想法?

馅饼mes.

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

嗨ns.
请忽略上述评论。我找到了一种方法并使用您的代码。

致以最亲切的问候。

嗨ns.

谢谢你的份额。
在我的情况下,我在点数据表单中有两行。例如,我有3列的数据y,x1和x2。通过绘制和连接(X1,Y)而获得第一线L1,并且通过绘制和连接(X2,Y)获得第二线L2。
你能解释一下我怎样把这个点数据转换成这里描述的“两行矩阵”吗?

最好的事物

ns.

飞行员:是的,它应该处理这些情况。

飞行员

如果图形的段是垂直的段,则此代码是否会适应交叉点?

亚当

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

缬草

真的很有帮助…非常感谢

张燕祥

亚当

确实是它所说的。没问题。

Oguzcan.

有用、高效、快速

更新

1.5.0.0.

修复了刘Minjie标识的错误,这些错误有时会出现两点线段。

1.3.0.0.

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

Matlab释放兼容性
用R2008a创建
与任何版本兼容
平台兼容性
视窗 苹果系统 Linux.