图片缩略图

曲线的交点

version 1.5.0.0 (2.47 KB) by NS
使用矢量化快速计算曲线的交叉点和自交集。
4.6
99年评级

267下载

更新2010年9月24日

查看版本历史记录

查看许可协议

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

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

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

曲线的Interx交叉点
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。* SIN(T);
R2 = SIN(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:),“罗”)

引用

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

评论和评级(123.

妮可fevola

Nguyen Nhan Tinh.

谢谢NS。
你能帮我详细理解一下C1和C2吗,或者逻辑理论。

Ali Moshrefzadeh.

Moayed Jumah

为什么我不能用这个函数来求任意两条直线的交点?

Patrikforssén.

伟大的提交!缺少的一件事是交叉段的指数。但是,这很容易以一些次要的代码修改修复。将函数头更改为,
[P, i, j] = InterXMod(L1, varargin)
并将行76更改为,
[p,ind] =唯一([dx2(j)。* s1(i) - dx1(i)。* s2(j),...
dy2 (j)。* S1 (i) -₁(i)。* S2 (j)]。/ (L L)、“行”、“稳定”);
p = p';我= I(IND);j = j(ind);
然后,输出变量“i”中应该有第一次提供的折线的交点索引,输出变量“j”中应该有第二次提供的折线的交点索引。

耶稣·波塔利亚

马库斯武家

阿道夫•Veliz

博季诺夫迪斯科

Siddhanth谢蒂

Gayan de Silva.

完美的工作。非常感谢。

查克·海登

官厅苏

吕杨

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

萨尔曼·汗

伟大的功能。我用它自动读取曲线与水平线相交的x轴。在按照INTERX(L1,L2)的说明操作后,它工作得完美无缺。

Chamanth.

高度灵感的功能。

卢卡斯

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

约翰迈克尔赫基

齐齐

约瑟夫Lilek

Simon Chou.

幕斯塔法El Hamdaoui

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

Tobias Kistler.

Leopoldo Brasil.

Maura E. Monville.

你好,
我尝试了在查找方面的代码,如果广场与闭合曲线(多边形)相交。我收到以下错误:
错误使用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个点组成的封闭正方形曲线
两条曲线必须具有相同数量的积分吗?在您的描述中未指定。
如果你愿意,我可以发送我的曲线和正方形。
谢谢
毛鲁拉

心态

如果输入是自交点,则返回空的点列表。
例如,InterX返回空列表,但在此代码中self-交集点为[1 1]:
X =[0 1 2 1 1];
Y = [1 1 1 2 0];
数字;坚持,稍等');
i = 1:长度(x) 1;情节(x([我+ 1]),y([我+ 1]),“线宽”,i);结束;
P = InterX ((x, y))

威廉芦苇

在R2019a中没有这样的命令

朱尔斯雷

它能工作,但没有承诺的那么快。经过与“intersection”函数的对比测试,得到了非常相似的结果:

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

两者都使用相同的两条曲线,每个曲线形成1200点。

Dominik Mattioli.

苏打汗

你好,我是新的Matlab,我得到这个错误,而试图运行这段代码,有人请帮助我。

在文件C:\ Users \ omar-PC \ Desktop \ Algo问题\ Data Set \ Octave \ Code_Samp附近解析错误
les \ octave.m.

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

>>>功能U = D(x,y)

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

Kathryn Feller.

嗨,我正在计算一条垂直线和一条由两个数据向量描述的曲线的交点。这个函数似乎是可行的,但是它给了我两组坐标,对于我输入的信息,只有一个可能的交集。也许这与曲线是数据点的数组而不是数学曲线有关?因为曲线是由一系列输入的数据点组成的,所以我要确定的x值是两点之间的y值。破译这个输出的任何帮助都是巨大的。

Amanda Bernardy.

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

Pim范·密尔

吕杨

嗨ns,

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

提前致谢!

杨。

Aurea94

这里离马纳利市DODIYA

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

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

在sym/privBinaryOp中出现错误
Csym = mupadmex (op, args{1}。年代,args{2}授予,
varargin {:});

错误。*(第238行)
x = Privbinaryop(a,b,'symobj :: zip','_mult');

InterX错误(第60行)
S1 = y1(1: = y1) - y1(1: = y1);

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

塞缪尔·凯尔西

大卫Stolnis

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

杜米尼克

本Mohankumar

伟大的脚本 - 完美的工作。我有一个问题 - 我有几个交叉路口计算,我想知道矢量发布计算以提高代码性能如何?干杯,本

迈克尔雷岭

emna sghaier

Leopoldo Brasil.

陈而调

Tinashe马丁Gonese

Syed Ammar Abbas.

当他们实际确实如此感情时,它为这些行提供了空的交叉点。
l1 = [1152.3 1069.6;
559.6 656.1]
l2 = [1570.3 1564.1;
884.1 - 937.2)

Ozan侯赛因

嗨,代码运行得很好。谢谢!

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

孙尔

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

Mahta Mazloumi.

它的工作非常好!谢谢

NedimGökhanAydin

非常快,简单和有用。

尼古拉

Ashutosh

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

普什卡Mahajan

太好了。易于使用。非常感谢!!

Randika Vithanage

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

hiwwave.

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

Ali Hassanzadeh.

瑞安Meekins

然而,此代码非常适合,即使它们仅重叠,此代码也表示即使它们也相交。例如:
xa = [0 0 1];ya = [0 1 1];Linea = [xa; ya];
xB = [0 0 .25 .25 0 0 .25 .5 .5 1];yB = [0 .5 .75 .75 1 1 .75 .75 1 1];LineB = [xB;];
情节(Xa,Ya,Xb,Yb);
LineB P = InterX(白)

P =

000 0.2500 0.5000
0.5000 0.7500 1.0000 1.0000 1.0000

我在寻找一种代码,它会告诉你,只有当它们真的相交时,两条线才会相交。什么好主意吗?

迈克尔曼恩

约书亚柯林斯

格伦·戈麦斯

亚历山大·赫尔曼

r p

大卫Onywoki

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

程曾

KSSV

Laura Berkowitz.

宾森泰

Samuel Petitjean.

Emrecan日元

很棒的功能,谢谢!

Yuanjun赵

很棒的代码,帮助我很多!谢谢!!!

赛义德·侯赛因

Erik官员

很棒的代码!非常感谢!

Abrar哈比卜

乔纳森·卡米尔

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

乔纳森·卡米尔

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

InterX错误(第60行)
S1 = y1(1: = y1) - y1(1: = y1);

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

然而,我的曲线,f1和f2都是相同的大小,25525 x 1的两倍

有什么建议吗?

宿料

PH值

希瑟

例子中的一些问题:
t = 0:π/ 200:2 *π;
r1 = 2;x1 = r1。* cost + 2;日元= r1。*罪(1 * t);
x2 = t;y2 =条t - 3;
p = Interx([x1; y1],[x2; y2]);
情节(x1, y1, x2, y2, P(1:)、P(2:),“罗”)
轴相等

海蒂Loh

asif asif

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

博士

BluePoseidon1643

更详细的评论将会出现。

tamásbalogh.

Hojoon Choo

这正是我想要的。谢谢!

大肠Cheynet

Brian Kim

顺便说一句,我想知道这个代码是否在非线性上充分。

Farnaz Hajipour.

我如何下载这个文件?

马蒂亚斯

评论我的评论(见下文):当您不仅在分数中感兴趣而且在指数中,我现在想,这是最好不要使用“独特”或“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 ';
我=(印第安纳州)+ 1;
j = j(ind)+1;

这样,排序(来自unique或更好的uniquetol)也被分配给索引。此外,我增加了1的指数,但这或多或少是一个口味问题。

作为

Pouriya Zarbafian

Tillmann Stubler

Vitor Ramalho de Brito

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

ashish.

Yongshou梁

Yongshou梁

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

埃里克·V

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

亚伯布朗

小君你勒

这行不通。

乍得格林

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

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

无话语

伊利亚

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

即,参数“T”的两个值对应于每个自交叉口。

伊利亚

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

马修·阿切顿

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

我有点惊讶,重复的子宫函数调用与大曲线一样快。向量提高一些操作速度升高了功能,但仅适用于较小的曲线。

NS

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

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

也许您可以尝试对不利用矢量化的文件交换的其他一些贡献,但它可能非常慢(应该有大约4E10的测试对该尺寸的矢量交叉口!)

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

埃米尔奥尔森

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

派Mes

这是一段非常好的、快速且通用的代码。大的UPS。

默罕默德

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

最好的祝福。

默罕默德

嗨NS

谢谢分享。
在我的例子中,我在点数据形式中有两条线。例如,我有三列数据Y X1 X2。第一条直线L1通过绘图并连接(X1,Y)得到,第二条直线L2通过绘图并连接(X2,Y)得到。
可以请解释我如何将此点数据转换为“双行矩阵”,如此处所述。

最好

NS

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

飞行员

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

亚当

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

Jeroen van Nugteren.

缬草

阿伊莎sohail

真的很乐于助人.....许多谢谢

张燕祥

亚当

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

Oguzcan

有用,高效,快速

MATLAB版本兼容性
创建R2008a
兼容任何释放
平台的兼容性
窗户 macOS Linux

社区宝藏狩猎

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始狩猎!