2011-10-01 4 views
1

Pour une expérience, nous avons généré dans Matlab des images composées de 8 disques. Nous avons contraint, la distance minimale entre les disques et entre les disques et le cadre ainsi que l'emplacement du centre de gravité des disques (COG). Bellow un exemple d'une composition avec le COG sur l'ascenseur supérieur « troisième »But Chercher, dans Mathematica

FraXYs = {{4.32, 3.23}, {35.68, 26.75}} 

stiDisks = {{{8, 11}, 1}, {{10, 17}, 1}, {{16, 24}, 1}, {{25, 22},1}, 
      {{31, 22}, 1}, {{7, 21}, 2}, {{16, 12}, 2}, {{19, 22}, 2}} 

Graphics[{White, EdgeForm[Thick], 
    Rectangle @@ FraXYs, 
    Red, Disk[{14.77, 18.91}, 1], 
    Blue, Opacity[.6], EdgeForm[Black], 
    Blue, Thickness[0.003], 
    Opacity[1], 
    Black, 
    Disk[#[[1]], #[[2]]] & /@ stiDisks}, ImageSize -> {400, 300}] 

enter image description here

je voudrais générer ces stimuli dans Mathematica. Voici l'élément (caractéristiques et contraintes) dont je traite. Les mesures sont en Cm. Le centre de gravité (COG) des formes est défini comme la zone de localisation des disques.

Les Caractéristiques:

Stimuli Cadre: {{xmin, xMin}, {xMax yMax}}

FraXYs = {{4.32, 3.23}, {35.68, 26.75}} 

5 petits disques: avec rayon

rSmall=1 

3 Grands disques: de rayon

rLarge=2 

Les contraintes:

La distance minimale entre les formes Bords:

minDistSha=1 

La distance minimale entre les bords des formes et la bordure du cadre:

minDistFra=1 

Distance des formes COG du centre:

minDistCogCenter=2 

potentiellement, je vais devoir contraindre le COG des disques sur un certain angle du centre (thêta de coordonnées dans un système polaire?). Donc, je pouvais sélectionner les disques coordonnées ralentissait leurs COG se trouver tous les degrés 22,5 dans une coordonnées polaires

angleBin=22.5 

Y at-il des fonctions utiles dans Mathematica pour atteindre la sélection des contraintes de côté Selct.

Je serais curieux de savoir si une formule fermée pour générer 1 composition avec une localisation COG particulière est possible. À titre indicatif, j'aurai besoin d'un pool de 1000 compositions. En utilisant les "contraintes thêta" de 36 degrés, je devrais extraire la composition 10 * 100 avec leur COG situé sur les 10 barres thêta différentes à une distance minimale ou fixe du centre.

enter image description here

S'il vous plaît me dire si des éclaircissements sont nécessaires. Merci de votre attention.

+3

Vous pouvez trouver des pièces de ce billet de blog utiles: http: //blog.wolfram. com/2011/06/01/test-votre-capacité subitizing /. Il s'agit de générer des diagrammes pour tester la capacité de comptage rapide. –

+0

Merci! De bonnes pièces en effet! – 500

Répondre

5

Cela peut vous aider à démarrer. C'est une méthode de rejet simple pour générer des cercles au hasard, en rejetant des ensembles qui ne répondent pas aux exigences.

Les arguments sont la taille de la boîte, les nombres et les rayons des petits et grands cercles, et une séparation minimale. Ce dernier est utilisé à la fois pour les distances à la frontière et les distances entre les cercles. Je le double pour le centre de gravité au centre de la contrainte de cadre. Clairement, cet usage pourrait être généralisé en ajoutant plus d'arguments.

Aux fins d'évaluer la probabilité de trouver des ensembles viables, j'imprime le nombre de fois dans la boucle. J'utilise aussi un mécanisme Catch/Throw qui n'est pas vraiment nécessaire (artefact de certaines expérimentations que je n'ai pas pris la peine d'enlever).

--- --- modifier

Le code ci-dessous a des changements modestes de ce que je initialement posté. Il sépare le cercle du centre de gravité en rouge.

Pour gérer la contrainte selon un angle spécifié, il est possible de générer comme ci-dessous, de faire pivoter pour mettre dans la position angulaire correcte et de revérifier les distances entre les cercles et la limite de trame. Peut-être y a-t-il quelque chose de plus intelligent qui sera moins susceptible de donner un rejet, tout en maintenant l'uniformité. En fait, je ne suis pas du tout certain que ce que j'ai codé donne une distribution uniforme de l'espace des configurations permises. Si c'est le cas, l'influence de la rotation détruira très probablement cette propriété.

--- modifier final ---

randomConfiguration[{xlo_, ylo_}, {xhi_, yhi_}, nsmall_, nlarge_, 
    rsmall_, rlarge_, minsep_] := Catch[Module[ 
    {found = False, xsmall, ysmall, xlarge, ylarge, smallsep, largesep, 
    smallcircs, largecircs, cog, cen, indx = 0}, 
    smallsep = {rsmall + minsep, -rsmall - minsep}; 
    largesep = {rlarge + minsep, -rlarge - minsep}; 
    cen = {xhi - xlo, yhi - ylo}; 
    While[! found, 
    found = True; 
    indx++; 
    xsmall = RandomReal[{xlo, xhi} + smallsep, nsmall]; 
    ysmall = RandomReal[{ylo, yhi} + smallsep, nsmall]; 
    xlarge = RandomReal[{xlo, xhi} + largesep, nlarge]; 
    ylarge = RandomReal[{ylo, yhi} + largesep, nlarge]; 
    smallcircs = Transpose[{xsmall, ysmall}]; 
    Do[If[ 
     Norm[smallcircs[[i]] - smallcircs[[j]]] <= 2*rsmall + minsep, 
     found = False; Break[]], {i, nsmall - 1}, {j, i + 1, nsmall}]; 
    largecircs = Transpose[{xlarge, ylarge}]; 
    Do[If[ 
     Norm[largecircs[[i]] - largecircs[[j]]] <= 2*rlarge + minsep, 
     found = False; Break[]], {i, nlarge - 1}, {j, i + 1, nlarge}]; 
    Do[If[ 
     Norm[smallcircs[[i]] - largecircs[[j]]] <= 
     rsmall + rlarge + minsep, found = False; Break[]], {i, 
     nsmall}, {j, nlarge}]; 
    cog = (rsmall^2*Total[smallcircs] + 
     rlarge^2*Total[largecircs])/(nsmall*rsmall^2 + 
     nlarge*rlarge^2); 
    If[Norm[cog - cen] <= 2*minsep, found = False;]; 
    ]; 
    Print[indx]; 
    Throw[{{cog, rsmall},Map[{#, rsmall} &, smallcircs], 
    Map[{#, rlarge} &, largecircs]}] 
    ]] 

Exemple:

{smallc, largec} = 
    randomConfiguration[{4.32, 3.23}, {35.68, 26.75}, 5, 3, 1, 2, 1]; 

13 

FraXYs = {{4.32, 3.23}, {35.68, 26.75}}; 

{cog, smallc, largec} = 
    randomConfiguration[{4.32, 3.23}, {35.68, 26.75}, 5, 3, 1, 2, 1]; 

Graphics[{White, EdgeForm[Thick], Rectangle @@ FraXYs, Red, 
    Apply[Disk, cog], Blue, Opacity[.6], EdgeForm[Black], Blue, 
    Thickness[0.003], Opacity[1], Black, 
    Disk[#[[1]], #[[2]]] & /@ Join[smallc, largec]}, 
ImageSize -> {400, 300}] 

enter image description here

+0

Merci Daniel! – 500