{"id":12579,"date":"2026-09-09T13:52:52","date_gmt":"2026-09-09T09:52:52","guid":{"rendered":"https:\/\/beegraphy.com\/blog\/?p=12579"},"modified":"2026-09-09T15:41:33","modified_gmt":"2026-09-09T11:41:33","slug":"ai-parametric-design-reaction-diffusion","status":"publish","type":"post","link":"https:\/\/beegraphy.com\/blog\/ai-parametric-design-reaction-diffusion\/","title":{"rendered":"AI Parametric Design: 6 Easy Steps to Reaction Diffusion"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_75 ez-toc-wrap-left counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<label for=\"ez-toc-cssicon-toggle-item-6aa15b8f48106\" class=\"ez-toc-cssicon-toggle-label\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #757575;color:#757575\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #757575;color:#757575\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/label><input type=\"checkbox\"  id=\"ez-toc-cssicon-toggle-item-6aa15b8f48106\" checked aria-label=\"Toggle\" \/><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/beegraphy.com\/blog\/ai-parametric-design-reaction-diffusion\/#AI_parametric_design_turned_reaction_diffusion_into_curves_you_can_build_with_Here_is_the_BeeGraphy_node_a_lamp_made_from_it_and_the_free_prompt\" >AI parametric design turned reaction diffusion into curves you can build with. Here is the BeeGraphy node, a lamp made from it, and the free prompt.<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/beegraphy.com\/blog\/ai-parametric-design-reaction-diffusion\/#Why_we_wanted_reaction_diffusion_for_products\" >Why we wanted reaction diffusion for products<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/beegraphy.com\/blog\/ai-parametric-design-reaction-diffusion\/#What_reaction_diffusion_actually_is\" >What reaction diffusion actually is<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/beegraphy.com\/blog\/ai-parametric-design-reaction-diffusion\/#Letting_AI_parametric_design_write_the_node\" >Letting AI parametric design write the node<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/beegraphy.com\/blog\/ai-parametric-design-reaction-diffusion\/#The_bug_that_nearly_shipped\" >The bug that nearly shipped<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/beegraphy.com\/blog\/ai-parametric-design-reaction-diffusion\/#What_the_BeeGraphy_node_gives_you_curves_you_can_build_with\" >What the BeeGraphy node gives you: curves you can build with<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/beegraphy.com\/blog\/ai-parametric-design-reaction-diffusion\/#Case_study_turning_reaction_diffusion_curves_into_a_lamp\" >Case study: turning reaction diffusion curves into a lamp<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/beegraphy.com\/blog\/ai-parametric-design-reaction-diffusion\/#Build_it_in_6_easy_steps\" >Build it in 6 easy steps<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/beegraphy.com\/blog\/ai-parametric-design-reaction-diffusion\/#Get_the_free_AI_parametric_design_prompt\" >Get the free AI parametric design prompt<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/beegraphy.com\/blog\/ai-parametric-design-reaction-diffusion\/#Now_go_break_it\" >Now go break it<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/beegraphy.com\/blog\/ai-parametric-design-reaction-diffusion\/#AI_parametric_design_FAQ\" >AI parametric design FAQ<\/a><\/li><\/ul><\/nav><\/div>\n<h2 dir=\"ltr\"><span class=\"ez-toc-section\" id=\"AI_parametric_design_turned_reaction_diffusion_into_curves_you_can_build_with_Here_is_the_BeeGraphy_node_a_lamp_made_from_it_and_the_free_prompt\"><\/span>AI parametric design turned reaction diffusion into curves you can build with. Here is the BeeGraphy node, a lamp made from it, and the free prompt.<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<div id=\"attachment_12586\" style=\"width: 1034px\" class=\"wp-caption aligncenter\"><img fetchpriority=\"high\" decoding=\"async\" aria-describedby=\"caption-attachment-12586\" class=\"wp-image-12586 size-large lazyload\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" data-src=\"https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/Screenshot-2026-09-08-111831-1-1024x574.png\" alt=\"Lamp shade built from reaction diffusion curves using AI parametric design in BeeGraphy\" width=\"1024\" height=\"574\" data-sizes=\"auto\" data-srcset=\"https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/Screenshot-2026-09-08-111831-1-1024x574.png 1024w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/Screenshot-2026-09-08-111831-1-300x168.png 300w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/Screenshot-2026-09-08-111831-1-768x430.png 768w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/Screenshot-2026-09-08-111831-1-1536x860.png 1536w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/Screenshot-2026-09-08-111831-1-800x448.png 800w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/Screenshot-2026-09-08-111831-1-1920x1076.png 1920w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/Screenshot-2026-09-08-111831-1-20x11.png 20w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/Screenshot-2026-09-08-111831-1.png 1928w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><p id=\"caption-attachment-12586\" class=\"wp-caption-text\">A product, not a pattern study. The profile came straight out of the reaction diffusion node.<\/p><\/div>\n<h2 id=\"why\"><span class=\"ez-toc-section\" id=\"Why_we_wanted_reaction_diffusion_for_products\"><\/span>Why we wanted reaction diffusion for products<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Reaction diffusion is everywhere in computational design imagery and almost nowhere in computational design products.<\/p>\n<p>The reason is boring and practical. Most reaction diffusion implementations output a pixel field or a mesh soup. Beautiful on screen, useless downstream. You cannot loft it, you cannot offset it for wall thickness, you cannot hand it to a CNC.<\/p>\n<p>What a product workflow needs from reaction diffusion is a\u00a0<strong>clean closed curve<\/strong>. One that does not cross itself, sits on a plane, and lofts without argument.<\/p>\n<p>No node does that. So we built one, and we let AI parametric design do the writing.<\/p>\n<h2 id=\"what-is\"><span class=\"ez-toc-section\" id=\"What_reaction_diffusion_actually_is\"><\/span>What reaction diffusion actually is<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Two chemicals sit in the same space. One activates, one inhibits. Both diffuse, at different speeds.<\/p>\n<p>Where the inhibitor spreads much faster than the activator, the system settles into\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Turing_pattern\" target=\"_blank\" rel=\"noopener\">Turing patterns<\/a>: peaks at a characteristic spacing. Pufferfish skin, coral, fingerprints.<\/p>\n<p>We used the Gierer-Meinhardt form of the\u00a0<a href=\"https:\/\/beegraphy.com\/blog\/mathematical-patterns-in-beegraphy\/\" target=\"_blank\" rel=\"noopener\">reaction diffusion<\/a>\u00a0equations, running along the arc length of a closed curve rather than across a surface.<\/p>\n<pre><code>a_t = Da\u00b7a'' + \u03c1\u00b7a\u00b2 \/ (h\u00b7(1 + \u03ba\u00b7a\u00b2)) \u2212 \u03bca\u00b7a\r\nh_t = Dh\u00b7h'' + \u03c1\u00b7a\u00b2                   \u2212 \u03bch\u00b7h<\/code><\/pre>\n<p>Each sample point then moves along its own normal by the local activator concentration. High activator, the curve bulges outward. Low, it pulls in. The lobes land at the spacing the chemistry dictates, not at a spacing you drew.<\/p>\n<h2 id=\"ai-builds-it\"><span class=\"ez-toc-section\" id=\"Letting_AI_parametric_design_write_the_node\"><\/span>Letting AI parametric design write the node<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>BeeGraphy&#8217;s\u00a0<a href=\"https:\/\/beegraphy.com\/blog\/exploring-the-typescript-node-in-beegraphy\/\">TypeScript node<\/a>\u00a0takes a function, exposes ports, and behaves like any other component on the canvas. That is where the solver lives.<\/p>\n<p>We described what we wanted to\u00a0<a href=\"https:\/\/claude.ai\/\" target=\"_blank\" rel=\"noopener\">Claude<\/a>\u00a0in plain English. Not specifications. The kind of thing you say to a colleague.<\/p>\n<p><strong>&#8220;do not make the curve collide with itself&#8221;<\/strong><\/p>\n<p><strong>&#8220;the curve should move till they do not collide&#8221;<\/strong><\/p>\n<p><strong>&#8220;it is working perfect but is making the script slower, can we make it faster?&#8221;<\/strong><\/p>\n<p>That last one produced a counting-sort spatial grid and a fast-path early exit, making the node nine times faster. We never asked for either by name. We said it was slow. That is what AI parametric design feels like in practice.<\/p>\n<div id=\"attachment_12588\" style=\"width: 1034px\" class=\"wp-caption aligncenter\"><img decoding=\"async\" aria-describedby=\"caption-attachment-12588\" class=\"wp-image-12588 size-large lazyload\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" data-src=\"https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/123-1024x576.png\" alt=\"AI parametric design session turning plain English into a reaction diffusion TypeScript node\" width=\"1024\" height=\"576\" data-sizes=\"auto\" data-srcset=\"https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/123-1024x576.png 1024w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/123-300x169.png 300w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/123-768x432.png 768w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/123-1536x864.png 1536w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/123-800x450.png 800w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/123-20x11.png 20w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/123.png 1920w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><p id=\"caption-attachment-12588\" class=\"wp-caption-text\">The instruction on the left. The solver on the right.<\/p><\/div>\n<h2 id=\"bug\"><span class=\"ez-toc-section\" id=\"The_bug_that_nearly_shipped\"><\/span>The bug that nearly shipped<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>The node ran. It produced beautiful organic lobes. We iterated on it for hours.<\/p>\n<p>Then we asked the model to measure one diffusion constant instead of estimating it. While printing diagnostics it also printed the pattern contrast, which came back as zero to three decimal places.<\/p>\n<p>So it ran a linear stability analysis. A two-chemical system only forms Turing patterns if the inhibitor diffuses far enough faster than the activator. There is a hard threshold, and for our reaction rates it sat around 80.<\/p>\n<pre><code>required  Dh\/Da  &gt;  ~80\r\nours      Dh\/Da  =   40<\/code><\/pre>\n<p>Our simulation had never run. The activator array was flat to six decimal places. Normalizing that flat array stretched float rounding noise to full amplitude, and smoothing turned the noise into convincing organic waves.<\/p>\n<p>We had been admiring our own rounding errors, while every visual check passed.<\/p>\n<div id=\"attachment_12611\" style=\"width: 1034px\" class=\"wp-caption aligncenter\"><img decoding=\"async\" aria-describedby=\"caption-attachment-12611\" class=\"wp-image-12611 size-large lazyload\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" data-src=\"https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/ChatGPT-Image-Sep-8-2026-01_28_27-PM-1024x576.png\" alt=\"We didn\u2019t draw the curve. We defined the rules that allowed it to emerge.\" width=\"1024\" height=\"576\" data-sizes=\"auto\" data-srcset=\"https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/ChatGPT-Image-Sep-8-2026-01_28_27-PM-1024x576.png 1024w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/ChatGPT-Image-Sep-8-2026-01_28_27-PM-300x169.png 300w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/ChatGPT-Image-Sep-8-2026-01_28_27-PM-768x432.png 768w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/ChatGPT-Image-Sep-8-2026-01_28_27-PM-1536x864.png 1536w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/ChatGPT-Image-Sep-8-2026-01_28_27-PM-800x450.png 800w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/ChatGPT-Image-Sep-8-2026-01_28_27-PM-20x11.png 20w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/ChatGPT-Image-Sep-8-2026-01_28_27-PM.png 1672w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><p id=\"caption-attachment-12611\" class=\"wp-caption-text\">AI Parametric Design: From Reaction\u2013Diffusion to Form.<\/p><\/div>\n<p>Raising the inhibitor diffusion to 0.8 against an activator at 0.004 put the ratio at 200. Pattern amplitude went from about one part in a million to 2.4, and the wavelength held steady at 11 cells across every grid size we tested.<\/p>\n<p><strong>This is the central lesson of AI parametric design.<\/strong>\u00a0A good render proves nothing. Three habits came out of it, and all three are in the prompt:<\/p>\n<ol>\n<li><strong>Ask for derivations.<\/strong>\u00a0If the script encodes physics you did not derive, make the model derive the conditions and check your numbers against them.<\/li>\n<li><strong>Never let it grade its own homework.<\/strong>\u00a0We ran a brute-force checker written separately from the solver. If they disagreed, the solver was wrong.<\/li>\n<li><strong>Demand a fuzz harness.<\/strong> We ran 2,400 randomized cases. Zero self-intersections.<\/li>\n<\/ol>\n<h2 id=\"curves\"><span class=\"ez-toc-section\" id=\"What_the_BeeGraphy_node_gives_you_curves_you_can_build_with\"><\/span>What the BeeGraphy node gives you: curves you can build with<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>The output is a single closed curve, guaranteed non-self-intersecting, planar, and emitted as a one-edge B-spline so it lofts against anything.<\/p>\n<p>Six inputs control it:\u00a0<code>inputCurve<\/code>,\u00a0<code>amplitude<\/code>,\u00a0<code>patternScale<\/code>,\u00a0<code>iterations<\/code>,\u00a0<code>direction<\/code>\u00a0and\u00a0<code>seed<\/code>. Pattern scale sets lobe size. Iterations deepen the growth. Seed makes the whole thing reproducible, so a slider change upstream does not reshuffle your pattern.<\/p>\n<div id=\"attachment_12610\" style=\"width: 1034px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-12610\" class=\"wp-image-12610 size-large lazyload\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" data-src=\"https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/preview-1024x569.png\" alt=\"Curve variations from one BeeGraphy node at different pattern scales\" width=\"1024\" height=\"569\" data-sizes=\"auto\" data-srcset=\"https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/preview-1024x569.png 1024w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/preview-300x167.png 300w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/preview-768x427.png 768w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/preview-1536x853.png 1536w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/preview-800x444.png 800w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/preview-20x11.png 20w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/preview.png 1800w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><p id=\"caption-attachment-12610\" class=\"wp-caption-text\">One node, one input curve. Pattern scale from 1 to 12.<\/p><\/div>\n<p>Because it is a real curve rather than a field, everything downstream just works. Offset it for wall thickness. Loft it. Extrude it. Send it to CAM.<\/p>\n<h2 id=\"lamp\"><span class=\"ez-toc-section\" id=\"Case_study_turning_reaction_diffusion_curves_into_a_lamp\"><\/span>Case study: turning reaction diffusion curves into a lamp<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>To show the pipeline end to end, we made a lamp shade.<\/p>\n<p>Two reaction diffusion profiles, generated from the same base curve at different settings. One for the bottom, one for the top, moved up in Z.\u00a0<strong>Tween Curve<\/strong>\u00a0fills in every section between them, so the silhouette is interpolated rather than modelled. A\u00a0<strong>Graph Mapper<\/strong>\u00a0on a sine curve drives a\u00a0<strong>Scale<\/strong> node centered on each section&#8217;s own centroid, which produces the flare. Then\u00a0<strong>Loft Surface<\/strong>.<\/p>\n<div id=\"attachment_12617\" style=\"width: 1034px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-12617\" class=\"wp-image-12617 size-large lazyload\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" data-src=\"https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/Screenshot-2026-09-08-154827-1024x577.png\" alt=\"BeeGraphy node graph turning reaction diffusion curves into a lofted lamp product\" width=\"1024\" height=\"577\" data-sizes=\"auto\" data-srcset=\"https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/Screenshot-2026-09-08-154827-1024x577.png 1024w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/Screenshot-2026-09-08-154827-300x169.png 300w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/Screenshot-2026-09-08-154827-768x433.png 768w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/Screenshot-2026-09-08-154827-1536x865.png 1536w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/Screenshot-2026-09-08-154827-800x451.png 800w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/Screenshot-2026-09-08-154827-20x11.png 20w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/Screenshot-2026-09-08-154827.png 1917w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><p id=\"caption-attachment-12617\" class=\"wp-caption-text\">Two reaction diffusion nodes, a tween, a sine profile, a loft.<\/p><\/div>\n<p>The principle worth taking from this: script the part that needs memory, node the rest. The solver produces one good curve. The graph does the interpolating, remapping and lofting, because that is what graphs are best at.<\/p>\n<h2 id=\"steps\"><span class=\"ez-toc-section\" id=\"Build_it_in_6_easy_steps\"><\/span>Build it in 6 easy steps<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ol>\n<li>Open a new file in the\u00a0<a href=\"https:\/\/beegraphy.com\/workspace\" target=\"_blank\" rel=\"noopener\">BeeGraphy editor<\/a>. Add a\u00a0<strong>Star<\/strong>, a\u00a0<strong>Discontinuity<\/strong>, and a\u00a0<strong>NURBS Curve<\/strong>\u00a0set to Periodic and Clamped at degree 3.<\/li>\n<li>Add a\u00a0<strong>TypeScript<\/strong>\u00a0node. Create input ports named\u00a0<code>inputCurve<\/code>,\u00a0<code>amplitude<\/code>,\u00a0<code>patternScale<\/code>,\u00a0<code>iterations<\/code>,\u00a0<code>direction<\/code>,\u00a0<code>seed<\/code>, and one output port named\u00a0<code>curves<\/code>.<\/li>\n<li>Paste our prompt into Claude and let it run. Ask to see the fuzz test output before you accept anything.<\/li>\n<li>Paste the result into the TS Code field. Two gotchas: <code>async<\/code>\u00a0must be the first character, and no semicolon after the closing brace.<\/li>\n<li>Wire the curve in. Start at\u00a0<code>amplitude<\/code>\u00a020,\u00a0<code>patternScale<\/code>\u00a03,\u00a0<code>iterations<\/code>\u00a05.<\/li>\n<li>Duplicate the node with different settings,\u00a0<strong>Move<\/strong>\u00a0one up in Z,\u00a0<strong>Tween Curve<\/strong>\u00a0between them, then\u00a0<strong>Loft Surface<\/strong>.<\/li>\n<\/ol>\n<p>You do not have to build it from scratch to try it. Open our finished lamp file in BeeGraphy<br \/>\n<a href=\"https:\/\/beegraphy.com\/market\/product\/reaction-diffusion-lamp-0e7\">Reaction Diffusion Lamp<\/a><\/p>\n<div id=\"attachment_12613\" style=\"width: 1034px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-12613\" class=\"wp-image-12613 size-large lazyload\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" data-src=\"https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/Untitled1-1024x576.png\" alt=\"BeeGraphy TypeScript node with six ports for the reaction diffusion solver\" width=\"1024\" height=\"576\" data-sizes=\"auto\" data-srcset=\"https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/Untitled1-1024x576.png 1024w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/Untitled1-300x169.png 300w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/Untitled1-768x432.png 768w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/Untitled1-1536x864.png 1536w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/Untitled1-800x450.png 800w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/Untitled1-20x11.png 20w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/Untitled1.png 1920w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><p id=\"caption-attachment-12613\" class=\"wp-caption-text\">Six ports. Names must match the prompt exactly.<\/p><\/div>\n<h2 id=\"prompt\"><span class=\"ez-toc-section\" id=\"Get_the_free_AI_parametric_design_prompt\"><\/span>Get the free AI parametric design prompt<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>There is no magic one-shot prompt. Ours took ten rounds and three bugs the model found in its own work. But those rounds compress into a spec you can reuse.<\/p>\n<details class=\"code-dropdown\">\n<summary><strong>View PROMPT here<\/strong><\/summary>\n<pre><code>Write one TypeScript script node for BeeGraphy (browser parametric CAD, OCCT kernel). \r\n\r\n## Environment \u2014 tested, do not deviate - One bare async arrow fn: async ({ portA, portB }) =&gt; { ... }. async must be the FIRST character \u2014 no leading comment or blank line (the editor prepends return; ASI breaks it). No trailing semicolon. - No type aliases, no param type annotations (\"type is not defined\"). - No spread, ??, optional chaining, or .map() with complex arrows. Plain for loops. Nested function declarations, typed arrays, dynamic string keys are fine. - Port names are JS variables: valid identifiers, case-sensitive. Unconnected = null. - Return { type: Type.Curve, value, meta }; keys must match out-port names exactly. Points: new Vector([x, y, z]). - Curve methods are on the PROTOTYPE chain (getOwnPropertyNames won't find them) and accessors may return Promises \u2014 await every read and every builder call. - Curve: divideByCount, divideByLength, pointOnCurve, evaluateCurve, curveToPolyline, controlPoints, curveLength, getDividedSegments, startPoint, endPoint, isClosed. Builders: CurveBuilder.polyline, CurveBuilder.bSplineCurve \u2014 probe for anything else. \r\n\r\n## Task \u2014 corrugate a closed planar curve In: inputCurve (Curve), divisions (Number, 200), amplitude (Number, 5), smoothing (Number, 0), outputForm (Number, 1). Out: curves (Curve). Divide evenly; push each point along its own normal, alternating side by index parity. The normal comes from the chord between a point's two NEIGHBOURS, not from either adjacent segment. \r\n\r\n## Non-self-intersection \u2014 never, not \"usually\" Implement as growth, not offset-then-repair. Every point starts flat at scale 0 and advances to full amplitude in 20 equal increments; after each, rebuild the entire curve and scan for collisions. Any point in a collision rolls back one increment and freezes permanently. Each rib travels as far as it can and stops at contact. 1. Freeze ONLY points actually in contact. Freezing neighbours cascades along the curve and stalls everything in the first few steps. Widen to neighbours only when every contacting point is already frozen and there is nothing left to roll back. 2. Smoothing goes INSIDE the rebuild, or you verify one curve and ship another \u2014 Chaikin corner-cutting can land a cut across a segment the sharp version cleared. 3. Clamp offset toward the concave side to 0.8\u00d7 local radius of curvature (circumradius of three consecutive points). No clamp when moving away from the centre of curvature. 4. Reject an input that already self-intersects \u2014 say so rather than emit something broken. \r\n\r\n## Verification \u2014 show me the output, don't tell me it works - Brute-force O(n^2) segment intersection checker OUTSIDE the node. Different algorithm, no shared code. If the two disagree, the solver is wrong. - Fuzz harness: random closed curves from random radial harmonics, deliberately uneven sampling, random divisions\/amplitude\/smoothing. \u2265600 cases per seed, several seeds. Report every failing case. - Final de-looping backstop: cut at any surviving intersection, discard the smaller loop. Capped iteration is not a proof; this is. \r\n\r\n## Output form outputForm 1 \u2192 single-edge B-spline. (A polyline at 200 divisions with smoothing is thousands of edges; BRepFill_CompatibleWires can't reconcile that against a four-edge section and SurfaceBuilder.loft fails.) The guarantee is proved on the polyline, and the spline is a different curve that can bulge outside it \u2014 run a dense Catmull-Rom approximation of it through the same collision scan, and fall back to the polyline if it fails. \r\n\r\n## Performance - No O(n^2) scan per step: flat counting-sort grid over reused typed arrays. Not a plain object keyed \"gx_gy\" \u2014 that's a string concat, hash lookup and allocation per segment per cell. - Grid cell size bounded to \u2265100 cells across the bbox, or large amplitude buckets everything into one cell. - Try full amplitude ONCE before the growth loop; most curves have room everywhere. - Skip segments unmoved since the last clean scan. This breaks any adjacency test written b &lt;= a + 1, which assumes the scan visits every segment in order \u2014 measure separation properly in both directions or you silently stop testing real pairs. - Preallocate every buffer; the rebuild runs ~35\u00d7 per solve. \r\n\r\n## Diagnostics meta on the output, at minimum: selfIntersections (must be 0), averageReach and maxReach as fractions of requested amplitude, pointsOut, edgeCount, outputForm, amplitudeClamped, loopsRemoved, buildMethod. A bad result must be diagnosable from the numbers alone. \r\n\r\n## Port robustness The curve may arrive bare, array-wrapped, in a { value: ... } envelope, nested several levels, or as a Promise. Walk all of those recursively. Identify it by whether it exposes curve methods, not by guessing the wrapper shape. Accept a raw point list as fallback. On failure the error must say what actually arrived.<\/code><\/pre>\n<\/details>\n<p>&nbsp;<\/p>\n<p>Read its shape, not its words. A third is environment constraints. Another third is verification. The algorithm itself is eight lines, and there is almost no description of what the result should look like.<\/p>\n<div id=\"attachment_12612\" style=\"width: 1034px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-12612\" class=\"wp-image-12612 size-large lazyload\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" data-src=\"https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/Untitled-1024x576.png\" alt=\"AI parametric design in BeeGraphy: the TypeScript node editor, the node graph, and the ribbed lamp shade it produces\" width=\"1024\" height=\"576\" data-sizes=\"auto\" data-srcset=\"https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/Untitled-1024x576.png 1024w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/Untitled-300x169.png 300w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/Untitled-768x432.png 768w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/Untitled-1536x864.png 1536w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/Untitled-800x450.png 800w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/Untitled-20x11.png 20w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/Untitled.png 1920w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><p id=\"caption-attachment-12612\" class=\"wp-caption-text\">AI parametric design script node and node graph building a ribbed lamp shade in BeeGraphy<\/p><\/div>\n<p>Good AI parametric design prompts describe constraints, failure modes and proof. Swap the algorithm section for your own idea and the rest still works.<\/p>\n<h2 id=\"break\"><span class=\"ez-toc-section\" id=\"Now_go_break_it\"><\/span>Now go break it<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Run it on a non-circular base. Chain two nodes at different pattern scales. Push the amplitude until the solver fights back, then screenshot it.<\/p>\n<p>Post what you make and tag us. Post what you break, too.<\/p>\n<p>The whole build took an afternoon. Barely any of it was writing code. Almost all of it was working out what the code had to prove.<\/p>\n<p>&nbsp;<\/p>\n<p><iframe id=\"model-6a9e66edfa7b6021ebd8946b\" style=\"border: none; border-radius: 12px;\" src=\"https:\/\/beegraphy.com\/embed\/6a9e66edfa7b6021ebd8946b\" width=\"1210\" height=\"860\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n<h2 id=\"faq\"><span class=\"ez-toc-section\" id=\"AI_parametric_design_FAQ\"><\/span>AI parametric design FAQ<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><strong>Do I need to know how to code for AI parametric design?<\/strong><br \/>\nNot to write it. You need to read it and know what to ask for. Every decision that mattered here was design and verification, not syntax.<\/p>\n<p><strong>Why did the reaction diffusion code fail when the output looked correct?<\/strong><br \/>\nThe diffusion ratio was below the Turing threshold, so no pattern could form. The node was amplifying float rounding noise, and it looked convincing.<\/p>\n<p><strong>Can the output be manufactured?<\/strong><br \/>\nYes. That was the point. It is a clean closed planar curve with no self-intersections, so it offsets, lofts and exports like any other curve in BeeGraphy.<\/p>\n<p><strong>How do I stop AI parametric design geometry from self-intersecting?<\/strong><br \/>\nDo not ask the model to avoid it. Ask it to prove the output is clean, with a checker written separately from the solver, run across hundreds of randomized inputs.<\/p>\n<p><strong>Is the output reproducible?<\/strong><br \/>\nYes. The\u00a0<code>seed<\/code>\u00a0input makes the solver deterministic, so changing an unrelated slider will not reshuffle your pattern.<\/p>\n<p><strong>How fast is the node?<\/strong><br \/>\nTypically well under a second. The worst case we could construct runs in a few hundred milliseconds.<\/p>\n<p><strong>Does this work outside BeeGraphy?<\/strong><br \/>\nThe method transfers anywhere with a scripting node. Only the curve sampling and wire building use the\u00a0<a href=\"https:\/\/dev.opencascade.org\/\" target=\"_blank\" rel=\"noopener\">OpenCASCADE<\/a>\u00a0kernel bindings that BeeGraphy is built on.<\/p>\n<p>Want to get good at the part AI cannot do for you?\u00a0<a href=\"https:\/\/uni.xyz\/courses\/computational-design-101\" target=\"_blank\" rel=\"noopener\"><strong>CD101<\/strong><\/a>\u00a0teaches the computational design thinking behind every judgment call in this article.<\/p>\n<div id=\"attachment_12646\" style=\"width: 1594px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-12646\" class=\"wp-image-12646 size-full lazyload\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" data-src=\"https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/ChatGPT-Image-Sep-9-2026-03_11_26-PM-1.png\" alt=\"BeeGraphy Computational Design 101 online course banner featuring parametric architectural design and visual programming nodes.\" width=\"1584\" height=\"396\" data-sizes=\"auto\" data-srcset=\"https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/ChatGPT-Image-Sep-9-2026-03_11_26-PM-1.png 1584w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/ChatGPT-Image-Sep-9-2026-03_11_26-PM-1-300x75.png 300w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/ChatGPT-Image-Sep-9-2026-03_11_26-PM-1-1024x256.png 1024w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/ChatGPT-Image-Sep-9-2026-03_11_26-PM-1-768x192.png 768w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/ChatGPT-Image-Sep-9-2026-03_11_26-PM-1-1536x384.png 1536w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/ChatGPT-Image-Sep-9-2026-03_11_26-PM-1-800x200.png 800w, https:\/\/beegraphy.com\/blog\/wp-content\/uploads\/2026\/09\/ChatGPT-Image-Sep-9-2026-03_11_26-PM-1-20x5.png 20w\" sizes=\"(max-width: 1584px) 100vw, 1584px\" \/><p id=\"caption-attachment-12646\" class=\"wp-caption-text\">Computational Design 101 \u2014 Learn the fundamentals and build a parametric mindset with BeeGraphy.<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>AI parametric design turned reaction diffusion into curves you can build with. Here is the BeeGraphy node, a lamp made from it, and the free prompt. Why we wanted reaction diffusion for products Reaction diffusion is everywhere in computational design imagery and almost nowhere in computational design products. The reason is boring and practical. Most [&hellip;]<\/p>\n","protected":false},"author":23,"featured_media":12624,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"quote","meta":{"footnotes":""},"categories":[98,404,165,413,210,4,7,417],"tags":[508,506,109,90,72,36,505,507],"class_list":["post-12579","post","type-post","status-publish","format-quote","has-post-thumbnail","hentry","category-computational-design","category-design-community","category-design-innovation","category-design-thinking","category-generative-design","category-parametric-design","category-technology-trends","category-tutorials","tag-ai-code-generation","tag-ai-parametric-design","tag-beegraphy","tag-computational-design","tag-generative-design","tag-parametric-design","tag-reaction-diffusion","tag-typescript-scripting","post_format-post-format-quote"],"_links":{"self":[{"href":"https:\/\/beegraphy.com\/blog\/wp-json\/wp\/v2\/posts\/12579","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/beegraphy.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/beegraphy.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/beegraphy.com\/blog\/wp-json\/wp\/v2\/users\/23"}],"replies":[{"embeddable":true,"href":"https:\/\/beegraphy.com\/blog\/wp-json\/wp\/v2\/comments?post=12579"}],"version-history":[{"count":40,"href":"https:\/\/beegraphy.com\/blog\/wp-json\/wp\/v2\/posts\/12579\/revisions"}],"predecessor-version":[{"id":12654,"href":"https:\/\/beegraphy.com\/blog\/wp-json\/wp\/v2\/posts\/12579\/revisions\/12654"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/beegraphy.com\/blog\/wp-json\/wp\/v2\/media\/12624"}],"wp:attachment":[{"href":"https:\/\/beegraphy.com\/blog\/wp-json\/wp\/v2\/media?parent=12579"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/beegraphy.com\/blog\/wp-json\/wp\/v2\/categories?post=12579"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/beegraphy.com\/blog\/wp-json\/wp\/v2\/tags?post=12579"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}