Intersection 如何在Scilab中找到两条曲线的交点?

Intersection 如何在Scilab中找到两条曲线的交点?,intersection,scilab,Intersection,Scilab,我有两条曲线(非线性),比如C1和C2。相互相交(可以不止一次)。 我只需要使用Scilab找到这些交叉点。在Scilab教程中有两个例子: [PDF]。你好,Scilab和Matlab社区 虽然这是一条古老的线索,但我会给出一个答案。由插值点给出的两条曲线的交点是一个标准问题。我不得不为一个特定的应用程序解决它,在网络上发现了许多有用的灌输,但没有可行的解决方案。下面是函数X_Crossing,它应用于为该线程创建的一个非平凡情况(一条李萨如线和两个以南分隔的椭圆之间的一组交点) 为方便起见,

我有两条曲线(非线性),比如C1和C2。相互相交(可以不止一次)。
我只需要使用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//仅用于堆栈溢出的论坛解析器