JSL per allegare le immagini per questa animazione 4K 60 FPS.
I collegamenti contorti erano abbastanza semplici. Adesso penso alle trecce. C'è un gruppo di matematici a cui piacciono le trecce. Ho imparato quanto basta per essere pericoloso. Ecco un piccolo JSL per disegnare una treccia a cinque capi. Credo che tutte e tre le varianti nell'immagine seguente siano equivalenti .
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>
<P>The JSL is using <EM>canali</EM> A, B, C, D, E to refer to the straight horizontal rows and <EM>fili</EM> 1, 2, 3, 4, 5 to refer to the five colorful strings that dart back and forth between the channels, passing over/below another string. The three variations are defined by a pattern; the middle one is<CODE class=" language-jsl">
<CODE class=" language-jsl">drawpattern( {{"CB"}, {"AB", "ED"}, {"CD"}}, window:gb2 );
il che significa che i canali C e B scambiano i fili con il filo di C che passa sopra il filo di B. Quindi il canale A passa sopra B simultaneamente con il canale E che passa sopra D. Infine, scambia C e D, sempre con C sopra.
Colorful braids. The top one is smoothest.Trecce colorate. Quello superiore è il più liscio.
Se esegui il codice allegato, modifica AntiAlias = 4 in AntiAlias = 1 per eseguirlo più velocemente finché non desideri immagini di alta qualità.
Eleven strandsUndici fili