JSL pour réaliser les images de cette animation 4K 60 FPS ci-jointe.
Les liens tordus étaient assez simples. Maintenant, je pense aux tresses. Il y a un groupe une bande de mathématiciens qui aiment les tresses. J'en ai appris juste assez pour être dangereux. Voici un petit JSL pour dessiner une tresse à cinq brins. Je crois que les trois variantes de l'image ci-dessous sont équivalent .
drawpattern = Function( {pattern, gb},
channelToYPos = ["A" => 1, "B" => 2, "C" => 3, "D" => 4, "E" => 5]; // static
channelToStrandID = ["A" => 1, "B" => 2, "C" => 3, "D" => 4, "E" => 5]; // braiding swaps these around
strandIDToColor = Heat Color( (1 :: 5) / 6, "jet" );
erasecolor = gb[Framebox( 1 )] << getbackgroundcolor;
xleft = 1;
xstep = 1 / N Items( pattern );
circlesize = .20;
pensize = 15;
For( x = 1, x <= 10, x += 1,
For Each( {row}, pattern,
notfound = Associative Array( channelToYPos << getkeys );
For Each( {swapchans}, row,
channel_over = Substr( swapchans, 1, 1 );
channel_under = Substr( swapchans, 2, 1 );
// get Y positions of the two adjacent channels that will swap strands...
channel_over_ypos = channelToYPos[channel_over];
channel_under_ypos = channelToYPos[channel_under];
// get the strand ids currently in those channels
channel_over_StrandID = channelToStrandID[channel_over];
channel_under_StrandID = channelToStrandID[channel_under];
// get the colors of the strand ids
channel_over_Color = strandIDToColor[channel_over_StrandID];
channel_under_Color = strandIDToColor[channel_under_StrandID];
// render this swap
Pen Size( pensize );
Pen Color( channel_under_Color );
Line( {xleft, channel_under_ypos}, {xleft + xstep, channel_over_ypos} ); // draw under first
Fill Color( channel_under_Color );
Circle( {xleft, channel_under_ypos}, circlesize, "FILL" );
Pen Size( pensize * 2 - 1 );// erase a wider line before drawing to make the
Pen Color( erasecolor ); // overpass effect...
Line( {xleft, channel_over_ypos}, {xleft + xstep, channel_under_ypos} ); // draw over last, erase wider
Pen Size( pensize );
Pen Color( channel_over_Color );
Line( {xleft, channel_over_ypos}, {xleft + xstep, channel_under_ypos} ); // draw over last, within erased
Fill Color( channel_over_Color );
Circle( {xleft, channel_over_ypos}, circlesize, "FILL" );
// swap
channelToStrandID[channel_over] = channel_under_StrandID;
channelToStrandID[channel_under] = channel_over_StrandID;
notfound[channel_over] = 0;
notfound[channel_under] = 0;
);
For Each( {chan}, notfound,
ypos = channelToYPos[chan];
strandID = channelToStrandID[chan];
color = strandIDToColor[strandID];
Pen Size( pensize );
Pen Color( color );
Line( {xleft, ypos}, {xleft + xstep, ypos} ); // draw uncrossed strand
Fill Color( color );
Circle( {xleft, ypos}, circlesize, "FILL" );
);
xleft += xstep;
)
);
// endcaps, just for pretty
For Each( {chan, ypos}, channelToYPos,
strandID = channelToStrandID[chan];
color = strandIDToColor[strandID];
Fill Color( color );
Circle( {xleft, ypos}, circlesize, "FILL" );
);
);
New Window( "braidtest",
V List Box(
window:gb1 = Graph Box(
X Scale( 0, 12 ),
Y Scale( 0, 6 ),
framesize( 1800, 300 ),
xname( "" ),
yname( "" ),
suppressaxes,
<<BACKGROUNDCOLOR></BACKGROUNDCOLOR>
Le JSL utilise chaînes A, B, C, D, E pour désigner les rangées horizontales droites et brins 1, 2, 3, 4, 5 pour faire référence aux cinq cordes colorées qui vont et viennent entre les canaux, passant au-dessus/en dessous d'une autre corde. Les trois variantes sont définies par un motif ; celui du milieu est</CODE></P>
<PRE><CODE class=" language-jsl">drawpattern( {{"CB"}, {"AB", "ED"}, {"CD"}}, window:gb2 );
ce qui signifie que les canaux C et B échangent les brins, le brin de C passant par-dessus le brin de B. Ensuite, le canal A passe au-dessus de B simultanément et le canal E passe au-dessus de D. Enfin, échangez C et D, toujours avec C au-dessus.
Colorful braids. The top one is smoothest.Colorful braids. The top one is smoothest.Colorful braids. The top one is smoothest.Colorful braids. The top one is smoothest.Tresses colorées. Celui du haut est le plus lisse.
Si vous exécutez le code ci-joint, remplacez AntiAlias = 4 par AntiAlias = 1 pour l'exécuter plus rapidement jusqu'à ce que vous souhaitiez des images de haute qualité.
Eleven strandsEleven strandsEleven strandsEleven strandsOnze brins