[matlab] prendre des points dans un cadre

Résolu
Bonjour à tous !

Je souhaite tirer des points au hasard (avec la fonction rand) dans un "cadre" ; ce cadre est défini par deux carrés, de coté L et l (L>l), tel que l'écart entre ces 2 carrés soit constant sur toute la figure, soit (L-l)/2.

Pour l'instant j'ai essayé de tirer des points au hasard dans le carré "extérieur"
x=L*rand; y=L*rand;
puis de les enlever s'ils sont dans le carré inférieur
while x>0 && x<L
while y>0 && y<L
x=L*rand ;
y=L*rand;
end
end

mais MatLab tourne assez longtemps, et en plus je m'embrouille dans les logiques ( && ||) :s

Savez vous si c'est possible de faire avec la fonction rand une feinte pour que ca me tire les points directement dans le cadre, c'est à dire x et y tels que qu'ils appartiennent tous les 2 à [0 (L-l)/2]U[3(L-l)/2] ?

Merci d'avance !!!
Configuration: Windows XP
Firefox 2.0.0.16

2 réponses

  1. Salut
    L=3; % Plus grande longueur
    l=2; % Plus petite longueur
    n=1e3; % Nombre de points
    Z=-L/2+L*rand(2,n);
    Z(repmat(abs(Z(1,:))<l/2 & abs(Z(2,:))<l/2,2,1))=[];
    Z=reshape(Z,2,size(Z,2)/2);
    plot(Z(1,:),Z(2,:),'*');
    A plus
    2
    1. Salut
      J'ai oublié quelques précisions.
      Pour la ligne n=1e3; % Nombre de points, il s'agit du nombre de points choisis dans le carré de côté L. Après avoir sélectionné seulement les points du cadre, il en reste en moyenne (1-l²/L²)n.
      Du coup, si tu veux plutôt choisir un nombre approximatif de points dans le cadre, tu peux écrire un truc du genre
      L=3; % Plus grande longueur
      l=2; % Plus petite longueur
      n=1e3; % Nombre approximatif de points dans le cadre
      Z=-L/2+L*rand(2,round(n/(1-l^2/L^2)));
      Z(repmat(abs(Z(1,:))<l/2 & abs(Z(2,:))<l/2,2,1))=[];
      Z=reshape(Z,2,size(Z,2)/2);
      plot(Z(1,:),Z(2,:),'*');
      Sinon, pour choisir les points directement dans le cadre, je pense pas que ce soit possible. Enfin là du moins, je vois pas comment faire...
      Bonne journée
      1