From 5bee4a16b2cbedad7cd357f33eb52617cd59f947 Mon Sep 17 00:00:00 2001
From: CrispyPin
-
+
A rule can also have cells containing a group. On the input side, that cell will match anything in the group, and on the output side it will become a random cell from the group. A diagonal line through the group icon means that it can also match on positions outside the world, where there are no cells.
-
+
On the output side, a cell can be set to copy the contents of one cell from the input side, this is useful for applying the same rule to several cell types without randomly swapping between them on the output
-
+
@@ -43,7 +43,7 @@ A rule can have blank cells. On the input side, this means it will matc
Let's say I make a rule for a little worm that moves to the right, this works fine. Its head disappears out of the world because the cell in front of the head in the input pattern is blank, which matches anything, including out of bounds. To make it stop just before the edge, you could set that rule cell to air.
-
+
Now if I want it to do the same thing in but to the left, I can simply draw the rule and worm in the other direction, right?
Almost. It no longer moves past the edge.
@@ -66,7 +66,7 @@ Once at the start, the engine checks every possible position and every rule, and
Now, how should it even use that information? The first thing I tried was to randomly pick one of all the matches. This kind of works but leads to the simulation speed being dependent on the number of matches, so for example sand falls slower if there is a lot of sand that hasn't landed yet.
-
+
I got a slightly more even result by multiplying the speed (number of rule executions per frame) by the total number of matches, but this is not a perfect solution as it does not take into account overlapping matches. A cell contained in several rule matches would be more likely to be affected, which in some cases can lead to weird bias (see just one more implementation)
@@ -80,7 +80,7 @@ So now the engine picks a random position, then checks the cache and picks a ran
I want to simulate a swarm of bees, so I create a rule for a bee moving by one cell, and enable rotate
so it works in all directions. That was easy,
-
+
Oh no, the swarm is moving toward the top left instead of spreading equally. But I can see that the bees move in all four directions, so the rule seems to be rotated correctly.
@@ -90,10 +90,14 @@ I was stuck on this problem for quite a while, and it only happened with the new
The movement rule has these variants:
-
+
+
Each rule has its origin point in the top-left cell.
In the diagram below, the bee would move left when the left (purple) cell is picked by the engine, and up when the top (green) cell is picked.
-
+
+
But to move right or down, it needs the bees own position to be picked by the engine, since the rules always extend right-down. That means when the engine picks the bee's position, there are two possible rules to execute. Therefore, moving right and down both have half the probability overall compared to moving up or left.
-
+
Now the bees are evenly distributed, just like real bees!(false)
@@ -114,7 +118,7 @@ Now the bees are evenly distributed, just like real bees!(false)
While I was trying to figure out the reason for the directional bias in the previous implementation, I realised that the overlap checker also has biases. The probability of any given cached match to be executed is dependent on its area, which is not very intuitive. Two objects of different mass fall at different speeds, and adding empty padding to a rule makes it run faster.
-
+
Ideally the red, pink and blue cells should all fall at around the same rate, but the red sand always lands first and the pink last.
@@ -125,7 +129,7 @@ Alright, the Final (I hope) implementation stores an origin offset for
If you somehow read through all that, congratulations I think? Now enjoy this fire:
-
+
Download the thing and make something fun: git.crispypin.cc/CrispyPin/snad
diff --git a/site/horological-crimes.html b/site/horological-crimes.html
index 0d41a0f..18d90e5 100644
--- a/site/horological-crimes.html
+++ b/site/horological-crimes.html
@@ -27,7 +27,7 @@ TODO front image
On a whim I decided to see if I could figure out what was wrong and attempt to fix it. How hard could that possibly be?
-
+
@@ -41,8 +41,8 @@ I stripped a short length of cable-tie into a 0.5mm diameter wire, bent it into
And to hold the wire in place, I used hot glue because I don't respect the Art of Watchmaking have anything better.
-
-
+
+
This seems to have worked pretty well as far as i can tell from winding up the clock and poking around. That gear is not moving sideways anymore and can rotate easily.
@@ -63,8 +63,8 @@ This is where I'm currently stuck, and most likely I'll abandon it forever. I do
I tried to create a part that would hold the thicker(0.5mm) part of the gear, just below the bearing, but it's too tight against the rest of the parts. I'm sure that's possible with better tools but i'm out here using a cable tie wire as a drill and a plastic scrap instead of brass. It was fun but ultimately too difficult with no good tools.
-
-
+
+
maybe one day i will ocme back to this project and fix it, maybe not. It was fun anyway
diff --git a/site/index.html b/site/index.html
index 61da491..ac4d38c 100644
--- a/site/index.html
+++ b/site/index.html
@@ -31,6 +31,7 @@ this means it is
- snad (cell thing)
- keyboar
- distracting
+- old projects
- todo: put more words in the computer
diff --git a/site/projects/fractal_tree.png b/site/projects/fractal_tree.png
new file mode 100644
index 0000000000000000000000000000000000000000..2c4442d5ded265afac8ac8facc782da558a8dcf2
GIT binary patch
literal 125633
zcmeFYWmg PsT83DP0xst( oP^0A%S;N?
zr*^+yuQ@fDf*)BYy5zdf{3zQr=Sv7sBtW#c$d>=E3^b4-?c9MXVj=j0wS2mKN^N|(
z+WhBwXVZy8dcz}0|B4UWI45?}`>WjsQI>75DKoRiVICW%O#WaxzE;JLo~dy=I%DqS
z=&06!P!-FfjixM#)|Q<08VLr_LQmC3ozL+&l8#gb+iKS;n?FXjzsVUXt);0gb7n5L
zLOMj&6QhL;sMzXiE=R^M)h|EOT==6d4FHj-CN^iEry=`9emx0=fG{VDB@bgxA&B3j
z_Ydn{6ZP69VSUs5(At4GX)1?>_{}VALIZe{^lZyg3jkKrqD-wL>7S?AIZu$0@kx4W
zLciFax6?xLHs{)A!Nzos$>~)ZB>1+F7O&KIN92;(SojdMp)hq(Afq7me_ofbKNbKi
zUv*w7@^uwy+-b8~!x4*+2nc{Ki{E!Tx4B*ufgIRv4fnM*{2$b3v;6f!PKPn;or|U6
z1lag^@XcBDb4<3JcC7-OAn%zR`1l`?3jm)a769*;oFrn U2=4DU5MW|1}&MH1tD#PuF>8FaUm_
z&-m*u(Q(J>GbBQfYA{XEa=oF;6qwFNWgACQ_$U$p;_odRUBmH~Bk3~n*3x~m*P?R9
zKfnMd5zxABf)*iHo6^!-0tU{Am4PZQ0QL+GmOU;=6B5OfV{1*Xd)*>y#35U%Uf)oC
zUZ_J5I?&*)5Q`rIf=mlT$}caog-J9^4ZH~Fj6XTLed|Y~t+sizhj5p3)uDmt`2GQSNsx$i*|RGk
zdsZ(vW4-f4(ex}&I3oF!%ph;ys2W>u<^%vs6MmW+L_glpX;^iRgHVw3y+H6a-wwud
zgVM1K#U0}sBy7a-6X42hF_gmHWN7$kA$Gs%LIJ&5v_I--(>c2W2VSiKXu52W7xo*M
zc)m!1C;+VLtT3EwT$J8lW67mX-sqI9_|21*KlK3-z*TXRB+8@ud(d
zbG+_bl3@@{Eq00Qx?@hoS1f~@1eWOL168->V#$Z{fSq1fAFu`pbl8E)a8c@|m`jogv8hmabScx_R$=qpLO;a$vH)
ziZ=e?+c%8vy5kg$e6orfe&`JuH)Gyao3b)7j{Wl>D2HuqIY>UC->*^Iyhr2y9?jW@
zop5@yOx$_g2RZ@He_iq~9i=~WXB_yB;WI4&%+frlJ6A}U6*WFTR)EOLh&6H>y|VV0
zc#R?)m)m_t*E~-x6J}$y>y|4*91*T}S7~LjY^$TGrdR_m;WT?&qjqPSctNRs4OU5z5PM_hkL{%o6};$yqXg*E9(5OM!H+
zTAB`JPkg-}ph*+l$pY>TXfR`jH%XI$H>5$4B>Ay8d;E`R7}_RWzJaimFJr{J4#})F
zLH^BTeb6;$XrjVt_MgFm&9X-4xhcQAm-q(uLuc>9s750`NN!w811EtGlS6S2<