Равномерное распределение точек внутри объекта с использованием графики в Mathematica - PullRequest
2 голосов
/ 28 июня 2011

Учитывая:

preferred ={{1, 1, 63}, {2, 1, 44}, {3, 1, 27}, {4, 1, 33}, {5, 1, 33}}

frmWidth  =                 20.9067;
frmHeight =                   15.68;

Я показываю 5 типов стимулов 2 на 2. Субъекты должны выбрать тот, который они предпочитают. Каждый тип стимулов отображается 80 раз так:

{1,1,63} указывает, что стимулы Cond 1 были предпочтительнее 63 раза из 80 раз, которые они отображали. {3, 1, 27} указывает на то, что стимулы Cond 3 были предпочтительнее 27 раз из 80 отображенных.

Cond1 относится к центру экрана

Cond2 относится к верхнему левому квадранту

Cond3 относится к верхнему правому квадранту

Cond4 относится к нижнему левому квадранту

Cond5 относится к нижнему правому квадранту

Я хотел бы выразить это, показывая результаты.

Вот что я сделал:

Graphics[{
  Black, EdgeForm[{Thin, LightGray}], 
  Rectangle[{-1, -1}, {frmWidth + 1, frmHeight + 1}], 

  PointSize[0.03],
  Yellow,
  Point@Tuples[{Range[0, frmWidth/2, frmWidth/19], 
  Range[0, frmHeight/2, frmHeight/14]}][[;; preferred[[5, 3]]]],

  Red,
  Point@Tuples[{Range[frmWidth/2, frmWidth, frmWidth/19], 
  Range[0, frmHeight/2, frmHeight/14]}][[;; preferred[[4, 3]]]],

  Green,
  Point@Tuples[{Range[frmWidth/2, frmWidth, frmWidth/19], 
  Range[frmHeight/2, frmHeight, frmHeight/14]}][[;; preferred[[3, 3]]]],

  Orange,
  Point@Tuples[{Range[0, frmWidth/2, frmWidth/19], 
  Range[frmHeight/2, frmHeight, frmHeight/14]}][[;; 
  preferred[[2, 3]]]],

  Blue,
  Point@Tuples[{Range[frmWidth/4, 3/4 frmWidth, frmWidth/19], 
  Range[frmHeight/4, 3/4 frmHeight, frmHeight/14]}][[;; 
  preferred[[1, 3]]]]

  }]

enter image description here

Проблема в том, что прямоугольники постепенно заполняются точками слева направо, а точки не расположены равномерно.

Обратите внимание на следующее:

Graphics[{

  White, EdgeForm[Thick], 
  Rectangle[{0, 0}, {frmWidth, frmHeight}],

  Orange, Opacity[.5],
  Rectangle[{0, frmHeight/2}, {frmWidth/2, frmHeight}, RoundingRadius -> 3],

  Green,
  Rectangle[{frmWidth/2, frmHeight/2}, {frmWidth, frmHeight},RoundingRadius -> 3],

  Red,
  Rectangle[{frmWidth/2, 0}, {frmWidth, frmHeight/2}, RoundingRadius -> 3],

  Yellow,
  Rectangle[{0, 0}, {frmWidth/2, frmHeight/2}, RoundingRadius -> 3],

  Blue,
  Rectangle[{frmWidth/4, frmHeight/4}, {3/4 frmWidth, 3/4 frmHeight}, RoundingRadius -> 3]
  }]

enter image description here

Теперь я хотел бы заполнить эти прямоугольники с закругленными краями точками, но при этом плотность изменяется, а не часть заполненных прямоугольников.

Ниже приводится нечто очень уродливое, которое я рисую в PPT:

enter image description here

В идеале формы, заполненные точками, могут быть любого типа. Очки не будут пересекаться.

Пожалуйста, дайте мне знать альтернативные идеи.

Ответы [ 2 ]

3 голосов
/ 28 июня 2011

ОК, попробуйте это:

Manipulate[ld = Floor[Sqrt[n]];
Graphics[
{{EdgeForm[Dashed], White, 
  Polygon[{{0, 0}, {0, h}, {w, h}, {w, 0}}]},
 Point[Flatten[#, 1] &@
 Table[{x, y}, {x, 0, w, w/ld}, {y, 0, h, h/ld}]] },
PlotRange \[Rule] {{-1, 20}, {-1, 20}}],
{{n, 25}, 10, 100, 1},
{{h, 10}, 5, 20},
{{w, 10}, 5, 20}]

Типичная конфигурация:

enter image description here

(код, который я дал, позволяет вам контролировать общее количество и размер коробки с помощью ползунков)

0 голосов
/ 28 июня 2011

Учитывая, что ваши прямоугольники довольно маленькие, самое простое решение - использовать

RandomSample[ allPointsInAnObject ]

Примерно так:

Graphics[{Circle[{0, 0}, 11], PointSize[0.02], 
  Point[RandomSample[
    Cases[Outer[List, Range[-11, 11], Range[-11, 11]], {x_, y_} /; 
      x^2 + y^2 <= 11^2, {2}], 50]]}]
...