MATLAB INTERSEZIONE LINEE E CERCHI

di il
2 risposte

MATLAB INTERSEZIONE LINEE E CERCHI

Salve sono nuovo del forum e sono agli inizi con Matlab. In particolare il mio problema è il seguente:
ho un vettore x1 contenente le coordinate x dei punti iniziali di una linea
ho un vettore y1 contenente le coordinate y dei punti iniziali di una linea
ho un vettore x2 contenente le coordinate x dei punti finali di una linea
ho un vettore y2 contenente le coordinate y dei punti finali di una linea
ho un vettore xCenter contenente le coordinate rispetto a x dei centri di un numero n di cerchi
ho un vettore yCenter contenente le coordinate rispetto a y dei centri di un numero n di cerchi
ho un vettore r contenente i raggi relativi ad ogni centro
Quindi riassumendo ho 7 vettori che descrivono ogni linea sul mio piano ed ogni circonferenza. Io ho necessità che quando un cerchio interseca una linea esso mi viene segnalato e per esempio la linea diventa rossa. Inizialmente avevo scritto questo codice inserendo in un matrice le coordinate x1 x2 (startx) ed in un altra matrice le coordinate y1 e y2 (endx) ed ho dato un raggio costante pari a 3 solamente per vedere se il codice funzionasse.
for i=1:length(xCenter) 
theta = 0 : 0.01 : 2*pi;
radius = 3;
x = radius * cos(theta);
y =radius * sin(theta);                                    
plot(x+xCenter(i), y+yCenter(i));
axis square;
grid on;
axis equal;
line(startx',endx')
end 
Chiaramente con questo codice io visualizzo tutte le linee e tutte le circonferenze ma non riesco ad inserire un "avviso" nel caso in cui una linea interseca una circonferenza. Ho provato anche il comando interX ma non sono riuscito a risolvere il mio problema. Spero che possiate aiutarmi
Grazie mille

2 Risposte

  • Re: MATLAB INTERSEZIONE LINEE E CERCHI

    Nessuno sa darmi qualche dritta ?
  • Re: MATLAB INTERSEZIONE LINEE E CERCHI

    Puoi provare ad usare la funzione solve: in due cicli for annidati, crea le funzioni simboliche che definiscono i cerchi e le linee da passare come input alla funzione solve.

    Se il sistema di equazioni composto dall'equazione dell'i-esimo cerchio e della j-esima linea ha soluzioni "reali" la j-esima linea interseca lo i-esimo cerchio.
    % Generate some input data
    % Number of lines
    nr=5;
    % Number of circles
    nc=3;
    % Define start and end points of the lines
    x1=randi(5,nr,1)
    x2=randi([10 63],nr,1)
    y1=randi(5,nr,1)
    y2=randi([10 63],nr,1)
    % Define the coordinates of the circles ranges
    xCenter=randi([0 33],nc,1)
    yCenter=randi([0 33],nc,1)
    % Define the radius of the circles
    r=randi([3 9],nc,1)
    % Identify the XLim and YLim of the axes
    x_lim=[min(xCenter-r) max(r+xCenter)]
    y_lim=[min(yCenter-r) max(r+yCenter)]
    % Create the axes   
    axes
    daspect([1 1 1])
    xlim(x_lim)
    ylim(y_lim)
    hold on
    grid on
    % Define the symbolic variables
    syms X Y
    vars=[X Y]
    % Loop through the circles
    for i=1:nc
       % Plot the i-th circle
       ch(i)=rectangle('position',[xCenter(i)-r(i) yCenter(i)-r(i) r(i)*2 r(i)*2],'curvature',1);
       % Loop through the lines
       for j=1:nr
          % Evaluate the m and k parameters of the line (y=mx+k)
          m=(y2(j)-y1(j))/(x2(j)-x1(j));
          k=-m*x1(j)+y1(j);
          % Plot the j-th line
          rh(i,j)=plot([x_lim(1) x_lim(2)],[m*x_lim(1)+k m*x_lim(2)+k]);
          % Define the symbolic equatioons of the i-th circle and of the j-th
          % line
          eqns=[(X-xCenter(i))^2+(Y-yCenter(i))^2-r(i)^2 == 0,m*X-Y+k == 0];
          % Call SOLVE to solve the above defined system of equations
          [solx, soly] = solve(eqns, vars,'Real', true);
          % If the solutions are REAL, the j-th line intersects the i-thcircle
          if(~isempty(solx) && ~isempty(soly))
             sh(i,j)=plot(double(solx),double(soly),'o','markerfacecolor','r','markeredgecolor','r');
             rh(i,j).Color='r';
          else
             rh(i,j).Color='k';
          end
       end
       % Delete all the line and the intersections points
       % (just to clean up the axes)
       delete([rh(i,:) sh(i,:)])
    end
    
Devi accedere o registrarti per scrivere nel forum
2 risposte