<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel rdf:about="https://community.wolfram.com">
    <title>Community RSS Feed</title>
    <link>https://community.wolfram.com</link>
    <description>RSS Feed for Wolfram Community showing any discussions tagged with Dynamic Interactivity sorted by active.</description>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/3656731" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/3651250" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/3644671" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/3642901" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/3641221" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/3629162" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/3622456" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/3606056" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/3602119" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/3600562" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/3590761" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/3585466" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/3578212" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/3574993" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/3574670" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/3061868" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/3567201" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/3563534" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/3558592" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/3554402" />
      </rdf:Seq>
    </items>
  </channel>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/3656731">
    <title>SU(2) gauge theory in classical mechanics in UD</title>
    <link>https://community.wolfram.com/groups/-/m/t/3656731</link>
    <description>&amp;amp;[Wolfram Notebook][1]&#xD;
&#xD;
&#xD;
  [1]: https://www.wolframcloud.com/obj/545ac7e4-f815-43fb-9d0f-33d85e0f5e2d</description>
    <dc:creator>Brian Beckman</dc:creator>
    <dc:date>2026-03-10T23:44:24Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/3651250">
    <title>Computational dynamics of the classical and perturbed circular restricted three-body problem</title>
    <link>https://community.wolfram.com/groups/-/m/t/3651250</link>
    <description>![Computational dynamics of the classical and perturbed circular restricted three-body problem][1]&#xD;
