These curves are defined by the following variation of the Serret-Frenet ODE:

T'(t) = kappa*vel(t)*N(t),

N'(t) = -kappa*vel(t)*T(t) + kappa/vel(t)*(T(t) x N(t)).

The velocity function vel(t) satisfies

vel(t+pi) = 1/vel(t). It is constructed from a function

h(t) = a1*sin(t) + a3*sin(3t) as

vel(t) = sqrt(1 + h^2(t)) - h(t).

For more freedom we scale t := fr*t. This parameter is redundant, by changing all the others one can achieve the same.

T'(t) = kappa*vel(t)*N(t),

N'(t) = -kappa*vel(t)*T(t) + kappa/vel(t)*(T(t) x N(t)).

The velocity function vel(t) satisfies

vel(t+pi) = 1/vel(t). It is constructed from a function

h(t) = a1*sin(t) + a3*sin(3t) as

vel(t) = sqrt(1 + h^2(t)) - h(t).

For more freedom we scale t := fr*t. This parameter is redundant, by changing all the others one can achieve the same.

When Ekkehard-H. Tjaden saw these
closed constant curvature space curves,
he suggested to look for examples which are congruent to their evolutes. Since this property is
difficult to decide from the standard Frenet-Serret ODEs, he suggested the modification to the right.
This ODE has the property that the curve on [0, pi] is congruent to the evolute on [pi, 2pi] and
vice versa. The ODE-solutions have still the same rotation symmetries around the indicated principal
normals, which we used for constant curvature space curves without extra evolute conditions. We find
closed examples by always making the symmetry normals coplanar, which implies that they all intersect
in one point; the other parameters suffice to make the angle between adjacent symmetry normals rational
(p/q*pi) so that the solution curves close. - There are two cases: if the curve and its evolute are two
congruent closed curves, we call them a Tjaden pair (turn on "Normals to Evolute")
and if the curve is its own evolute we call it a ccc-autoevolute.
See: ccc-Autoevolute.

All parameters can be changed independently and if the corresponding solution curve has its symmetry normals so close that they can be made coplanar by slightly changing the first parameter kappa , then the program adjusts kappa. (The console has more details.) Note: If the symmetry normals are parallel there is no signed distance between them and the distance function whose zero we are looking for returns "Not a Number" = NaN. Therefore we cannot always find a zero between a positive and a negative value.-- Here is a list of examples (copy a1, a3 first, kappa last):

All parameters can be changed independently and if the corresponding solution curve has its symmetry normals so close that they can be made coplanar by slightly changing the first parameter kappa , then the program adjusts kappa. (The console has more details.) Note: If the symmetry normals are parallel there is no signed distance between them and the distance function whose zero we are looking for returns "Not a Number" = NaN. Therefore we cannot always find a zero between a positive and a negative value.-- Here is a list of examples (copy a1, a3 first, kappa last):

kappa: | 0.5993, | 1.675, | 1.022, | 0.9413, | 0.6526, | 0.9707, | 1.3703, | 0.5386, | 1.65, | 0.6493, | 1.527, | 1.0818, | 1.5696, | 2.6929, | 2.8702, | 2.602, | 2.525, |

a1: | 1.5618, | 0.7238, | 1.2444, | 1.2439, | 0.8551, | 2.3695, | 1.2699, | 2.1199, | 0.716, | 0.614, | 0.8847, | 1.9439, | 0.9374, | 1.5045, | 1.5045, | 1.755, | 1.7978, |

a3: | -0.5206, | 0.6716, | -2.1667, | -2.581, | -0.5073, | -0.8647, | 0.2991, | -0.3854, | -0.614, | -0.614, | -0.6478, | -0.6478, | 0.1875, | 0.5015, | -0.5015, | -0.6178, | -0.0918, |