虽然在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中央文件交换。检索.
1.5.0.0 | 修正了刘敏杰发现的两点线段有时会出现的错误。 |
|
1.3.0.0 | 更快的执行和更好的内存管理 |
加扬·德·席尔瓦(查看配置文件)
完美的工作。非常感谢。
查克·海登(查看配置文件)
官厅苏(查看配置文件)
吕杨(查看配置文件)
嗨,NS,
我试着把它翻译成fortran语言。你能帮我详细理解一下C1和C2或者它背后的逻辑理论吗?
萨尔曼·汗(查看配置文件)
伟大的功能。我用它来自动读取x轴,我的曲线相交于一条水平线。在遵循INTERX(L1,L2)的说明后,它完美地工作了。
Chamanth(查看配置文件)
高度资源丰富的功能。
卢卡斯(查看配置文件)
谢谢这个非常有用的功能!
我只需要确定在一组递减的线函数(即具有负斜率)之上的交点。如何修改代码以达到这些点?
问候,
约翰·迈克尔·希基(查看配置文件)
Ned气(查看配置文件)
约瑟夫Lilek(查看配置文件)
西蒙周(查看配置文件)
Mustapha El Hamdaoui(查看配置文件)
一个非常有用的函数。谢谢!
托拜厄斯Kistler(查看配置文件)
莱奥波尔多巴西(查看配置文件)
莫拉Monville(查看配置文件)
你好,
我尝试了你的代码来寻找一个正方形相交于一个闭合曲线(多边形)。我得到以下错误:
使用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点构成。
杜米尼克Mattioli(查看配置文件)
萨利姆汗(查看配置文件)
嗨,我是Matlab的新手,我在试图运行这段代码时得到了这个错误,有人可以帮助我。
文件c:\ users \ omar - pc \ desktop \算法问题\数据集\octave\code_samp附近的第176行解析错误
les \ octave.m
在此上下文中没有实现嵌套函数
>>>函数u = D(x,y)
任何帮助都将不胜感激,谢谢!
凯瑟琳樵夫(查看配置文件)
嗨,我正试图计算一条垂直线和由两个数据向量描述的曲线之间的交点。这个函数看起来是可行的,但它给了我两组坐标,并且只有一个可能的交集给出了我输入的信息。也许这与曲线是数据点的数组而不是数学曲线有关?因为曲线来自输入的数据点列表,我试图确定的x值y值是在两点之间。任何对解密这一输出的帮助都将是巨大的。
阿曼达Bernardy(查看配置文件)
我的matlab告诉我“InterX”是一个未定义的函数
皮姆·范·米尔(查看配置文件)
吕杨(查看配置文件)
嗨,NS,
代码运行得非常好。我求出交点的值但现在我要求下标。当我使用find函数时,它没有找到交点的正确索引,而是空值。你能告诉我如何找到交点的正确索引吗?
提前谢谢!
杨。
Aurea94(查看配置文件)
Jorge青瓷(查看配置文件)
这是matlab函数https://es.mathworks.com/help/map/ref/polyxpoly.html
这里离马纳利市DODIYA(查看配置文件)
你好,我一直得到错误如下。
使用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(查看配置文件)
伟大的剧本-工作完美。我有一个问题-我有几个十字路口要计算,我想知道向量化计算来提高代码性能有多容易?干杯,本
迈克尔Redling(查看配置文件)
艾玛。SGHAIER(查看配置文件)
莱奥波尔多巴西(查看配置文件)
严特陈(查看配置文件)
Tinashe Martin Gonese(查看配置文件)
赛义德·阿玛尔·阿巴斯(查看配置文件)
它给出的交点是空的当它们相交的时候。
L1 = [1152.3 1069.6;
559.6 - 656.1)
L2 = [1570.3 1564.1;
884.1 - 937.2)
Ozan侯赛因(查看配置文件)
嗨,代码工作得很好。谢谢!
我有一个问题,有没有可能用这个函数以向量化的方式求出多条曲线的交点?假设我们有一组曲线,存储为矩阵a的列,还有另一组曲线,存储为矩阵B的列,是否有可能在不使用for循环的情况下找到a (:,i)与B(:,i)的交集?
sundar(查看配置文件)
完美的工作!非常感谢你的代码。
Mahta Mazloumi(查看配置文件)
它运行得非常好!谢谢你!
内迪姆Gökhan艾丁(查看配置文件)
非常快,简单,有用。
尼科(查看配置文件)
Ashutosh(查看配置文件)
很好奇D在给定函数中是什么?对于未定义的变量D一直给出错误
普什卡Mahajan(查看配置文件)
太好了。使用简单。非常感谢!
Randika Vithanage(查看配置文件)
不能处理超出给定点的线
HiWave(查看配置文件)
工作很棒,但如果知道输入包含多条曲线时与谁相交会很好
阿里Hassanzadeh(查看配置文件)
瑞安Meekins(查看配置文件)
这段代码工作得很好,但是,这段代码表明,即使直线只是重叠,它们也会相交。例如:
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(查看配置文件)
劳拉·伯科威茨(查看配置文件)
炳森台(查看配置文件)
塞缪尔·佩提特金(查看配置文件)
Emrecan日元(查看配置文件)
很棒的功能,谢谢!
Yuanjun赵(查看配置文件)
伟大的代码,帮助我很多!谢谢! !
赛义德·侯赛因(查看配置文件)
埃里克·曼德(查看配置文件)
很棒的代码!非常感谢!
Abrar哈比卜(查看配置文件)
乔纳森·卡米尔(查看配置文件)
忽略我之前的评论。意识到哪里出了问题。
乔纳森·卡米尔(查看配置文件)
嗨,我正在尝试使用这个函数,但我一直得到以下错误:
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:),“罗”)
轴平等
海蒂Loh(查看配置文件)
阿西夫Arain(查看配置文件)
太好了!
是否有可能获得交点以及表示交点所涉及的相应曲线/直线的逻辑向量?之后,我想根据直线/曲线为交点分配权重。
任何帮助都非常感激。谢谢!
得很好的(查看配置文件)
BluePoseidon1643(查看配置文件)
稍后会有更详细的评论。
Tamas Balogh(查看配置文件)
哈里什·坎卡纳拉先生(查看配置文件)
Hojoon Choo(查看配置文件)
这正是我要找的。谢谢!
大肠Cheynet(查看配置文件)
尼(查看配置文件)
Brian Kim(查看配置文件)
顺便说一下,我想知道这段代码是否适用于非线性。
farnaz hajipour(查看配置文件)
我如何下载这个文件?
马蒂亚斯(查看配置文件)
评论我的评论(见下文):当你不仅对点感兴趣,而且对索引感兴趣时,我现在认为,最好不要使用'unique'或'uniquetol'。(当你在研究自我交叉时,这一点尤其重要。然后,一个交点导致P中i和j中不同指标处的多个元素。)
否则你可能会失去从点到下标i和j的正确分配。
BboySlug(查看配置文件)
如果你绘制的两个数据序列矩阵大小相同,那么效果很好。我认为这就是那个“它不管用”的人遇到的问题。对于我手头的任务,我的两个数据序列的大小不一样,所以它给出了一个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,但这或多或少是一个品味问题。
作为(查看配置文件)
Pouriya Zarbafian(查看配置文件)
Tillmann Stubler(查看配置文件)
维托·拉马略·德·布里托(查看配置文件)
谢谢你写了这么棒的代码。
阿施施(查看配置文件)
Yongshou梁(查看配置文件)
Yongshou梁(查看配置文件)
嗨,NS。感谢这段优秀的代码。它跑得很快。然而,我也有和埃米尔一样的问题。当输入点是超过20000列的向量时,内存不足。我的matlab版本是2014a (windows上64位)。你能把修改后的代码发给我或者给我一些建议吗?我的邮箱是:Liangys363@gmail.com。非常感谢。
埃里克·V(查看配置文件)
谢谢。太好了。工作很好。
亚伯布朗(查看配置文件)
君永乐(查看配置文件)
这是行不通的。
乍得格林(查看配置文件)
事实证明,这个功能对我很有帮助。谢谢你的分享,谢谢你写了这么漂亮,整洁的代码。
阿(查看配置文件)
非常感谢。伟大的算法,工作完美和超快。
说不出话来
Ilya(查看配置文件)
这将有助于展示如何获得“t”的(所有)值,在交叉点发生。
也就是说,参数“t”的两个值对应于每个自交。
Ilya(查看配置文件)
这将有助于展示如何获得“t”的(所有)值,在交叉点发生。
马修Arthington(查看配置文件)
我已经寻找了一个快速的交叉函数,我找不到一个比这个更快的。
我有点惊讶,重复的子函数调用和它们对大曲线的调用一样快。向量化某些操作可以加快函数的速度,但仅适用于较小的曲线。
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:是的,它应该处理这些情况。
飞行员(查看配置文件)
如果图形的一段是垂直的,这个代码是否适应交点?
亚当(查看配置文件)
非常感谢这个功能!!工作正确的其他交叉函数没有!!
Jeroen van Nugteren(查看配置文件)
缬草(查看配置文件)
阿伊莎sohail(查看配置文件)
真的很有帮助.....非常感谢
张Yanxiang股份(查看配置文件)
亚当(查看配置文件)
完全按照上面说的做。没有问题。
Oguzcan(查看配置文件)
有用、高效、快速