TRACK CYCLING - credits, sources, and the provenance of every constant ================================================================================================ WHAT THIS IS An independent browser reimplementation of track cycling on a 250 m velodrome. Track cycling is a sport, not a game somebody published, so there is no original author, year or publisher to credit for a design. What there IS to credit is the physics and the regulations, and all of it is below with a URL. This app is not affiliated with, endorsed by, or connected to the Union Cycliste Internationale, any national federation, any velodrome, any team, or any rider or researcher named here. ------------------------------------------------------------------------------------------------ 1. THE BALANCE MODEL - the part that is somebody else's work [BENCH] J. P. Meijaard, Jim M. Papadopoulos, Andy Ruina and A. L. Schwab, "Linearized dynamics equations for the balance and steer of a bicycle: a benchmark and review", Proceedings of the Royal Society A 463 (2084), 1955-1982 (2007). doi:10.1098/rspa.2007.1857 PDF read for this build: http://bicycle.tudelft.nl/schwab/Publications/meijaard2007linearized.pdf sha256 506d04ffc04052954d35a3aec0a21e904c0bb88b7170af4a1c41c1eeda9fb19c js/whipple.js is a line-by-line transcription of that paper's appendix A. Every line carries the paper's own equation number. The paper's table 1 (the benchmark machine), equations 6.1-6.4 (its M, K0, K2 and C1 to fourteen decimals) and table 2 (its eigenvalues to fourteen decimals) are all in tools-harness.js as assertions. Reproduced by this build: - all 16 published matrix entries, worst error 1.4e-14 - all 44 published eigenvalue figures at v = 0..10 m/s, worst error 6.1e-13 - weave speed 4.292 382 536 341 m/s (paper: 4.292 382 536 341 11) - capsize speed 6.024 262 015 388 m/s (paper: 6.024 262 015 388 37) - double root 0.684 283 078 892 m/s (paper: 0.684 283 078 892 46) [TMS] J. D. G. Kooijman, J. P. Meijaard, Jim M. Papadopoulos, Andy Ruina and A. L. Schwab, "A bicycle can be self-stable without gyroscopic or caster effects", Science 332, 339-342 (2011). doi:10.1126/science.1201959 Supplementary material read for this build: http://ruina.tam.cornell.edu/research/topics/bicycle_mechanics/stablebicycle/1201959SOMtext.pdf sha256 43a89d88cff6102c4030a185f5e7a26a843ad4f9098eaba162128a01cc537b13 Its chapter 7 derives M, C1, K0 and K2 for a two-mass-skate bicycle in CLOSED FORM in six parameters, by a route that shares nothing with appendix A of [BENCH]. Feeding the same machine through this engine's general 25-parameter code reproduces all sixteen entries BIT FOR BIT, and reproduces the paper's eight printed Routh polynomial coefficients to every printed digit. That is the independent oracle: two papers, two derivations, one answer. TWO FINDINGS ABOUT THIS PAPER, reported because they are findings and not complaints: (a) Its figure 7.2b's numbers only come out with g = 9.80665 (standard gravity), not with the g = 9.81 its sibling paper's table 1 uses. With 9.81 the three gravity-bearing coefficients are 0.035 % high and X2, which carries g squared, is 0.07 % high. The paper does not state which g it used. (b) Its equation (7.5) prints E0 = -g mH uH^2 (mH (xH - w) cos(lam_s) + mB zB sin(lam_s)) but E0 is the constant term of det(g K0 + v^2 K2), which for the paper's own equation (7.3) is E0 = -g^2 mH uH (mH uH + sin(lam_s)(mB zB + mH zH)). The two bracketed factors are algebraically identical; the printed prefactor g*uH^2 should read g^2*uH. The paper's own plotted value, 1.1808, matches the corrected form (1.18083 at g = 9.80665) and is 263 times the printed one (0.00450), so the slip is in the formula and not in the number. tools-harness.js asserts all of this. [BOS] F. Bos, M. Slawinski, R. Slawinski and T. Stanoev, "On modelling bicycle power-meter measurements" / velodrome track model, Sports Engineering (2024), doi:10.1007/s12283-024-00451-x, preprint https://arxiv.org/pdf/2201.06788 Appendix B derives the velodrome lean angle from scratch: lean from the VERTICAL is arctan(V^2/(g r)) and does not depend on the banking angle at all. This engine gets its trim lean from a completely different place - the first column of the benchmark K0 matrix, via a generalised-force argument - and the two agree to 1e-15 at every point on the track. ------------------------------------------------------------------------------------------------ 2. THE VENUE AND THE RULES [UCI] UCI Cycling Regulations, Part 3 "Track Races", version of 01.01.2026. https://assets.ctfassets.net/761l7gh5x5an/7IE4WjTvQLqeRF5aniDP34/ffccabbbc5b69d25994a5f656ecb2225/PART_3_E_-_As_of_01.01.2026.pdf Landing page: https://www.uci.org/regulations/3MyLDDrwJCJJ0BGGOFzOat [UCI1] UCI Cycling Regulations, Part 1 "General Organisation", version of 01.07.2026. https://assets.ctfassets.net/761l7gh5x5an/MiBPXV3F9Y4jGKqffTUNr/4783235017d89743df0411995d198784/1-GEN-20260701-E.pdf Used here: 3.6.068 (250 m for Worlds and the Olympics), 3.6.069 and 3.6.079 (length measured 20 cm from the inner edge), 3.6.067 (two bends joined by two parallel straights, gradual transitions, and the banking "determined by taking into account the radius of the bends and the maximum speeds"), 3.6.070-3.6.073 (width, blue band at >= 10 % of the width, safety zone, and the requirement that a cross section of the surface be a STRAIGHT LINE), 3.6.078-3.6.084 (line widths, measuring / sprinters' / stayers' lines, the finish line in its 72 cm white band towards the end of a straight, the 200 m line, the 4 m pursuit lines at the exact midpoint of each straight), 3.6.095 (7-8 m width and 19-25 m bend radius for a 250 m track), 3.2.022 and 3.2.025 (the flying 200 and its 3.5-lap run-up), 3.2.035 (three laps on tracks under 333.33 m), 3.2.039 (walking pace), 3.2.043-3.2.045 (the sprinters' lane), 3.2.052 (4 km individual pursuit for men AND women - the women's distance moved from 3 km in 2025), 3.2.134-3.2.137 (keirin: six laps on a 250 m track, pacer from 30 to 50 km/h leaving with three laps to go), and 1.3.025 (no freewheels, no multiple gears, no brakes). WHAT THE UCI DOES NOT SAY, and this app says so in Help rather than implying otherwise: - It mandates NO banking angle, in degrees or by formula. The 42 deg bends and 12 deg straights here are the figures the UCI itself published for the Rio 2016 Olympic velodrome (https://www.uci.org/article/a-guide-to-cycling-at-rio-2016-178106/7ncYQCIDFKRimUbXzBA6Fy), and the same pair is published for Lee Valley (https://plus.maths.org/content/leaning-2012). Other 250 m tracks are measured at 45 deg (Saint-Quentin-en-Yvelines), 43.9 deg (Anna Meares), 42 deg (Milton). - It specifies no transition-curve type, length or tolerance. The 12 m polynomial easement here is this app's choice. - It sets no gear-ratio or rollout limit for elite track racing. - "Sprinters' lane" is used eleven times in part 3 and never formally defined; the usual reading, the strip between the measuring line and the sprinters' line, is convention rather than regulation. - No velodrome, architect or organising committee publishes a bend RADIUS. The 22 m used here is simply inside the regulatory 19-25 m band. The colloquial "cote d'azur" for the blue band appears nowhere in the regulations. ------------------------------------------------------------------------------------------------ 3. GOING FORWARDS - drag, rolling, drafting, power [M2006] J. C. Martin, A. S. Gardner, M. Barras and D. T. Martin, "Modeling sprint cycling using field-derived parameters and forward integration", Med Sci Sports Exerc 38(3):592-597 (2006). doi:10.1249/01.mss.0000193560.34022.04 PMID 16540850 Drag area of three world-class track sprinters, measured on a 250 m velodrome: 0.245 +/- 0.044 m^2 seated, 0.304 +/- 0.055 m^2 standing. Global rolling coefficient on the same track, 0.0025 +/- 0.001, including wheel-bearing friction and tyre scrub on the banking. Peak power in standing starts 1377-2517 W. Both figures are used directly. [M1998] J. C. Martin, D. L. Milliken, J. E. Cobb, K. L. McFadden and A. R. Coggan, "Validation of a mathematical model for road cycling power", J Appl Biomech 14:276-291 (1998). Chain-drive efficiency 97.698 %, which is the value used here. No bench measurement of a fixed-gear TRACK drivetrain appears to exist. [UND] L. Underwood, "Aerodynamics of Track Cycling", PhD thesis, University of Canterbury (2012). https://ir.canterbury.ac.nz/handle/10092/7804 Drag area 0.172-0.210 m^2 for eleven elite individual pursuiters. [BARRY] N. Barry, D. Burton, J. Sheridan, M. Thompson and N. A. T. Brown, "Aerodynamic drag interactions between cyclists in a team pursuit", Sports Engineering 18(2):93-103 (2015). doi:10.1007/s12283-015-0172-8 Wind tunnel, four elite track riders, 120 mm wheel gap: mean drag saving 5 / 45 / 55 / 57 % in positions 1 / 2 / 3 / 4. The 45 % is this app's two-rider drafting figure. [BLOCK] B. Blocken, T. Defraeye, E. Koninckx, J. Carmeliet and P. Hespel, "CFD simulations of the aerodynamic drag of two drafting cyclists", Computers & Fluids 71:435-445 (2013). doi:10.1016/j.compfluid.2012.11.012 The LEADING rider's drag falls by up to 2.6 % because of the rider behind - confirmed in a wind tunnel at 1.6 %. Kyle (1979) and McCole et al. (1990) looked for this effect and found nothing; it was only established from 2013 onwards. [ZDRA] M. M. Zdravkovich et al. (1996), as reported by [UND] and [BLOCK]: 49 % drag reduction directly behind, falling to 37 % at a 0.10 m lateral offset and dropping abruptly beyond 20-30 cm. The lateral falloff here is fitted to that 37/49 ratio. [DOREL] S. Dorel et al., "Torque and power-velocity relationships in cycling: relevance to track sprint performance in world-class cyclists", Int J Sports Med 26(9):739-746 (2005). Optimal cadence 129.8 +/- 4.7 rpm in twelve world-class track sprinters. The engine's maximum cadence is exactly twice that, because a linear force-velocity relation puts peak power at half the maximum rate. [GARD] A. S. Gardner, J. C. Martin, D. T. Martin, M. Barras and D. G. Jenkins, "Maximal torque- and power-pedalling rate relationships for elite sprint cyclists in laboratory and field tests", Eur J Appl Physiol 101(3):287-292 (2007). Seven male elite track cyclists, 86.2 +/- 6.1 kg, maximum power 1791 +/- 169 W at 128-129 rpm, laboratory and field agreeing to within 1 W. This is the sprinter archetype. [PUGH] C. F. Pugh et al., "Critical power and W' in elite track cyclists", Int J Sports Perform 17(11):1606-1613 (2022). International team-pursuit squad, 74.2 kg: critical power 407 +/- 4 W, W' 27.2 +/- 2.8 kJ, four-minute power 523 +/- 13 W. This is the pursuiter. Note Bartram et al. (Int J Sports Physiol Perform 12(6):783, 2017) showed W' depends enormously on the protocol - the same athletes give 24.3 kJ one way and 15.5 kJ another - so a W' quoted without its protocol means little. [JONES] C. Jones et al., Eur J Sport Sci (2024), doi:10.1002/ejsc.12195. Air density measured inside the National Cycling Centre, Manchester (250 m indoor): 1.179 kg/m^3 at 26.3 C. Saint-Quentin-en-Yvelines has been measured at 1.140-1.157, Grenchen at 1.12-1.14. [FITZ] K. Fitzgerald et al., "Measurement of the roll angle of a track cycling bicycle", Scientific Reports 12:11356 (2022). doi:10.1038/s41598-022-15384-3 The only published in-velodrome roll-angle measurement found. Also: wheel distance per "250 m" lap rises from 252.0 m at 10 m/s to 253.8 m at 19 m/s, and riders go higher on the straights to manage ROLL RATE rather than for speed. [BENH] G. P. Benham, C. Cohen, E. Brunet and C. Clanet, "Brachistochrone on a velodrome", Proc. R. Soc. A 476:20200153 (2020). https://arxiv.org/pdf/1908.02224 The one published treatment of the racing line: athletes wind up high, descend once into the last lap of a flying 200, and then hug the black line. Also the measured banking of Saint-Quentin-en-Yvelines, 14 deg on the straights to 45 deg in the bends. [RECS] UCI record histories (men 10 Feb 2026, women 28 Jul 2026), used only to sanity-check that the simulated times land in the real range: flying 200 m men 8.857 s (Matthew Richardson, Konya, 15/08/2025); individual pursuit men 3:59.153 (Jonathan Milan). ------------------------------------------------------------------------------------------------ 4. THE PROVENANCE TALLY Every constant in the engine carries one of five tags in its source comment, and the tag appears beside the constant and nowhere else, so these counts can be checked by grepping the shipped files. tools-harness-page.js does exactly that and fails if the numbers below, or the ones in the in-app Help panel, have drifted. DOCUMENTED 21 a named source states this value; the source is above MEASURED 0 read off a source's figure rather than its prose - none was needed DERIVED 1 follows from documented facts, with the derivation in the comment CALIBRATED 3 chosen so the model reproduces a documented OUTCOME, which is named RECONSTRUCTED 36 nobody published it. This app's own choice. ------------------------------ total 61 The DERIVED one is the crash threshold: a bicycle's contact force must point from the tyre at the centre of mass, so friction over normal load is the tangent of the lean off the surface normal - and the LINEARISED lean variable of the benchmark equations is exactly that tangent (on a straight banked at theta the trim lean comes out as tan(theta) to fifteen decimals). So the machine goes down precisely when |lean| exceeds the friction coefficient, and LEAN_MAX is set equal to MU. The three CALIBRATED ones are the tyre friction coefficient (set to 1.0 because sprinters do hold a track stand on 42 degree banking, which needs mu >= tan 42 deg = 0.900, and because they do slide if they hold it badly), the lateral falloff of the draft (fitted to [ZDRA]'s 37 % at 0.10 m against 49 % square behind), and the rolling-resistance treatment riding on the normal load rather than the weight. The RECONSTRUCTED ones are, in the main: the plan shape of the track (bend radius 22 m, transition length 12 m, width 7.5 m - all inside UCI bands, but the UCI fixes no shape), the track bicycle's own geometry and inertias, the finish line's exact position along the straight, the drafting decay with gap beyond about a metre (no published measurement covers a solo follower further back), the sprinter's critical power and anaerobic capacity (nobody has published CP and W' for track SPRINTERS), the six opponents, the physics time step, and the whole of the rider-to-rider contact model - the ten constants in C.CONTACT and C.SPACE that decide when a touch is a shove and when it is a crash, how much room a rider keeps beside them, and how much of that a player's own steering is overridden by. Nothing about that is published; it is a game-design judgement, and it is the largest single block of RECONSTRUCTED values in the engine. ------------------------------------------------------------------------------------------------ 5. WHAT DIFFERS FROM REALITY - the limits, stated plainly - The benchmark equations are linearised about upright, straight-ahead running. On a banked bend this app linearises about the steady turn instead: gravity is replaced by g cos(theta) + (v^2/R) sin(theta) and the bank contributes a constant lean forcing derived from the first column of K0. That extension is DERIVED here and is not in [BENCH]. - The coefficients of the linearised equations are only approximate once the machine is leaning hard, even though the trim lean itself stays exact. - Below 1.4 m/s - walking pace, the minimum [UCI] 3.2.039 allows a leading sprinter - the balance model is switched off and the lean is held at trim. A track stand is balanced by throwing the machine under a nearly still body, which these equations do not contain. - Tyres do not slip sideways. There is no slip angle and no relaxation length. - The rider is rigid: no hip steering, no fore-and-aft movement, no standing up. - The air is still. [FITZ] measured a swirling tailwind of up to 0.7 m/s building inside a velodrome during a session; none of that is here. - The balance autopilot is a controller this app wrote, not physics. On "manual" it is off. - The AI opponents are simple controllers with a per-rider skill factor. They are not modelled tactically and they will not surprise you twice. - Events modelled: flying 200, individual pursuit, match sprint, keirin. Not modelled: team pursuit, team sprint, kilo, points race, madison, elimination, omnium, scratch. - Sound: none. ------------------------------------------------------------------------------------------------ 6. WHAT WAS TESTED AND HOW tools-harness.js 8,200+ assertions. The benchmark matrices and eigenvalues; the independent two-mass-skate closed form; the published typo; the Routh criterion checked against the quartic roots; the root finder checked by residual and by Vieta; the banked-turn derivation checked against [BOS]; the track geometry; an energy budget; the drafting figures; every event run to a result; and a section that injects deliberate defects and fails if an oracle does not catch them. tools-harness-page.js Assets, ids, classes, scanner hygiene, JSON-LD, the manifest, and a re-measurement of every number printed in the Help panel against the engine constant it claims to quote. tools-smoke.js Headless Chrome: boots the page, plays a flying 200 and a keirin to a result, drives it from the keyboard, asserts pixels at the PROJECTED centre of a named rider, and requires zero console errors. ------------------------------------------------------------------------------------------------ 7. TECHNOLOGY Hand-written WebGL2. No framework, no library, no CDN, no web font, no analytics, no network request of any kind. Icons and the social card are generated by tools-images.py from the engine's own track geometry, so the art cannot drift from the simulation. Settings and personal bests are kept in this browser's local storage and nowhere else.