&#xD;
&amp;amp;[Wolfram Notebook][2]&#xD;
&#xD;
&#xD;
  [1]: https://community.wolfram.com//c/portal/getImageAttachment?filename=10346hero.png&amp;amp;userId=20103&#xD;
  [2]: https://www.wolframcloud.com/obj/f37e309d-f41e-45e5-a952-bb2953a400c4</description>
    <dc:creator>Akram Masoud</dc:creator>
    <dc:date>2026-03-06T16:49:26Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/3644671">
    <title>Self-directed learning with notebooks: students&amp;#039; experiences in a chemical thermodynamics exercise</title>
    <link>https://community.wolfram.com/groups/-/m/t/3644671</link>
    <description>[![Self-directed learning with notebooks: students&amp;#039; experiences in a chemical thermodynamics exercise][1]][2]&#xD;
&#xD;
&amp;amp;[Wolfram Notebook][3]&#xD;
&#xD;
&#xD;
  [1]: https://community.wolfram.com//c/portal/getImageAttachment?filename=Self-directedlearningwithnotebooksstudents%E2%80%99experiencesinachemicalthermodynamicsexerc.jpg&amp;amp;userId=20103&#xD;
  [2]: https://community.wolfram.com//c/portal/getImageAttachment?filename=Self-directedlearningwithnotebooksstudents%E2%80%99experiencesinachemicalthermodynamicsexerc.jpg&amp;amp;userId=20103&#xD;
  [3]: https://www.wolframcloud.com/obj/c863fe35-3afe-4103-b447-ca6e6feb3f4c</description>
    <dc:creator>Michael Haring</dc:creator>
    <dc:date>2026-02-24T19:19:08Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/3642901">
    <title>Quick intro to the (N)DSolve(Value) family</title>
    <link>https://community.wolfram.com/groups/-/m/t/3642901</link>
    <description>&amp;amp;[Wolfram Notebook][1]&#xD;
&#xD;
&#xD;
&#xD;
  [1]: https://www.wolframcloud.com/obj/f58b42ce-750f-48f1-9529-f640d895b1cc</description>
    <dc:creator>Michael Rogers</dc:creator>
    <dc:date>2026-02-21T02:40:03Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/3641221">
    <title>[WELP25] Modeling below-the-knee prosthetics using FEM and SLIP dynamics</title>
    <link>https://community.wolfram.com/groups/-/m/t/3641221</link>
    <description>![Modeling Below-the-Knee Prosthetics using FEM and SLIP Dynamics][1]&#xD;
&#xD;
&amp;amp;[Wolfram Notebook][2]&#xD;
&#xD;
&#xD;
  [1]: https://community.wolfram.com//c/portal/getImageAttachment?filename=5977image.png&amp;amp;userId=911151&#xD;
  [2]: https://www.wolframcloud.com/obj/d0eba471-b424-4c38-a404-ed4e94a5dd7b</description>
    <dc:creator>Wolfram Education Programs</dc:creator>
    <dc:date>2026-02-17T15:45:48Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/3629162">
    <title>[WWS26] Birdwatching: A tale of S combinator arithmetic</title>
    <link>https://community.wolfram.com/groups/-/m/t/3629162</link>
    <description>![[WWS26] Birdwatching: A tale of S combinator arithmetic][1]&#xD;
&#xD;
&amp;amp;[Wolfram Notebook][2]&#xD;
&#xD;
&#xD;
  [1]: https://community.wolfram.com//c/portal/getImageAttachment?filename=birdy.jpg&amp;amp;userId=2851656&#xD;
  [2]: https://www.wolframcloud.com/obj/7a744e7c-97b0-426e-8b1e-fa990fd0ae47</description>
    <dc:creator>Russell Martinez</dc:creator>
    <dc:date>2026-01-27T18:19:34Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/3622456">
    <title>Mathematical Games 37: Two Phi Psi Chi Rho (2 φ ψ χ ρ)</title>
    <link>https://community.wolfram.com/groups/-/m/t/3622456</link>
    <description>![Mathematical Games 37: Two Phi Psi Chi Rho (2 φ ψ χ ρ)][1]&#xD;
&#xD;
&amp;amp;[Wolfram Notebook][2]&#xD;
&#xD;
&#xD;
  [1]: https://community.wolfram.com//c/portal/getImageAttachment?filename=MathematicalGames37TwoPhiPsiChiRho2%CF%86%CF%88%CF%87%CF%81.png&amp;amp;userId=20103&#xD;
  [2]: https://www.wolframcloud.com/obj/7c4c0ff2-3911-4c19-b956-a776fafc4040</description>
    <dc:creator>Ed Pegg</dc:creator>
    <dc:date>2026-01-22T16:59:42Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/3606056">
    <title>Controls in DynamicModule: animation does not start</title>
    <link>https://community.wolfram.com/groups/-/m/t/3606056</link>
    <description>I have a problem when using DynamicModule to represent a dynamical system of the type State(t)-&amp;gt;F(State(t+1)). In the attached code, the animation does not start. Could any one tell me why? Thanks.&#xD;
&#xD;
&amp;amp;[Wolfram Notebook][1]&#xD;
&#xD;
&#xD;
  [1]: https://www.wolframcloud.com/obj/a199f22d-e876-4d61-bb62-2b4c4d2cf7da</description>
    <dc:creator>Christian Mullon</dc:creator>
    <dc:date>2026-01-14T12:07:51Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/3602119">
    <title>Introduction to dynamic economic models: the Harrod-Domar growth model</title>
    <link>https://community.wolfram.com/groups/-/m/t/3602119</link>
    <description>&amp;amp;[Wolfram Notebook][1]&#xD;
&#xD;
&#xD;
  [1]: https://www.wolframcloud.com/obj/59e2a8f6-2b99-4f93-87ff-aa41cede2392</description>
    <dc:creator>Hee-Young Shin</dc:creator>
    <dc:date>2026-01-06T17:23:41Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/3600562">
    <title>Introduction to dynamic economic models: A note on Marx-Goodwin model of business cycles</title>
    <link>https://community.wolfram.com/groups/-/m/t/3600562</link>
    <description>&amp;amp;[Wolfram Notebook][1]&#xD;
&#xD;
&#xD;
  [1]: https://www.wolframcloud.com/obj/6885767e-1ad6-48a8-b7f8-3ea83983bd15</description>
    <dc:creator>Hee-Young Shin</dc:creator>
    <dc:date>2026-01-03T19:53:35Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/3590761">
    <title>Introduction to dynamic economic models: the ISLM model with the capital stock and debt</title>
    <link>https://community.wolfram.com/groups/-/m/t/3590761</link>
    <description>&amp;amp;[Wolfram Notebook][1]&#xD;
&#xD;
&#xD;
  [1]: https://www.wolframcloud.com/obj/eb895976-f39e-4f04-8dbc-21fa665b3b90</description>
    <dc:creator>Hee-Young Shin</dc:creator>
    <dc:date>2025-12-15T00:19:32Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/3585466">
    <title>Qubits explained: Bloch sphere, SU(2) rotations, time evolution, and measurements</title>
    <link>https://community.wolfram.com/groups/-/m/t/3585466</link>
    <description>[![Qubits explained: Bloch sphere, SU(2) rotations &amp;amp; measurements &amp;#x2014; Guided, computation-first narrative][1]][2]&#xD;
&#xD;
&amp;amp;[Wolfram Notebook][3]&#xD;
&#xD;
&#xD;
  [1]: https://community.wolfram.com//c/portal/getImageAttachment?filename=1515QubitsExplainedBlochSphere,SU%282%29Rotations,andMeasurements.png&amp;amp;userId=20103&#xD;
  [2]: https://community.wolfram.com//c/portal/getImageAttachment?filename=1515QubitsExplainedBlochSphere,SU%282%29Rotations,andMeasurements.png&amp;amp;userId=20103&#xD;
  [3]: https://www.wolframcloud.com/obj/343c8c4d-7d34-4b06-bcfc-6a06e4f75a83</description>
    <dc:creator>Mohammad Bahrami</dc:creator>
    <dc:date>2025-12-04T00:03:54Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/3578212">
    <title>[WTC25] Wolfram &amp;amp; Raspberry Pi 5 &amp;#x2014; Part 2: compilation and mathematical visualization</title>
    <link>https://community.wolfram.com/groups/-/m/t/3578212</link>
    <description>![Wolfram &amp;amp; Raspberry Pi 5 &amp;#x2014; Part 2: compilation and mathematical visualization][1]&#xD;
&#xD;
&#xD;
&amp;amp;[Wolfram Notebook][2]&#xD;
&#xD;
&#xD;
  [1]: https://community.wolfram.com//c/portal/getImageAttachment?filename=Complilationandmathematicalvisualization.png&amp;amp;userId=20103&#xD;
  [2]: https://www.wolframcloud.com/obj/79e1b917-7c75-49f9-8759-e92375c40c34</description>
    <dc:creator>Bart ter Haar Romeny</dc:creator>
    <dc:date>2025-11-19T19:56:59Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/3574993">
    <title>How to code Control changes?</title>
    <link>https://community.wolfram.com/groups/-/m/t/3574993</link>
    <description>I have a small DynamicModule that displays a slider for x and the result of evaluating a function f[x].&#xD;
The following code works as desired:&#xD;
&#xD;
    DynamicModule[{f, x = 5},&#xD;
     f[x_] := {x, Sqrt[x]};&#xD;
     Column[{&#xD;
       Slider[Dynamic@x, {0, 25, 1}],&#xD;
       Dynamic@f[x]&#xD;
       }]&#xD;
     ]&#xD;
![enter image description here][1]&#xD;
&#xD;
Now I want to store the results of f[x] in two variables arg and val for later use.&#xD;
The following code works, but it throws a Set::shape error during the assignment of the result, and the variables arg and val are not set.&#xD;
&#xD;
    DynamicModule[{f, x = 5, arg, val},&#xD;
     f[x_] := {x, Sqrt[x]};&#xD;
     Column[{&#xD;
       Slider[Dynamic@x, {0, 25, 1}],&#xD;
       {arg, val} = Dynamic@f[x],&#xD;
       Row[{&amp;#034;{arg,val} = &amp;#034;, Dynamic@{arg, val}}]&#xD;
       }]&#xD;
     ]&#xD;
![enter image description here][2]&#xD;
&#xD;
*The reason for the error is that Dynamic@f[x] is an object and not a list.*&#xD;
&#xD;
**How can I fix this problem?**&#xD;
Perhaps with something like Dynamic[f[x], someFunction] instead of {arg,val}=Dynamic[f[x]], where someFunction assigns arg and val?&#xD;
&#xD;
  [1]: https://community.wolfram.com//c/portal/getImageAttachment?filename=Screenshot2025-11-14182646.jpg&amp;amp;userId=890153&#xD;
  [2]: https://community.wolfram.com//c/portal/getImageAttachment?filename=Screenshot2025-11-14183123.jpg&amp;amp;userId=890153</description>
    <dc:creator>Werner Geiger</dc:creator>
    <dc:date>2025-11-14T17:33:56Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/3574670">
    <title>Vibe coding with ChatGPT (GPT-5.1): fixing AI code vulnerabilities</title>
    <link>https://community.wolfram.com/groups/-/m/t/3574670</link>
    <description>&amp;amp;[Wolfram Notebook][1]&#xD;
&#xD;
&#xD;
  [1]: https://www.wolframcloud.com/obj/d8e5d5cd-83af-487b-9c48-d4a82ef214f1</description>
    <dc:creator>Werner Geiger</dc:creator>
    <dc:date>2025-11-13T21:41:30Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/3061868">
    <title>Why doesn&amp;#039;t my desktop Manipulate work on the Wolfram Cloud?</title>
    <link>https://community.wolfram.com/groups/-/m/t/3061868</link>
    <description>I have two notebooks (tiltg.nb and tiltb.nb, attached) which, when viewed by the desktop &#xD;
notebook interface, are identical. However, they exhibit different behaviors when uploaded to&#xD;
the Wolfram Cloud. The first shows the output cell produced by a closed Manipulate cell.&#xD;
The second shows an empty Manipulate panel colored pink, with no explanation of why it failed.&#xD;
When I explicitly open and evaluate the closed cell containing the Manipulate in the second, it&#xD;
produces the desired output cell.&#xD;
&#xD;
I made a textual comparison of the two notebooks. There are some expected differences including&#xD;
Cell Change Times, Expression UUID, CellLabel, CellContext, NotebookDataLength,  NotebookOptionsPosition, NotebookOutlinePosition, and CellTagsIndexPosition. The only suspicious&#xD;
difference is that the working version has an Initialization section containing lines like the&#xD;
following:&#xD;
&#xD;
    Initialization:&amp;gt;{&#xD;
    Attributes[$CellContext`center$] = {Temporary},&#xD;
    ...&#xD;
    Attributes[$CellContext`square$] = {Temporary}}&#xD;
&#xD;
for each of the Manipulate&amp;#039;s Module&amp;#039;s local Symbols.&#xD;
&#xD;
I assume these lines are somehow generated when the Manipulate is evaluated, and I don&amp;#039;t know&#xD;
why the working version has them and the erroneous version doesn&amp;#039;t.&#xD;
&#xD;
My questions are the following:&#xD;
- Could these Attributes lines explain why the first notebook worked and the second didn&amp;#039;t?&#xD;
- If not, could you suggest what might be causing the failure?&#xD;
- How/why do these Attributes lines (and the Initialization section) get generated?&#xD;
- What can I do to ensure that the second version of the notebook has them?&#xD;
- What is the $CellContext context, and what does {Temporary} signify?&#xD;
&#xD;
Background:&#xD;
This particular Manipulate has been used successfully on the desktop for several years. I want to include the Manipulate as part of a larger notebook in the cloud, and I don&amp;#039;t want the end user to confront a pink panel. &#xD;
&#xD;
Locally, I am running on a MacBook M2, with Sonoma 14.0 and Mathematica 13.2.1.0. I am not&#xD;
aware of having done any specific customization to my cloud account. The Graphics.wl library&#xD;
(referenced in the initialization cell) is a mature collection of function definitions that works successfully on both the desktop and the cloud. I have attached the relevant functions in a notebook (graphics.nb).</description>
    <dc:creator>Spencer Rugaber</dc:creator>
    <dc:date>2023-11-08T18:24:28Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/3567201">
    <title>Playing around with Manipulate</title>
    <link>https://community.wolfram.com/groups/-/m/t/3567201</link>
    <description>&amp;amp;[Wolfram Notebook][1]&#xD;
&#xD;
&#xD;
  [1]: https://www.wolframcloud.com/obj/1c7fc3d5-95a6-4b0b-becf-0afd3aeaf83d</description>
    <dc:creator>Daniel Carvalho</dc:creator>
    <dc:date>2025-10-29T02:20:39Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/3563534">
    <title>Geometry and Symmetry Chapter 5:  Dynamical Transformation Functions</title>
    <link>https://community.wolfram.com/groups/-/m/t/3563534</link>
    <description>In this preliminary post I introduce the idea of dynamical Transformation Functions, that is, the situation where the Transformation Matrices have functions rather than numbers as entries.  I apply this specifically in the case of even (direct) isometries of real 3-space.  I introduce DITF format which is independent of the construction of the transformation function. I give a geometrical interpretation which shows motion in space not only the position but also the orientation of the object.  Several examples are given.</description>
    <dc:creator>Barry H Dayton</dc:creator>
    <dc:date>2025-10-22T00:17:13Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/3558592">
    <title>Wolfram &amp;amp; Raspberry Pi 5: complete STEM applications, advanced visualizations &amp;amp; GPIO sensor support</title>
    <link>https://community.wolfram.com/groups/-/m/t/3558592</link>
    <description>![Wolfram &amp;amp; Raspberry Pi 5: Complete STEM applications, advanced visualizations &amp;amp; GPIO sensor support][1]&#xD;
&#xD;
&amp;amp;[Wolfram Notebook][2]&#xD;
&#xD;
&#xD;
  [1]: https://community.wolfram.com//c/portal/getImageAttachment?filename=STEMstudent%27sdream.png&amp;amp;userId=20103&#xD;
  [2]: https://www.wolframcloud.com/obj/37751904-8fa2-44eb-a492-7983fdc9dcd8</description>
    <dc:creator>Bart ter Haar Romeny</dc:creator>
    <dc:date>2025-10-09T17:30:45Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/3554402">
    <title>Recreation of World of Goo or bridge construction game with WLJS</title>
    <link>https://community.wolfram.com/groups/-/m/t/3554402</link>
    <description>![Recreation of World of Goo or bridge construction game with WLJS][1]&#xD;
&#xD;
&#xD;
Based on original article: https://wljs.io/blog/2025/08/22/goo/&#xD;
&#xD;
Here we shall try to model a system of interconnected bonds using the Verlet method. Then, we&amp;#039;ll add some visuals to make it feel like a game.&#xD;
&#xD;
#Motion Equations&#xD;
&#xD;
The system of connected points must obey Newton&amp;#039;s laws and kinematic equations as well. To integrate them in real-time, Euler&amp;#039;s method, RK (Runge-Kutta), or Verlet methods can be used. We will go for the Verlet method since it will be easier to apply constraints of the bonds in the future:&#xD;
&#xD;
$$x_{n+1} = 2x_n - x_{n-1} + \frac{f_n}{m} \delta t^2$$&#xD;
&#xD;
We can try to apply it for the simples case, when $\mathbf{f}_n = -m\mathbf{x} / |\mathbf{x}|^4$ is sort of a gravity force caused by a red star in the center&#xD;
&#xD;
    estimateX[n_Integer, initialV_ : 0.01] := &#xD;
      FixedPoint[&#xD;
       Function[&#xD;
        x, {2 x[[1]] - x[[2]] - 0.001  ((x[[1]])/(Power[Norm[x[[1]]], 4])),&#xD;
          x[[1]], x[[2]]}], {{-1.0, 2 initialV 0.01}, {-1.0, &#xD;
         initialV 0.01}, {-1.0, 0}}, n];&#xD;
&#xD;
Now let&amp;#039;s plot our solutions for different initial conditions:&#xD;
&#xD;
    Table[{v, Table[estimateX[n, v][[1]], {n, 1, 100}]}, {v,0,4}];&#xD;
    % // Transpose;&#xD;
    ListLinePlot[&#xD;
      %[[2]]&#xD;
    , PlotStyle -&amp;gt; AbsoluteDashing[{3}]  &#xD;
    , PlotRange -&amp;gt; 2{{-1,1}, {-1,1}}&#xD;
    , PlotLegends -&amp;gt; (StringTemplate[&amp;#034;v = ``&amp;#034;][#]&amp;amp;/@ %[[1]])&#xD;
    , Epilog -&amp;gt; {Red, Disk[{0,0}, 0.1]} &#xD;
    , Frame -&amp;gt; True&#xD;
    , AspectRatio -&amp;gt; 1&#xD;
    ]&#xD;
&#xD;
![enter image description here][2]&#xD;
&#xD;
*The case of v=3 must be related to the orbital velocity of a star*&#xD;
&#xD;
To see it animated we should repeat the calculations for every frame&#xD;
&#xD;
    With[{initialV = 3.0}, &#xD;
     Module[{point = {{-1.0, 2 initialV 0.01}, {-1.0, &#xD;
          initialV 0.01}, {-1.0, 0}}}, &#xD;
      EventHandler[&amp;#034;frameXXX&amp;#034;, Function[Null, point[[3]] = point[[2]];&#xD;
        point[[2]] = point[[1]];&#xD;
        point[[1]] = &#xD;
         2 point[[2]] - &#xD;
          point[[3]] - ((point[[1]])/(Power[Norm[point[[1]]], 4])) 0.001;&#xD;
        point = point; (*to trigger an update*)]];&#xD;
      Graphics[{Point[point // Offload], &#xD;
        AnimationFrameListener[point // Offload, &amp;#034;Event&amp;#034; -&amp;gt; &amp;#034;frameXXX&amp;#034;]}, &#xD;
       PlotRange -&amp;gt; 2 {{-1, 1}, {-1, 1}}, &#xD;
       Epilog -&amp;gt; {Red, Disk[{0, 0}, 0.1]}, AspectRatio -&amp;gt; 1]]]&#xD;
&#xD;
![enter image description here][3]&#xD;
&#xD;
#Constraints Algorithm&#xD;
&#xD;
The simplest and well-known approach for solving the bonds problem is approximating it with springs with finite or infinite stiffness. As it follows from [Wikipedia article][4]:&#xD;
&#xD;
&amp;gt; ![enter image description here][5]&#xD;
&#xD;
where s is an effective stiffness constant: s=1 represents an infinitely stiff spring (hard bond), and s&amp;lt;1 represents a soft bond.&#xD;
&#xD;
&amp;gt; Verlet integration is useful because it directly relates the force to the position, rather than solving the problem using velocities.&#xD;
&#xD;
Note: Constraints Algorithm is applied on the vertices **after** Verlet integration has been performed.&#xD;
&#xD;
Let&amp;#039;s draft a function, that takes the following arguments and process the data efficiently:&#xD;
&#xD;
- list of vertices&#xD;
 - list of indices of fixed vertices&#xD;
 - list of bonds:  &#xD;
        - index A  &#xD;
        - index B  &#xD;
        - initial length  &#xD;
        - stiffness&#xD;
&#xD;
And it should output a new list of vertices:&#xD;
&#xD;
    processVertices[vertices_List, fixed_List, bonds_List] := &#xD;
     Module[{coords = vertices[[1]], coords2 = vertices[[2]], &#xD;
       coords3 = vertices[[3]]}, Do[coords3 = coords2;&#xD;
       coords2 = coords;&#xD;
       Module[{integrated = &#xD;
          2 coords2 - coords3 + Table[{0, -1}, Length[coords]] 0.001}, &#xD;
        MapThread[&#xD;
         Function[{i, j, l, s}, &#xD;
          With[{d = integrated[[i]] - integrated[[j]]}, {norm = &#xD;
             Norm[d]}, {m = 0.5 s Min[(l/(norm + 0.001) - 1), 0.1]&#xD;
            (*avoid blowing up the system*)}, integrated[[i]] += m d;&#xD;
           integrated[[j]] -= m d;]], RandomSample[bonds] // Transpose];&#xD;
        Map[Function[index, integrated[[index]] = coords[[index]];], &#xD;
         fixed];&#xD;
        coords = integrated;];, {2 5}];&#xD;
      {coords, coords2, coords3}]&#xD;
&#xD;
Note: For the stability it is recommended to apply constraints in random order&#xD;
&#xD;
Let us try it on some basic example:&#xD;
&#xD;
    bridge = Join @@ Table[{{i, 75}, {i + 5, 55}}, {i, 1, 100, 10}];&#xD;
    bonds = Join[Table[{i, i + 1}, {i, 1, Length[bridge] - 1, 2}], &#xD;
       Table[{i, i + 2}, {i, 1, Length[bridge] - 2, 2}], &#xD;
       Table[{i + 1, i + 3}, {i, 1, Length[bridge] - 3, 2}]];&#xD;
    bonds = Map[&#xD;
       Join[#, {Norm[bridge[[#[[1]]]] - bridge[[#[[2]]]]], 0.7} // N] &amp;amp;, &#xD;
       bonds];&#xD;
    &#xD;
    plotBridge[bridge_] := &#xD;
      Graphics[{MapThread[{bridge[[#1]], bridge[[#2]]} &amp;amp;, &#xD;
          bonds // Transpose] // Line, Point[bridge], ColorData[97][6], &#xD;
        MapIndexed[Text[#2[[1]], #1] &amp;amp;, bridge]}, &#xD;
       PlotRange -&amp;gt; {{0, 100}, {0, 100}}, &amp;#034;Controls&amp;#034; -&amp;gt; False];&#xD;
    &#xD;
    plotBridge[bridge]&#xD;
&#xD;
![enter image description here][7]&#xD;
&#xD;
Let&amp;#039;s run the simulation for a few iterations and plot the final result, while keeping [1,2] vertices fixed at the original positions&#xD;
&#xD;
    Module[{bridgeState = {bridge, bridge, bridge}},&#xD;
      Do[&#xD;
        bridgeState = processVertices[bridgeState, {1,2,19,20}, bonds];&#xD;
      , {10}];&#xD;
    &#xD;
      Show[plotBridge[bridge], plotBridge[bridgeState[[1]]]]&#xD;
    ]&#xD;
&#xD;
![enter image description here][8]&#xD;
&#xD;
Great! At least it did not collapse :) It would be great to see it live. For this we apply the same strategy with `Offload` technique&#xD;
&#xD;
    Module[{bridgeState, lines, points, frame = CreateUUID[]}, &#xD;
     EventHandler[frame, &#xD;
      Function[Null, &#xD;
       bridgeState = processVertices[bridgeState, {1, 2, 19, 20}, bonds];&#xD;
       lines = &#xD;
        MapThread[{bridgeState[[1, #1]], bridgeState[[1, #2]]} &amp;amp;, &#xD;
         bonds // Transpose];]];&#xD;
     bridgeState = {bridge, bridge, bridge};&#xD;
     lines = &#xD;
      MapThread[{bridgeState[[1, #1]], bridgeState[[1, #2]]} &amp;amp;, &#xD;
       bonds // Transpose];&#xD;
     points = bridge;&#xD;
     Show[plotBridge[bridge], &#xD;
      Graphics[{ColorData[97][9], Point[points // Offload], &#xD;
        Line[lines // Offload], &#xD;
        AnimationFrameListener[lines // Offload, &amp;#034;Event&amp;#034; -&amp;gt; frame]}]]]&#xD;
&#xD;
![enter image description here][10]&#xD;
&#xD;
#Preparing Graphics&#xD;
&#xD;
The original inspiration was a puzzle video game developed and published by 2D Boy - **The World of Goo**. It was first released in 2008. In the game, players must use balls of goo to build structures, such as bridges, towers and etc.&#xD;
&#xD;
We start from the background, and add some blur to it:&#xD;
&#xD;
    background = Blur[&#xD;
![enter image description here][11]&#xD;
&#xD;
    , 10];&#xD;
&#xD;
    clouds = {&#xD;
![enter image description here][12],&#xD;
![enter image description here][13]&#xD;
&#xD;
    };&#xD;
&#xD;
#Rendering&#xD;
&#xD;
Rendering the scene using retained mode with pure raster graphics is more efficient, especially when applying special effects.&#xD;
&#xD;
For this reason we use Javascript Canvas API, which is mapped 1:1 to `Canvas2D` library&#xD;
&#xD;
    Needs[&amp;#034;Canvas2D`&amp;#034;-&amp;gt;&amp;#034;ctx`&amp;#034;] // Quiet; &#xD;
&#xD;
Let&amp;#039;s define a helper function for rendering bonds:&#xD;
&#xD;
    drawBonds[context_, vert_, edges_, &#xD;
       fixed_, {width_, height_}] := (ctx`BeginPath[context];&#xD;
       ctx`SetLineWidth[context, 4];&#xD;
       ctx`SetStrokeStyle[context, &amp;#034;#2C6C75&amp;#034;];&#xD;
       Do[ctx`MoveTo[context, {0, height} - {-1, 1} vert[[p[[1]]]]];&#xD;
        ctx`LineTo[context, {0, height} - {-1, 1} vert[[p[[2]]]]];, {p, &#xD;
         edges}];&#xD;
       ctx`Stroke[context];&#xD;
       ctx`SetFillStyle[context, &amp;#034;#1C4E28&amp;#034;];&#xD;
       (ctx`BeginPath[context];&#xD;
          ctx`Arc[context, {0, height} - {-1, 1} #, 6, 0, 2.0 Pi];&#xD;
          ctx`Fill[context];) &amp;amp; /@ vert;&#xD;
       ctx`SetFillStyle[context, RGBColor[0.9, 0.4, 0.4] // Darker];&#xD;
       (ctx`BeginPath[context];&#xD;
          ctx`Arc[context, {0, height} - {-1, 1} vert[[#]], 4, 0, 2.0 Pi];&#xD;
          ctx`Fill[context];) &amp;amp; /@ fixed;);&#xD;
&#xD;
Here we use the same bridge section and render it using our new raster renderer:&#xD;
&#xD;
    Module[{&#xD;
      ctx = ctx`Canvas2D[]&#xD;
    },&#xD;
      drawBonds[ctx, 5 bridge, bonds, {1,2,19,20}, {500,500}];&#xD;
      ctx`Dispatch[ctx];&#xD;
      Image[ctx, ImageResolution-&amp;gt;{500,500}]&#xD;
    ]&#xD;
&#xD;
![enter image description here][14]&#xD;
&#xD;
As a basic visual effect, we can add a trailing effect to the cursor, similar to how it was done in the original game (to some extent):&#xD;
&#xD;
    drawPointer[context_, trail_, edges_, {width_, height_}] := (&#xD;
      ctx`BeginPath[context];&#xD;
      ctx`SetLineWidth[context, 2];&#xD;
      ctx`SetStrokeStyle[context, RGBColor[0.4, 0.6, 0.9]//Darker];&#xD;
    &#xD;
      Do[&#xD;
        ctx`MoveTo[context, {0, height} - {-1, 1} t[[1]]];&#xD;
        ctx`LineTo[context, {0, height} - {-1, 1} t[[2]]];&#xD;
      , {t, edges}];&#xD;
    &#xD;
      ctx`Stroke[context];&#xD;
      ctx`SetFillStyle[context, RGBColor[0.4, 0.9, 0.6]//Darker];&#xD;
    &#xD;
      Do[&#xD;
        ctx`BeginPath[context];&#xD;
        ctx`Arc[context, {0, height} - {-1, 1} trail[[i]], 6.0/i, 0, 2.0 Pi];&#xD;
        ctx`Fill[context];&#xD;
      , {i, Length[trail]}];&#xD;
    );&#xD;
&#xD;
   -&#xD;
&#xD;
    Module[{&#xD;
      ctx = ctx`Canvas2D[],&#xD;
      trail = Table[{0,0}, {10}],&#xD;
      frame = CreateUUID[],&#xD;
      target = {0,0},&#xD;
      state = Table[bridge // N, {3}]&#xD;
    },&#xD;
      EventHandler[frame, Function[Null,&#xD;
        ctx`ClearRect[ctx, {0,0}, {500,500}];&#xD;
        drawBonds[ctx, 5 state[[1]], bonds, {1,2,19,20}, {500,500}];&#xD;
        drawPointer[ctx, trail, {}, {500,500}];&#xD;
        ctx`Dispatch[ctx];  &#xD;
    &#xD;
        trail = RotateRight[trail, 1];&#xD;
        trail[[1]] = target;&#xD;
    &#xD;
        state = processVertices[state, {1,2,19,20}, bonds];&#xD;
      ]];&#xD;
      &#xD;
      EventHandler[Image[ctx, &#xD;
        ImageResolution-&amp;gt;{500,500},&#xD;
        Epilog-&amp;gt;AnimationFrameListener[ctx, &amp;#034;Event&amp;#034;-&amp;gt;frame]&#xD;
      ], {&#xD;
        &amp;#034;mousemove&amp;#034;-&amp;gt;Function[xy,&#xD;
          target = {0,500} + {1,-1} xy;&#xD;
      ]}]&#xD;
    ]&#xD;
&#xD;
#Utils&#xD;
&#xD;
For adding more bonds to the structure of a bridge, we need to find the shortest links (maximum 2) to the cursor position. Here is a little function for this purpose:&#xD;
&#xD;
    findConnections[vertx_, p_, th_: 2.0] := &#xD;
      With[{a = &#xD;
         MapIndexed[Function[{val, i}, &#xD;
           With[{n = Norm[p - val]}, &#xD;
            If[n &amp;lt; th, {i[[1]], n}, Nothing]]], vertx]}, &#xD;
       If[Length[a] == 0, {}, &#xD;
        If[Length[a] &amp;gt; 2, &#xD;
         TakeSmallestBy[a, Function[v, v[[2]]], 2], a][[All, 1]]]]&#xD;
&#xD;
It is far from the optimal solution, since it naively checks all vertices available.&#xD;
&#xD;
#Wrapping up&#xD;
&#xD;
As the last step, we add a click listener to append new vertices and bonds to the system. For the visuals, we also add a background image and moving clouds in a simple linear pattern:&#xD;
&#xD;
    With[{&#xD;
      frame = CreateUUID[],&#xD;
      ctx = ctx`Canvas2D[],&#xD;
      fixed = NotebookStore[&amp;#034;contemporaneously-be4&amp;#034;]&#xD;
    }, Module[{&#xD;
      p, pointer, trail, target, nearbyVertices, bonds, &#xD;
      offset, targetOffset, cloudsPos, cloudsImages&#xD;
    }, &#xD;
      p = NotebookStore[&amp;#034;audience-36d&amp;#034;];&#xD;
      bonds = NotebookStore[&amp;#034;huckster-6b8&amp;#034;];&#xD;
      &#xD;
      nearbyVertices = {};&#xD;
      cloudsPos = NotebookStore[&amp;#034;circumvention-9f5&amp;#034;];&#xD;
      &#xD;
      cloudsImages = RandomChoice[clouds, 5];&#xD;
      &#xD;
    &#xD;
      pointer = {250,250};&#xD;
      offset = 0.0;&#xD;
      targetOffset = -150;&#xD;
      target = pointer;&#xD;
      trail = Table[pointer, {10}];&#xD;
      &#xD;
      EventHandler[frame, Function[Null,&#xD;
        &#xD;
        (* clear and translate the screen buffer *)&#xD;
        ctx`ClearRect[ctx, {0,0}, {500,500}];&#xD;
        ctx`Translate[ctx, {0, offset}];&#xD;
    &#xD;
        (* background *)&#xD;
        ctx`DrawImage[ctx, background, {0,0}];&#xD;
        MapThread[ctx`DrawImage[ctx, #1, #2]&amp;amp;, {cloudsImages, cloudsPos}];&#xD;
    &#xD;
        (* draw bridge *)&#xD;
        drawBonds[ctx, p[[1]], bonds, fixed, {500,500}];&#xD;
    &#xD;
        &#xD;
        (* draw a cursor *)&#xD;
        drawPointer[ctx, trail, {trail[[1]], p[[1, #]]} &amp;amp;/@ nearbyVertices, {500,500}];&#xD;
    &#xD;
        (* reset transformation and flip the buffers *)&#xD;
        ctx`Translate[ctx, {0, -offset}];&#xD;
        ctx`Dispatch[ctx];&#xD;
    &#xD;
        (* trail computations *)&#xD;
        pointer = 0.35 (target + {0,1} offset) + 0.65 pointer;&#xD;
        trail = RotateRight[trail, 1];&#xD;
        trail[[1]] = pointer;&#xD;
    &#xD;
        (* animation of clouds *)&#xD;
        cloudsPos = Map[If[#[[1]] &amp;gt; 500, {-150, #[[2]]}, # + {1,0}]&amp;amp;, cloudsPos];&#xD;
    &#xD;
        (* camera animation *)&#xD;
        If[target[[2]]  &amp;lt; 100 &amp;amp;&amp;amp; targetOffset &amp;gt; -200, targetOffset-=6.0];&#xD;
        If[target[[2]]  &amp;gt; 500-100 &amp;amp;&amp;amp; targetOffset &amp;lt; 0, targetOffset+=6.0];&#xD;
    &#xD;
        offset = offset + 0.1 (targetOffset - offset);&#xD;
    &#xD;
        (* perform Verlet *)&#xD;
        p = processVertices[p, fixed, bonds];&#xD;
      ]];&#xD;
    &#xD;
      EventHandler[Image[ctx, ImageResolution-&amp;gt;{500,500}, Epilog-&amp;gt;{&#xD;
        AnimationFrameListener[ctx, &amp;#034;Event&amp;#034;-&amp;gt;frame]&#xD;
      }], {&#xD;
        &amp;#034;click&amp;#034; -&amp;gt; Function[xy,&#xD;
          p[[1]] = Append[p[[1]], pointer];&#xD;
          p[[2]] = Append[p[[2]], pointer];&#xD;
          p[[3]] = Append[p[[3]], pointer];&#xD;
          With[{length = Length[p[[1]]]}, &#xD;
            bonds = Join[bonds, Table[&#xD;
              {length, i, Norm[pointer - p[[1, i]]], 0.3}&#xD;
            , {i, nearbyVertices}]];&#xD;
          ];&#xD;
        ],&#xD;
        &amp;#034;mousemove&amp;#034; -&amp;gt; Function[xy,&#xD;
          target = {0, 500} - {-1, 1} xy;&#xD;
          (* scan for vertices near the cursor *)&#xD;
          nearbyVertices = findConnections[p[[1]], pointer, 60];&#xD;
        ]&#xD;
      }]&#xD;
    ]]&#xD;
&#xD;
This wasn&amp;#039;t that hard, was it? It is amazing how powerful Wolfram Language becomes once bridged with web-tech sandbox tools&#xD;
&#xD;
&amp;amp;[Embedded Video][15]&#xD;
&#xD;
Note: If you are reading this from a web page and not from the WLJS Notebook:&#xD;
&#xD;
Some resources were kept within the notebook storage. Download the original notebook from the heading section to have all images and precalculated vertices.&#xD;
&#xD;
&#xD;
  [1]: https://community.wolfram.com//c/portal/getImageAttachment?filename=world_of_goo2-cc9f5a7ba0a7819e544b1825a7054c5b%281%29.gif&amp;amp;userId=20103&#xD;
  [2]: https://community.wolfram.com//c/portal/getImageAttachment?filename=fig1.png&amp;amp;userId=20103&#xD;
  [3]: https://community.wolfram.com//c/portal/getImageAttachment?filename=1623Fig2_3.gif&amp;amp;userId=20103&#xD;
  [4]: https://en.wikipedia.org/wiki/Verlet_integration&#xD;
  [5]: https://community.wolfram.com//c/portal/getImageAttachment?filename=Fig3.png&amp;amp;userId=20103&#xD;
  [6]: https://community.wolfram.com//c/portal/getImageAttachment?filename=Fig3.jpg&amp;amp;userId=20103&#xD;
  [7]: https://community.wolfram.com//c/portal/getImageAttachment?filename=Fig4.png&amp;amp;userId=20103&#xD;
  [8]: https://community.wolfram.com//c/portal/getImageAttachment?filename=8936Fig5.png&amp;amp;userId=20103&#xD;
  [9]: https://community.wolfram.com//c/portal/getImageAttachment?filename=fig1.png&amp;amp;userId=20103&#xD;
  [10]: https://community.wolfram.com//c/portal/getImageAttachment?filename=2638Fig6.gif&amp;amp;userId=20103&#xD;
  [11]: https://community.wolfram.com//c/portal/getImageAttachment?filename=Fig7.png&amp;amp;userId=20103&#xD;
  [12]: https://community.wolfram.com//c/portal/getImageAttachment?filename=Fig8.png&amp;amp;userId=20103&#xD;
  [13]: https://community.wolfram.com//c/portal/getImageAttachment?filename=Fig9.png&amp;amp;userId=20103&#xD;
  [14]: https://community.wolfram.com//c/portal/getImageAttachment?filename=10912Fig10.png&amp;amp;userId=20103&#xD;
  [15]: https://www.wolframcloud.com/obj/6b15b219-367d-4064-a1fb-70234b202185</description>
    <dc:creator>Kirill Vasin</dc:creator>
    <dc:date>2025-10-02T16:13:59Z</dc:date>
  </item>
</rdf:RDF>

