Все потоки
Поиск
Написать публикацию
Обновить

Реализация FABRIK на WL в пару строк

Текущая реализация далека от оптимальной, но она хорошо подходит для демонстрации работы алгоритма. Среда исполнения используется WLJS Notebook aka Jupyter + Observable для WL

Виджет с работающим алгоритмом
Виджет с работающим алгоритмом

Мы создадим цепочку из точек и свяжем их в сегментированную линию фиксированной длины

chain = Table[Exp[-ϕ]{-Cos[ϕ], Sin[ϕ]}, {ϕ, 0, π - π/7, π/7.0}];
Graphics[{
    Line[chain // Offload], Black, 
    PointSize[0.04], Point[chain // Offload], Red,
    EventHandler[Graphics`Canvas[], {
      "mousemove" -> handler
    }]
  },
  Axes->True, PlotRange->{{-1,0.2}, {0,0.4}}, ImageSize->400
]

Вы увидите окно с цепью, но цепь не будет реагировать на движение мыши. Нужен сам "решатель". Оригинальная статья опубликована в 2010 году, и алгоритм можно реализовать буквально влоб

handler = Function[target,
  Module[{
    buffer = chain, 
    origin = {-1,0}, 
    prev = chain, 
    lengths = Norm /@ (chain // Reverse // Differences) // Reverse
  },
    buffer = Table[With[{p = chain[[-i]]},
      If[i === 1,
        prev = target;
        target
      ,
    
        prev = prev - Normalize[(prev - p)] lengths[[1-i]];
        prev 
      ]
    ]   
    , {i, chain // Length}] // Reverse;

    buffer = Table[With[{p = buffer[[i]]},
      If[i === 1,
        prev = origin;
        origin
      ,
    
        prev = prev - Normalize[(prev - p)] lengths[[i-1]];
        prev 
      ]
    ]
    , {i, chain // Length}];

    chain = buffer;
   ]
];

После выполнения этой ячейки цепь оживет

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии0

Публикации

Ближайшие события