• Регистрация
Aser92
Aser920.00
н/д
  • Написать
  • Подписаться

Построение сетки с точками: добавление новых элементов - Wolfram Mathematica

Математика и статистика,  Изображения и видео 
28.01.2020

Здравствуйте!

На первом этапе стоит довольно простая задача - сгенерировать рандомные точки на сетке с известными координатами.
Условно взял сетку 10х10 и раскидываю по ней 20 точек (отмечаются жирным).
Есть также условие, что в одной координате не может быть двух точек, в связи с чем воспользовался функцией DeleteDuplicates для удаления повторяющихся координат в списке.

Проблема заключается в том, что при добавлении в новый (урезанный) список, элементы не отображаются в списке и на сетке, соответственно, тоже. Не отрабатывает как функция Append, так и функция Insert (оба метода закомментил).

В коде ниже пытаюсь запихнуть хотя бы один известный элемент в конец списка. Хотя нужно, в зависимости от количества дубликатов, чтобы элементов всегда было 20. Помогите, пожалуйста.

For[z = 0, z < 20, 
  z++, {v = RandomInteger[{1, 9}]; w = RandomInteger[{1, 9}]; 
   If[z == 0, {v0 = v; w0 = w}]; If[z == 1, {v1 = v; w1 = w}]; 
   If[z == 2, {v2 = v, w2 = w}]; If[z == 3, {v3 = v, w3 = w}];
   If[z == 4, {v4 = v, w4 = w}];
   If[z == 5, {v5 = v, w5 = w}];
   If[z == 6, {v6 = v, w6 = w}];
   If[z == 7, {v7 = v, w7 = w}];
   If[z == 8, {v8 = v, w8 = w}];
   If[z == 9, {v9 = v, w9 = w}];
   If[z == 10, {v10 = v, w10 = w}];
   If[z == 11, {v11 = v, w11 = w}];
   If[z == 12, {v12 = v, w12 = w}];
   If[z == 13, {v13 = v, w13 = w}];
   If[z == 14, {v14 = v, w14 = w}];
   If[z == 15, {v15 = v, w15 = w}];
   If[z == 16, {v16 = v, w16 = w}];
   If[z == 17, {v17 = v, w17 = w}];
   If[z == 18, {v18 = v, w18 = w}];
   If[z == 19, {v19 = v, w19 = w}];}];
list = {{v0, w0}, {v1, w1}, {v2, w2}, {v3, w3}, {v4, w4}, {v5, 
    w5}, {v6, w6}, {v7, w7}, {v8, w8}, {v9, w9}, {v10, w10}, {v11, 
    w11}, {v12, w12}, {v13, w13}, {v14, w14}, {v15, w15}, {v16, 
    w16}, {v17, w17}, {v18, w18}, {v19, w19}};
Print[list];
newList = DeleteDuplicates[list];
(*Insert[newList, {1, 1}, -1]*)
(*Append[newList, {{1, 1}}];*)
Print[newList];
Show[ Graphics[Table[Point[{x, y}], {x, 1, 10}, {y, 1, 10}]],  
 Graphics[{PointSize[0.02], Point[{newList[[1]]}], 
   Point[{newList[[2]]}], Point[{newList[[3]]}], 
   Point[{newList[[4]]}], Point[{newList[[5]]}], 
   Point[{newList[[6]]}], Point[{newList[[7]]}], 
   Point[{newList[[8]]}], Point[{newList[[9]]}], 
   Point[{newList[[10]]}], Point[{newList[[11]]}], 
   Point[{newList[[12]]}], Point[{newList[[13]]}], 
   Point[{newList[[14]]}], Point[{newList[[15]]}], 
   Point[{newList[[16]]}], Point[{newList[[17]]}], 
   Point[{newList[[18]]}], Point[{newList[[19]]}], 
   Point[{newList[[20]]}]}]]

Теги

  • wolfram
    28.01.2020

    Ответы

    • Андрей Кисельников
      Андрей Кисельников +1694.54
      30.01.2020 12:40

      Хотите на MATLAB'е напишу?

      • Aser92
        Aser920.00
        30.01.2020 13:30

        Ну, напишите... Может я найду аналогию и пойму в чем косяк
        Между делом я оптимизировал код, просьба отталкиваться от него

        listData = {};
        For[i = 0, i < 20, i++, {
           v = RandomInteger[{1, 10}];
           w = RandomInteger[{1, 10}];
           AppendTo[listData, {v, w}]}];
        
        newListData = DeleteDuplicates[listData];
        
        If[Length[listData] != Length[newListData], 
          For[j = 0, j < (Length[listData] - Length[newListData]), 
           j++, {Insert[
             newListData, {RandomInteger[{1, 10}], 
              RandomInteger[{1, 10}]}, -1]; Print[j];}]];
        
        Show[Graphics[Table[Point[{x, y}], {x, 1, 10}, {y, 1, 10}]], 
         Graphics[{PointSize[0.02], 
           Table[Point[{newListData[[z]]}], {z, 1, 20}]}]]

         

        Также еще заметил, что с горем пополам отрисовываются точки при использовании метода AppendTo, но цикл For его неадекватно воспринимает и добавляет не более пары точек