我有两条曲线(非线性),分别为C1和C2。彼此相交(可以不止一次)。我只需要使用Scilab查找这些交叉点。
Open Source Engineering的Scilab教程中有两个示例:
Hallo Scilab和Matlab社区,尽管这是一个古老的话题,我还是会给出答案。插值点给出的两条曲线的交点是一个标准问题。我不得不为特定的应用程序解决它,在网络上发现了许多有用的知识,但没有可行的解决方案。它的下面是将函数X_Crossing应用于为此线程发明的非平凡情况(Lissajous线和由NaN分隔的两个椭圆之间的一串交点)。为了方便起见,复制并粘贴到Scilab控制台中足以获得结果。
祝你好运
Rosestock
[抱歉,我不了解您的代码块说明。
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()//中止如果信息printf('\ n%5.0f Schnittpunkte gefunden',nC)结束//如果信息结束//如果长度(xC)> 0;如果isempty(xC)| isempty(yC)如果信息infotext = ['Wenn mehr existieren,d_nearvergrößern!'];Meldung = [Meldung;信息文本]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_Crossing(x,y,u,v)
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()