1

実験のために、Matlab で 8 つのディスクから作成されたいくつかの画像を生成しました。ディスク間の最小距離、ディスクとフレーム間の最小距離、およびディスクの重心 (COG) の位置を制限しました。上部リフト「3 番目」に COG を使用した構成の例を以下に示します。

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}]

ここに画像の説明を入力

Mathematica でそれらの刺激を生成したいと思います。以下は、私が扱っている要素(機能と制約)です。単位はcmです。形状の重心 (COG) は、ディスクの領域加重位置として定義されます。

特徴:

刺激フレーム : {{xMin,xMin},{xMax,yMax}}

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

5 小円盤 :半径あり

rSmall=1

3 つの大型ディスク :半径あり

rLarge=2

制約:

形状のエッジ間の最小距離:

minDistSha=1

シェイプのエッジとフレームの境界線の間の最小距離:

minDistFra=1

中心からの形状 COG の距離:

minDistCogCenter=2

潜在的に、円盤の COG が中心から特定の角度になるように制約する必要があります (極座標系のシータ座標?)。そのため、COG が極座標で 22.5 度ごとに配置されるように制約するディスク座標を選択できます。

angleBin=22.5

Mathematica には、制約下での選択を達成するための便利な関数はありSelctますか?

特定の COG 位置で 1 つの構成を生成するための閉じた式が可能かどうか知りたいです。

参考までに、1000 曲のプールを取得する必要があります。36 度の「シータ制約」を使用して、中心から最小距離または固定距離にある 10 の異なるシータ バーに配置された COG で 10*100 の構成を抽出する必要があります。

ここに画像の説明を入力

説明が必要かどうか教えてください。ご清聴ありがとうございました。

4

1 に答える 1

5

これはあなたが始めるかもしれません。これは、要件を満たさないアンサンブルを破棄して、ランダムに円を生成する単純な棄却方法です。

引数は、ボックスのサイズ、小円と大円の数と半径、および最小間隔です。その最後は、境界までの距離と円の間の距離の両方に使用されます。重心からフレームの中心への拘束のためにそれを2倍にします。明らかに、この使用法は、引数を追加することで一般化できます。

これが実行可能なアンサンブルを見つける可能性を評価するために、ループを通過した回数を印刷します。また、私は実際には必要のないキャッチ/スローメカニズムを使用しています(私がわざわざ削除しなかったいくつかの実験のアーティファクト)。

- - 編集 - -

以下のコードは、私が最初に投稿したものから少し変更されています。重心円を赤い円として分離します。

指定された角度にあるという制約を処理するには、次のように生成し、回転して正しい角度位置に配置し、円からフレーム境界までの距離を再確認します。おそらく、均一性を維持しながら、拒否を与える可能性が低い、よりスマートなものがあります。実際、私がコーディングしたものが、許容可能な構成の空間から均一に分布するかどうかはまったくわかりません。もしそうなら、回転の影響はその特性を破壊する可能性が非常に高いです。

---編集を終了---

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]}]
   ]]

例:

{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}]

ここに画像の説明を入力してください

于 2011-10-02T21:23:27.163 に答える