Intersection 如何在Scilab中找到两条曲线的交点?
我有两条曲线(非线性),比如C1和C2。相互相交(可以不止一次)。Intersection 如何在Scilab中找到两条曲线的交点?,intersection,scilab,Intersection,Scilab,我有两条曲线(非线性),比如C1和C2。相互相交(可以不止一次)。 我只需要使用Scilab找到这些交叉点。在Scilab教程中有两个例子: [PDF]。你好,Scilab和Matlab社区 虽然这是一条古老的线索,但我会给出一个答案。由插值点给出的两条曲线的交点是一个标准问题。我不得不为一个特定的应用程序解决它,在网络上发现了许多有用的灌输,但没有可行的解决方案。下面是函数X_Crossing,它应用于为该线程创建的一个非平凡情况(一条李萨如线和两个以南分隔的椭圆之间的一组交点) 为方便起见,
我只需要使用Scilab找到这些交叉点。在Scilab教程中有两个例子:
[PDF]。你好,Scilab和Matlab社区 虽然这是一条古老的线索,但我会给出一个答案。由插值点给出的两条曲线的交点是一个标准问题。我不得不为一个特定的应用程序解决它,在网络上发现了许多有用的灌输,但没有可行的解决方案。下面是函数X_Crossing,它应用于为该线程创建的一个非平凡情况(一条李萨如线和两个以南分隔的椭圆之间的一组交点) 为方便起见,复制并粘贴到Scilab控制台应足以显示结果 祝你好运 罗斯托克 对不起,我不理解您的代码块说明。 很抱歉,我没有找到预览按钮
clear
clc()
mode(0)
format(10)
function [xC,yC,nC,dxC,dyC,duC,dvC]=X_Crossing(x,y,u,v,d_near,info)
//Alle Schnittpunkte zweier Polygonzüge (offen oder geschlossen))
//Selbstüberschneidungen sind keine Schnittpunkte!
//INPUT
//x.y. u,v: Koordinaten der beiden Kurvwen, 1 x nxy bzw. 1 x nuv
//Wenn möglich, alle Polygonkanten etwa gleich lang.
//d_near: Schnittpunkte werden nur in den Bereichen der Kurven
// gesucht, in denen die Kurven sich näher als d_near sind.
// d_near zu klein: Schnittpunkte werden übersehen.
// d_near unnötig groß: Rechnung dauert unnötig lange.
// Erster Versuch: d_near ca. dreifacher Punktabstand
//OUTPUT
//xC,yC: Koordinaten der Scnittpunkte, Zeilenvektoren
//nC: Anzahl der gefundenen Schnittpunkte
//info: 1: Hinweise, 0: keine Hinweise
//METHODE
// Scnittpunkte der Kantengeraden
warning('off')
Meldung=[' ']//Initialisierung
dxC=[];
dyC=[];
duC=[];
dvC=[];
nC=0//Initialisierung Anzahl Schnittpunkte
nxy=length(x)
nuv=length(u)
//Abschnitte in denen die Kurven nahe verlaufen
I=[];
for j=1:nuv
//Abstand des j-ten W-Punktes von SFK
d=sqrt([u(j)-x].^2+[v(j)-y].^2);
i_near=find(d<d_near);
I=[I i_near];//Indizes einer Untermenge von x,y
end//for j=1:nuv
I=unique(gsort(I));
I=I';
nI=length(I)
diffIgt1=find(diff(I)>1)';
Ia=[I(1); I(diffIgt1(1:$)+1)];
Ie=[I(diffIgt1(1:$));I($)];
nNahbereich=length(Ie);
//printf('\n nI: %f \n',nI)
//printf('\n Ia: %f \n',Ia)
//printf('\nnNahbereich: %f \n',nNahbereich)
if nNahbereich==0 then
if info
infotext=['Der Kurvenabstand ist überall > d_near.';
'Wenn Schnittpunkte existieren, d_near vergrößern!'];
Meldung=[Meldung;infotext]
printf('\n\n%4.0f Schnittpunkte gefunden.\n',nC)
printf('%s\n',Meldung)
end//if info
xC=%nan;
yC=%nan;
return
end// if nNahbereich= == 0 then
xC=[];//Schittpunktkoordinaten
yC=[];//Schittpunktkoordinaten
for k=1:nNahbereich
xNah=x(Ia(k):Ie(k));
yNah=y(Ia(k):Ie(k));
for i=1:length(xNah)-1
for j=1:nuv-1
dx=xNah(i+1)-xNah(i);
dy=yNah(i+1)-yNah(i);
du=-u(j+1)+u(j);
dv=-v(j+1)+v(j);
dxy=[dx;dy];
duv=[du;dv];
if ~isnan(dx)&~isnan(dy)&~isnan(du)&~isnan(dv)..
& dx*dv~=dy*du// nicht parallel
M=[dxy duv];//2 x 2
t=M\[u(j)-xNah(i);v(j)-yNah(i)];
if t(1)>=0 & t(1)<1 & t(2)>=0 & t(2)<1
xyC=[xNah(i);yNah(i)]+t(1)*dxy;
xC=[xC xyC(1)];
yC=[yC xyC(2)];
dxC=[dxC dx]
dyC=[dyC dy]
duC=[duC du]
dvC=[dvC dv]
end//if t(1)>=0 & ...
end//if ~isnan(dx)& ...
end//for j=1:nuv-1
end//for i=1:nxy-1
if length(xC)>0;
nC=length(xC)
// browsevar()
// abort
if info
printf('\n %5.0f Schnittpunkte gefunden',nC)
end//if info
end//if length(xC)>0;
if isempty(xC)|isempty(yC)
if info
infotext=['Wenn mehr existieren, d_near vergrößern!'];
Meldung=[Meldung; infotext]
printf('\n\n%4.0f Schnittpunkte gefunden.\n',nC)
printf('%s\n',Meldung)
end//if info
xC=%nan;
yC=%nan;
return
end//if isempty(xC)|isempty(yC)
end//for k=
endfunction//function [xC,yC,I,J]=X_Crossing(x,y,u,v)
if 1//just for stack overflow's forum parser
phiL=linspace(0,360,300);//Winkel für Lissajous-Figur
phiE=linspace(0,360,60);//Winkel für Ellipsen
//Zwei Ellipsen
x=-0.05+0.9*cosd(phiE);
x=[x %nan 0.5*x+0.5];
y=0.3+0.6*sind(phiE);
y=[y %nan 0.5*y-0.8];
u=cosd(3*phiL);
v=sind(5*phiL);
d_near=0.28;
info=1;
printf('\nBitte warten!\n')
printf(getversion()+' sucht Schnittpukte...')
xdel()
fig=figure('position',[450 -50 700 700],'background',8,'visible','off');
[xC,yC,nC,dxC,dyC,duC,dvC]=X_Crossing(u,v,x,y,d_near,info);
if ~isnan(xC)|~isnan(yC)
plot(xC,yC,'or')//Schnittpunktmarker
end//if ~isnan(xC)&~isnan(yC)
plot(x,y,u,v)//
// //Schnittpunkt-Tangenten
// plot([xC;xC+dxC], [yC;yC+dyC],'r','thickness',2)
// plot([xC;xC+duC], [yC;yC+dvC],'r','thickness',2)
ax=gca();
ax.isoview='on';
set(fig,'visible','on')
// browsevar()
end//if 1//just for stack overflow's forum parser
清除
clc()
模式(0)
格式(10)
函数[xC,yC,nC,dxC,dyC,duC,dvC]=X_交叉(X,y,u,v,d_近,信息)
//Alle Schnitpunkte zweier Polygonzüge(奥芬·奥德·格什洛森))
//我是凯恩·施尼特普克特!
//输入
//x、 y.u,v:Koordien der beiden Kurvwen,1 x nxy bzw。1 x nuv
//温恩·莫格利奇(Wenn möglich)是一位多面手。
//d_near:位于Kurven的Bereichen的Schnitpunkte werden nur
//gesucht,在sind附近的denen die Kurven sich näher als d_。
//祖克莱因附近的迪乌:施尼特普克特·沃登·贝尔塞恩。
//乌恩蒂格格罗附近的迪乌:多厄特·乌恩蒂格·兰格。
//Erster Versuch:d_靠近德雷法彻邦克塔斯德
//输出
//xC,yC:Zeilenvektoren的SCnitpunte协调人
//nC:Anzahl der gefundenen Schnittpunkte
//信息:1:Hinweise,0:keine Hinweise
//METHODE
//坎滕格拉登城堡酒店
警告(“关闭”)
Meldung=['']//初始化
dxC=[];
dyC=[];
duC=[];
dvC=[];
nC=0//初始化Anzahl Schnittpunkte
nxy=长度(x)
nuv=长度(u)
//阿布希尼特在德南-库文-纳赫-维劳芬
I=[];
对于j=1:nuv
//斯夫克的j-ten W-Punktes酒店
d=sqrt([u(j)-x].^2+[v(j)-y].^2);
i_near=find(d=0&t(1)=0&t(2)=0&。。。
结束//如果~isnan(dx)&。。。
结束//对于j=1:nuv-1
结束//对于i=1:nxy-1
如果长度(xC)>0;
nC=长度(xC)
//布劳舍瓦()
//流产
如果信息
printf('\n%5.0f Schnittpunkte gefunden',北卡罗来纳州)
结束//如果信息
结束//如果长度(xC)>0;
如果isempty(xC)| isempty(yC)
如果信息
infotext=['Wenn mehr existieren,d_靠近vergröern!'];
Meldung=[Meldung;infotext]
printf('\n\n%4.0f Schnittpunkte gefunden.\n',nC)
printf('%s\n',Meldung)
结束//如果信息
xC=%nan;
yC=%nan;
返回
结束//如果isempty(xC)| isempty(yC)
结束//对于k=
端函数//函数[xC,yC,I,J]=X_交叉(X,y,u,v)
if 1//仅用于堆栈溢出的论坛解析器
菲尔=linspace(0360300);//温克尔·弗尔·李萨如图形
phiE=linspace(0360,60);//Winkel für Ellipsen
//埃利普森
x=-0.05+0.9*cosd(phiE);
x=[x%nan 0.5*x+0.5];
y=0.3+0.6*sind(phiE);
y=[y%nan 0.5*y-0.8];
u=cosd(3*phiL);
v=sind(5*phiL);
d_近=0.28;
info=1;
printf('\n比特沃顿!\n')
printf(getversion()+“sucht Schnittpukte…”)
xdel()
图=图('position',[450-50700],'background',8,'visible','off');
[xC,yC,nC,dxC,dyC,duC,dvC]=X_交叉(u,v,X,y,d_近,信息);
如果~isnan(xC)| ~isnan(yC)
绘图(xC,yC,'or')//Schnittpunktmarker
结束//如果~isnan(xC)和~isnan(yC)
绘图(x、y、u、v)//
////施尼特普恩
//绘图([xC;xC+dxC],[yC;yC+dyC],'r','thickness',2)
//绘图([xC;xC+duC],[yC;yC+dvC],'r','thickness',2)
ax=gca();
ax.isoview='on';
设置(图,“可见”和“打开”)
//布劳舍瓦()
结束//如果1//仅用于堆栈溢出的论坛解析器