
This is the output of a kinematic model designed to calculate the migration rate as a function of curvature, intended to simulate the behavior of a meandering river. Its visual appearance, however, bears a striking resemblance to Geometric Abstraction, characterized by curvature, symmetry, and vibrant gradient colors. The smooth transitions between hues create a dynamic, almost fluid quality, evoking a strong sense of motion and energy.

This is purely unphysical (the lines are crossing over, which real rivers cannot do, so they connect, creating cutoffs), and it looks chaotic.

When they connect, it indeed does resemble the river migration pattern.
Creating these is simple — just install Meanderpy with pip install meanderpy, and the code to generate them is provided below. The cutoff parameter is crdist, the friction coefficient (which controls the river’s wiggliness) is Cfs, and the migration rate is kl.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.cm as cm
amplitude = 50
wavelength = 1000
n_points = 500
x = np.linspace(0, wavelength * 5, n_points)
y = amplitude * np.sin((2 * np.pi / wavelength) * x)
z = np.zeros_like(x)
nit = 1000
W = 100.0
D = 5.0
depths = D * np.ones((nit,))
pad = 0
deltas = 25.0
Cfs = 0.05 * np.ones((nit,))
crdist = 0.1 * W
kl = 500 / (365 * 24 * 60 * 60.0)
kv = 1.0e-12
dt = 0.01 * (365 * 24 * 60 * 60.0)
dens = 1000
saved_ts = 1
Sl = 0.0
t1 = 0
t2 = 0
t3 = 0
aggr_factor = 2e-9
sc = 1.0
H = depths[0]
ch = mp.Channel(x, y, z, W, H)
chb = mp.ChannelBelt(channels=[ch], cutoffs=[], cl_times=[0.0], cutoff_times=[])
chb.migrate(nit, saved_ts, deltas, pad, crdist, depths, Cfs, kl, kv, dt, dens, t1, t2, t3, aggr_factor)
channel_coordinates = pd.DataFrame({
"x": chb.channels[nit - 1].x,
"y": chb.channels[nit - 1].y,
"z": chb.channels[nit - 1].z
})
cmap = cm.Spectral
norm = plt.Normalize(vmin=0, vmax=nit)
plt.figure(figsize=(16, 9))
for i in range(10, nit, 1):
x = np.array(chb.channels[i].x)
y = np.array(chb.channels[i].y)
plt.plot(x, y, color=cmap(norm(i)), alpha=1, lw=1)
plt.axis("off")
plt.show()
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.cm as cm
cmap = cm.Spectral
norm = plt.Normalize(vmin=0, vmax=nit)
plt.figure(figsize=(16, 9))
for i in range(10, nit, 1):
x = np.array(chb.channels[i].x)
y = np.array(chb.channels[i].y)
plt.plot(x,y, color=cmap(norm(i)), alpha=1, lw=1)
plt.axis("off")
plt.show()