虽然在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中央文件交换。检索.
谢谢NS。
你能帮我详细理解一下C1和C2吗,或者逻辑理论。
为什么我不能用这个函数来求任意两条直线的交点?
伟大的提交!缺少的一件事是交叉段的指数。但是,这很容易以一些次要的代码修改修复。将函数头更改为,
[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”中应该有第二次提供的折线的交点索引。
完美的工作。非常感谢。
嗨ns,
我试着翻译成fortran语言。你能不能帮我详细的理解一下C1和C2或者它背后的逻辑理论?
伟大的功能。我用它自动读取曲线与水平线相交的x轴。在按照INTERX(L1,L2)的说明操作后,它工作得完美无缺。
高度灵感的功能。
谢谢你这个非常有用的功能!
我只需要确定在一组递减线函数(即斜率为负)之上的交点。我如何更改代码以达到这些点?
问候,
一个非常有用的功能。谢谢!
你好,
我尝试了在查找方面的代码,如果广场与闭合曲线(多边形)相交。我收到以下错误:
错误使用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点。
你好,我是新的Matlab,我得到这个错误,而试图运行这段代码,有人请帮助我。
在文件C:\ Users \ omar-PC \ Desktop \ Algo问题\ Data Set \ Octave \ Code_Samp附近解析错误
les \ octave.m.
嵌套函数在此上下文中未实现
>>>功能U = D(x,y)
任何帮助都将不胜感激,谢谢!
嗨,我正在计算一条垂直线和一条由两个数据向量描述的曲线的交点。这个函数似乎是可行的,但是它给了我两组坐标,对于我输入的信息,只有一个可能的交集。也许这与曲线是数据点的数组而不是数学曲线有关?因为曲线是由一系列输入的数据点组成的,所以我要确定的x值是两点之间的y值。破译这个输出的任何帮助都是巨大的。
我的matlab告诉我“interx”是一个未定义的功能
嗨ns,
代码非常好。我找到了十字路口的价值,但现在我想找到索引。当我使用查找函数时,它找不到交叉点的正确索引,但是空值。你能帮我找到找到交叉点的正确索引的方法吗?
提前致谢!
杨。
这是matlab函数https://es.mathwands.com/help/map/ref/polyxpoly.html.
你好,我一直得到错误如下。
使用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);
不起作用。有2行确实交叉,但我没有xing信息....空数组!看起来别人有幸了。
伟大的脚本 - 完美的工作。我有一个问题 - 我有几个交叉路口计算,我想知道矢量发布计算以提高代码性能如何?干杯,本
当他们实际确实如此感情时,它为这些行提供了空的交叉点。
l1 = [1152.3 1069.6;
559.6 656.1]
l2 = [1570.3 1564.1;
884.1 - 937.2)
嗨,代码运行得很好。谢谢!
我有一个问题,是否有可能使用此功能来查找传感器时尚的多条曲线的交点?假设我们有一组被存储为矩阵A的列的曲线,并且我们具有另一组存储作为矩阵B的列。是否可以找到与B的(:,i)的交叉点(:我)不使用循环?
完美的工作!非常感谢你的代码。
它的工作非常好!谢谢
非常快,简单和有用。
好奇在给定的函数中D是什么?对于未定义的变量D,一直出错
太好了。易于使用。非常感谢!!
如果线条兴趣超出给定点,则无法处理
作品伟大,然而知道当输入包含多个生物系统时交叉点是谁的
然而,此代码非常适合,即使它们仅重叠,此代码也表示即使它们也相交。例如:
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
我在寻找一种代码,它会告诉你,只有当它们真的相交时,两条线才会相交。什么好主意吗?
@JonathanCamilleri出了什么问题。我得到了同样的错误
很棒的功能,谢谢!
很棒的代码,帮助我很多!谢谢!!!
很棒的代码!非常感谢!
忽略我以前的评论。意识到出了什么问题。
嗨,我正在尝试使用此功能,但我继续收到以下错误:
InterX错误(第60行)
S1 = y1(1: = y1) - y1(1: = y1);
data_vis中的错误(第66行)
inter = InterX(f1, f2);
然而,我的曲线,f1和f2都是相同的大小,25525 x 1的两倍
有什么建议吗?
例子中的一些问题:
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:),“罗”)
轴相等
优秀!
是否可以获得交叉点以及逻辑向量,该逻辑矢量表示交叉点涉及的相应曲线/线?稍后,我想基于线/曲线为交叉点分配权重。
任何帮助深表感谢。谢谢!
更详细的评论将会出现。
这正是我想要的。谢谢!
顺便说一句,我想知道这个代码是否在非线性上充分。
我如何下载这个文件?
评论我的评论(见下文):当您不仅在分数中感兴趣而且在指数中,我现在想,这是最好不要使用“独特”或“unquetol”。(当您正在调查自交叉点时,这尤其重要。然后一个交叉点在I和J中的不同索引处导致P中的多个条目。)
否则,您可能会丢失从点到索引i和j的正确赋值。
考虑到你绘制的两个数据序列矩阵的大小是相同的,这个方法很好。我想这就是那个“行不通”的人遇到的问题。对于我手头的任务,我的两个数据系列的大小不一样,所以它给出了一个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的指数,但这或多或少是一个口味问题。
谢谢你这个梦幻般的代码。
嗨,NS。感谢这段出色的代码。它跑得非常快。但是,我和埃米尔一样也有问题。当输入点是大于20000列的向量时,内存不足。我的matlab版本是2014a (windows上的64位)。你能把修改后的代码发给我或者给我一些建议吗?我的邮箱是:Liangys363@gmail.com。非常感谢。
谢谢。那太棒了。工作正常。
这行不通。
这一功能证明对我非常有帮助。谢谢你分享,并感谢您编写如此漂亮的简洁的代码。
非常感谢。伟大的算法,工作完美和超级快。
无话语
展示如何获取(全部)的“T”,它会出现“T”,这将是有帮助的。
即,参数“T”的两个值对应于每个自交叉口。
展示如何获取(全部)的“T”,它会出现“T”,这将是有帮助的。
我搜索了一个快速的交叉点函数,我找不到比这个更快的函数。
我有点惊讶,重复的子宫函数调用与大曲线一样快。向量提高一些操作速度升高了功能,但仅适用于较小的曲线。
对Emil:谢谢你的评论。遗憾的是,除非用来循环,否则没有多少可以做到这一点,这可能很可能会延迟执行时间。
为了使执行时间尽可能快,我需要创建nx M矩阵,其中N和M是每条曲线中的段数。
也许您可以尝试对不利用矢量化的文件交换的其他一些贡献,但它可能非常慢(应该有大约4E10的测试对该尺寸的矢量交叉口!)
或者,联系我发送你一个修改到我的代码测试与你的数据。然而,我不能保证结果的准确性,因为我没有做广泛的测试,但它似乎工作。
我经常使用此功能来分析机置数据中的阈值交叉,我喜欢它!但是,自2012B在2012B上的64位Windows机器上,即使只测试20000列向量,我也会继续内存耗尽内存。解决这个问题的任何想法?
这是一段非常好的、快速且通用的代码。大的UPS。
嗨NS
请忽略上面的评论。我找到了一个方法,使用了你的代码。
最好的祝福。
嗨NS
谢谢分享。
在我的例子中,我在点数据形式中有两条线。例如,我有三列数据Y X1 X2。第一条直线L1通过绘图并连接(X1,Y)得到,第二条直线L2通过绘图并连接(X2,Y)得到。
可以请解释我如何将此点数据转换为“双行矩阵”,如此处所述。
最好
飞行员:是的,它应该处理这些情况。
如果图形的段是垂直的段,则此代码是否会适应交叉点?
非常感谢这个功能!!!工作正确的其他交叉点功能没有!!
真的很乐于助人.....许多谢谢
确实是它所说的。没问题。
有用,高效,快速