Real railroads don't use curves of constant radius from beginning to end because it creates abrupt changes of curvature, leading to theoretically infinite jerk. Instead, track transition curves are preferred, with the Euler spiral being the classic "ideal" example (although technically speaking it is not actually ideal for reasons I won't go into in this post). However, it appears that this practice is almost unheard-of in LEGO trains, with even clubs with high resources building large layouts seemingly relying on constant-radius curves everywhere.
I find this dissatisfactory and decided to do something about it. I developed a calculator for laying out custom combinations of curved track in increments of 5.625 degrees (16 segments per 90 degrees) and determining where the resulting curve ends up, with the end goal of producing curves that match the existing standard curves in net radius, even though the individual components have differing radii. This makes it easy to develop and verify custom curves with proper transitions.
Curve calculator (.ods format; it might be compatible with Microsoft Excel but if you're having problems, LibreOffice is free, requires no account, and doesn't spy on you)
The calculator is operated by inputting the radius of each 5.625 degree segment in the corresponding field F2 to F17. When working with smaller-radius tracks you need to fill in a number of fields that matches the length of the curve piece you're using; for pieces of 11.25 degrees you need to fill in 2 fields (for example, the "56" in F4-F5), and for 22.5 degree pieces fill in 4 sequential fields (for example, the "40" in F6-F9). By default fields F10-F17 will mirror the contents of F9-F2, producing symmetric 90-degree curves. To calculate curves other than 90 degrees, you can override these values with your own input.
The "Total" fields I19 and J19 show the total length of the curve on the X-axis and the Y-axis respectively, measured in studs. If the curve is symmetric, these values should be the same. If this value is very close to a standard curve radius (e.g. 72.01) you should be able to substitute the curve specified in F2-F17 for a curve of that radius with no problems. If the value differs from a standard radius it requires an offset, which equals the amount of straight track that needs to be added to the ends of the curve to line it up with the matching standard radius (in the example picture, the curve has a net radius of 64.07 meaning that a 8 studs long straight track at each end lines it up with a standard R72 curve).
Below the calculator is the visualiser graph. This plots the length of the used segments on the X-axis, and the curvature (the inverse of the radius; the smaller the radius the higher the curvature i.e. the tighter the curve) on the Y-axis. An ideal Euler spiral would look like a triangle or a trapezoid. As we are dealing with track pieces of specific lengths and radiuses, we always get a stepped graph instead, but if the stepped line on the visualiser is close to a consistent diagonal the curve is a decent approximation of the Euler spiral. As we can see in the example, the graph is pretty close to a trapezoid with a short top, meaning that the curve achieves close to ideal transitions. A standard curve of constant radius looks like a rectangle.
If you want to use the calculator for curves that aren't 90 degrees, you can replace the segments you aren't using with segments of the net radius you're aiming for. For example, to calculate a Rn104 curve of 67.5 degrees, you can set F14-F17 at 104 and build your curve in the remaining fields F2-F13. This makes the offsets slightly harder to calculate, but if you manage to get close enough to the target net radius it won't matter.
At the right side of the sheet I have recorded a number of curves I've found using the tool, with the example curve being called 72sb2o8.
The "72" stands for the net radius, meaning that this curve is what I call an Rn72 curve, i.e. it can substitute a R72 standard curve.
The "sb" is the identifier of the curve's family and variant; I have a number of different families of curves with identical or related profiles, each with a letter code. This curve belongs to the S family, which is notable for being close to Euler spirals, and is specifically the variant Sb. Curves with the same identifier have an equal profile, meaning that their segments have the same relation to the net radius. For example, Sb starts with one segment of 7 steps (112 studs) greater radius than the net, then one segment of 1 step (16 studs) greater than Rn, then 2 segments of 1 step smaller, and finally 4 segments of 2 steps smaller than Rn before being mirrored on the other end. A hypothetical curve 88sb2o8 would start with 1x R200, then 1x R104, then 2x R72, then 4x R56 and mirrored, with each segment having a 16 stud larger radius than in 72sb2o8.
The "2" stands for the apex tightness; the curve is R40 at its tightest, which is 2 steps smaller than Rn72. If the apex was R56 instead, this number would be 1, and so on.
Finally, the "o8" stands for the required straight offset. Adding a straight track piece of 8 studs brings the curve to the net radius value of 72. If the offset code is o1 it means that 1 stud of straight track is required. On some curves the offset is denoted with an X instead of an O. This means the offset is negative; instead of adding a straight track section the adjacent straight has to be shorter by the corresponding value. For example a curve with x2 needs to be paired with 14 studs long straight sections at each end to fit in its net radius. This is a lot more inconvenient, so I've generally avoided those curves. If no offset is needed, this code is absent.
Thus, we get the full code 72 (net radius) sb (family and variant) 2 (tightness) o8 (offset). Other example codes are 120b1 (net radius = Rn120, curve family B main profile, tightness of 1 i.e. the apex of the curve is R104, no offset required) and 168dc1x1 (net radius = Rn168, family D variant Dc, tightness 1 = apex R152, and negative offset of 1).
In addition to 90-degree curves, I've developed some 45-degree, 22.5-degree, and 180-degree curves.
I have also created a BlueBrick file visualising a number of the curve families I've created, with the different radius versions laid out next to each other with some comments about the family:
(example image, the actual file contains significantly more curve families)
BlueBrick file
Because BlueBrick doesn't have the full portfolio of available track pieces some families do not have all of their curves represented, but most curves of most families are.
The weird code under the profile family name is the profile specification; each number of letter denotes one 1/16th of a 90-degree curve segment, with 0 meaning a segment of the same radius as the net radius of the curve, positive numbers meaning a larger radius, and letters meaning a smaller radius; for example on a Rn72 curve 4-11-aaaaa+ means 1x R136, 2x R88, 5x R56, then mirrored (the "+" sign at the end). The value after the slash is the error in studs; a single slash like "/0.4" means the error is in the positive offset direction and a double slash "//0.4" means it is in the negative offset direction.
I haven't tested these curves physically yet, and I don't have the space for a large layout, but at least visually and in theory they seem significantly improved over the constant-radius standard curves, in both aesthetics and running qualities.
I developed the curves and the theory on my own, after finding no existing information on LEGO track transition curves. After hours of looking if anyone else has tried this, I managed to dig up a Flickr post from 8 years ago and the 2021 Fx Bricks track reference with some prior art, but Michael Gale's curves mix straight pieces with curves, creating exactly the abrupt changes in curvature that I wanted to avoid, and FX bricks only has one curve which I consider suitable for 180 degrees when doubled (the R56 end has an abrupt curvature change when used as a 90-degree curve), which has a slightly different profile to my U and V curve families.