# No. 38, A means of converting rotary motion, uniform for part of the turn, varied for the rest
# (Brown 1868).
#
# "A means of converting rotary motion, by which the speed is made uniform during a part, and varied
#  during another part, of the revolution."
#
# Laid out as in the plate (1 unit = 1 cm; the drawing plane is x-z, depth is y): two toothed wheels
# on fixed centres 20.04 apart. The driver's pitch curve is a circle of radius 10 over one half of
# it and swells and shrinks over the other half (r = 10 + 1.6 sin 2u sin^2 u: it meets the circle
# flat, and stays convex); the driven wheel's
# pitch curve is its rolling conjugate (r2 = 20.04 - r1, each driven angle the integral of r1/r2),
# closed after exactly one turn of each. 30 straight-flanked teeth (20 deg) at equal arc pitch 2.1077
# round each curve, each its own convex piece (generator: opencode-runs/batch7/gen038.py).
#
# Fully physical. Only the driver is motor-driven (20 rpm). The driven wheel turns by tooth contact
# alone: for half of each turn at a uniform -0.9960 of the driver's speed (r1 = 10 against r2 =
# 10.04), for the other half swinging out to -1.2265 and -0.8088 and back.
number: 38
slug: uniform-and-varied-rotary-motion
name: A means of converting rotary motion, uniform during a part and varied during another part
brown: "A means of converting rotary motion, by which the speed is made uniform during a part, and varied during another part, of the revolution."
units: cm
sim:
  timestep: 0.0002
  integrator: implicitfast
  iterations: 100
  solver: CG
  multiccd: true
  duration_s: 8
  floor: false
bodies:
  - id: ga
    shape: part
    pos: [-10.02, 0, 0]
    density: 7800
    friction: 0.1
    color: "#e4d9bf"
    pieces:
      - {kind: disc, center: [-10.02, 0], radius: 1.4, y: [-1.0, 1.0], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-0.6566, -0.0], [-0.6766, -0.6114]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-0.6766, -0.6114], [-0.7365, -1.2202]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-0.7365, -1.2202], [-0.8366, -1.8267]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-0.8366, -1.8267], [-0.9754, -2.4225]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-0.9754, -2.4225], [-1.1529, -3.0079]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-1.1529, -3.0079], [-1.3694, -3.5832]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-1.3694, -3.5832], [-1.6218, -4.1404]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-1.6218, -4.1404], [-1.9101, -4.68]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-1.9101, -4.68], [-2.2347, -5.202]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-2.2347, -5.202], [-2.591, -5.6993]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-2.591, -5.6993], [-2.979, -6.1722]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-2.979, -6.1722], [-3.3991, -6.6209]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-3.3991, -6.6209], [-3.8456, -7.0391]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-3.8456, -7.0391], [-4.3184, -7.4273]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-4.3184, -7.4273], [-4.818, -7.7854]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-4.818, -7.7854], [-5.3375, -8.1085]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-5.3375, -8.1085], [-5.877, -8.3969]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-5.877, -8.3969], [-6.4368, -8.6507]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-6.4368, -8.6507], [-7.0093, -8.8662]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-7.0093, -8.8662], [-7.5947, -9.0438]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-7.5947, -9.0438], [-8.1933, -9.1835]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-8.1933, -9.1835], [-8.7969, -9.2832]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-8.7969, -9.2832], [-9.4057, -9.3432]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-9.4057, -9.3432], [-10.02, -9.3634]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-10.02, -9.3634], [-10.6315, -9.3434]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-10.6315, -9.3434], [-11.2403, -9.2835]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-11.2403, -9.2835], [-11.8467, -9.1835]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-11.8467, -9.1835], [-12.4425, -9.0446]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-12.4425, -9.0446], [-13.0279, -8.8671]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-13.0279, -8.8671], [-13.6033, -8.6507]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-13.6033, -8.6507], [-14.1605, -8.3982]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-14.1605, -8.3982], [-14.7, -8.1099]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-14.7, -8.1099], [-15.2221, -7.7854]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-15.2221, -7.7854], [-15.7193, -7.4291]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-15.7193, -7.4291], [-16.1923, -7.0411]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-16.1923, -7.0411], [-16.641, -6.6209]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-16.641, -6.6209], [-17.0592, -6.1745]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-17.0592, -6.1745], [-17.4473, -5.7016]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-17.4473, -5.7016], [-17.8054, -5.202]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-17.8054, -5.202], [-18.1285, -4.6825]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-18.1285, -4.6825], [-18.4169, -4.1431]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-18.4169, -4.1431], [-18.6707, -3.5832]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-18.6707, -3.5832], [-18.8862, -3.0107]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-18.8862, -3.0107], [-19.0639, -2.4253]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-19.0639, -2.4253], [-19.2035, -1.8267]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-19.2035, -1.8267], [-19.3032, -1.2231]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-19.3032, -1.2231], [-19.3633, -0.6144]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-19.3633, -0.6144], [-19.3834, -0.0]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-19.3834, -0.0], [-19.3643, 0.6115]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-19.3643, 0.6115], [-19.3105, 1.2211]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-19.3105, 1.2211], [-19.2264, 1.8313]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-19.2264, 1.8313], [-19.1163, 2.4363]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-19.1163, 2.4363], [-18.9823, 3.0402]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-18.9823, 3.0402], [-18.8238, 3.6466]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-18.8238, 3.6466], [-18.6408, 4.2502]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-18.6408, 4.2502], [-18.4297, 4.853]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-18.4297, 4.853], [-18.1848, 5.4555]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-18.1848, 5.4555], [-17.9034, 6.0478]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-17.9034, 6.0478], [-17.5794, 6.6266]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-17.5794, 6.6266], [-17.2066, 7.1866]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-17.2066, 7.1866], [-16.7857, 7.7131]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-16.7857, 7.7131], [-16.3139, 8.1987]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-16.3139, 8.1987], [-15.7898, 8.6351]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-15.7898, 8.6351], [-15.2223, 9.0084]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-15.2223, 9.0084], [-14.615, 9.3127]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-14.615, 9.3127], [-13.9728, 9.5428]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-13.9728, 9.5428], [-13.3116, 9.6933]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-13.3116, 9.6933], [-12.6388, 9.7652]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-12.6388, 9.7652], [-11.9617, 9.7612]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-11.9617, 9.7612], [-11.2964, 9.687]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-11.2964, 9.687], [-10.6481, 9.5514]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-10.6481, 9.5514], [-10.02, 9.3634]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-10.02, 9.3634], [-9.4222, 9.1362]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-9.4222, 9.1362], [-8.8528, 8.8806]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-8.8528, 8.8806], [-8.3082, 8.6058]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-8.3082, 8.6058], [-7.7906, 8.3238]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-7.7906, 8.3238], [-7.2926, 8.0404]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-7.2926, 8.0404], [-6.8064, 7.7585]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-6.8064, 7.7585], [-6.3311, 7.4825]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-6.3311, 7.4825], [-5.8595, 7.2098]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-5.8595, 7.2098], [-5.3858, 6.9357]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-5.3858, 6.9357], [-4.9129, 6.6572]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-4.9129, 6.6572], [-4.4391, 6.3666]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-4.4391, 6.3666], [-3.9648, 6.0552]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-3.9648, 6.0552], [-3.4995, 5.7196]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-3.4995, 5.7196], [-3.0474, 5.3526]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-3.0474, 5.3526], [-2.614, 4.9485]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-2.614, 4.9485], [-2.2117, 4.5092]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-2.2117, 4.5092], [-1.8461, 4.0331]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-1.8461, 4.0331], [-1.5225, 3.5198]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-1.5225, 3.5198], [-1.2492, 2.9783]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-1.2492, 2.9783], [-1.0281, 2.4114]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-1.0281, 2.4114], [-0.8594, 1.8222]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-0.8594, 1.8222], [-0.7439, 1.2222]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-0.7439, 1.2222], [-0.6777, 0.6143]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-10.02, 0.0], [-0.6777, 0.6143], [-0.6566, -0.0]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[-0.7164, -0.2979], [-0.8599, -1.6551], [0.4461, -1.3304], [0.4928, -0.8887]], y: [-0.6, 0.6], collide: 1}
      - {kind: poly, points: [[-0.9845, -2.2377], [-1.4089, -3.5348], [-0.0639, -3.4905], [0.0742, -3.0684]], y: [-0.6, 0.6], collide: 1}
      - {kind: poly, points: [[-1.6526, -4.0785], [-2.339, -5.258], [-1.0145, -5.4962], [-0.7911, -5.1123]], y: [-0.6, 0.6], collide: 1}
      - {kind: poly, points: [[-2.691, -5.7388], [-3.609, -6.7486], [-2.3636, -7.2587], [-2.0648, -6.93]], y: [-0.6, 0.6], collide: 1}
      - {kind: poly, points: [[-4.054, -7.145], [-5.1627, -7.9408], [-4.0515, -8.6998], [-3.6906, -8.4408]], y: [-0.6, 0.6], collide: 1}
      - {kind: poly, points: [[-5.6808, -8.2351], [-6.9315, -8.7812], [-6.0036, -9.7559], [-5.5966, -9.5782]], y: [-0.6, 0.6], collide: 1}
      - {kind: poly, points: [[-7.4997, -8.9607], [-8.8369, -9.233], [-8.1335, -10.3803], [-7.6983, -10.2917]], y: [-0.6, 0.6], collide: 1}
      - {kind: poly, points: [[-9.43, -9.2897], [-10.7947, -9.2762], [-10.3469, -10.5453], [-9.9028, -10.5497]], y: [-0.6, 0.6], collide: 1}
      - {kind: poly, points: [[-11.3866, -9.2076], [-12.7182, -8.9088], [-12.5459, -10.2435], [-12.1125, -10.3407]], y: [-0.6, 0.6], collide: 1}
      - {kind: poly, points: [[-13.2826, -8.718], [-14.5222, -8.1472], [-14.633, -9.4884], [-14.2296, -9.6742]], y: [-0.6, 0.6], collide: 1}
      - {kind: poly, points: [[-15.0343, -7.8425], [-16.127, -7.025], [-16.516, -8.3133], [-16.1604, -8.5794]], y: [-0.6, 0.6], collide: 1}
      - {kind: poly, points: [[-16.564, -6.62], [-17.4615, -5.5919], [-18.1115, -6.7703], [-17.8194, -7.1049]], y: [-0.6, 0.6], collide: 1}
      - {kind: poly, points: [[-17.8042, -5.1045], [-18.4667, -3.9114], [-19.3488, -4.9277], [-19.1332, -5.316]], y: [-0.6, 0.6], collide: 1}
      - {kind: poly, points: [[-18.6997, -3.3628], [-19.0983, -2.0576], [-20.1733, -2.8671], [-20.0436, -3.2919]], y: [-0.6, 0.6], collide: 1}
      - {kind: poly, points: [[-19.2112, -1.4725], [-19.3279, -0.1128], [-20.5485, -0.6795], [-20.5105, -1.1221]], y: [-0.6, 0.6], collide: 1}
      - {kind: poly, points: [[-19.3109, 0.4927], [-19.1603, 1.8491], [-20.468, 1.5311], [-20.517, 1.0897]], y: [-0.6, 0.6], collide: 1}
      - {kind: poly, points: [[-19.0382, 2.4841], [-18.7043, 3.8074], [-20.043, 3.6705], [-20.1517, 3.2399]], y: [-0.6, 0.6], collide: 1}
      - {kind: poly, points: [[-18.5098, 4.4252], [-18.0006, 5.6914], [-19.3457, 5.7361], [-19.5114, 5.324]], y: [-0.6, 0.6], collide: 1}
      - {kind: poly, points: [[-17.7326, 6.236], [-16.9882, 7.3798], [-18.2992, 7.6838], [-18.5415, 7.3115]], y: [-0.6, 0.6], collide: 1}
      - {kind: poly, points: [[-16.635, 7.8086], [-15.6117, 8.7115], [-16.7935, 9.3552], [-17.1266, 9.0614]], y: [-0.6, 0.6], collide: 1}
      - {kind: poly, points: [[-15.1764, 8.9914], [-13.9166, 9.516], [-14.8275, 10.5065], [-15.2376, 10.3358]], y: [-0.6, 0.6], collide: 1}
      - {kind: poly, points: [[-13.4168, 9.627], [-12.0544, 9.7055], [-12.5866, 10.9416], [-13.0301, 10.916]], y: [-0.6, 0.6], collide: 1}
      - {kind: poly, points: [[-11.5149, 9.6456], [-10.1869, 9.3311], [-10.3434, 10.6677], [-10.7756, 10.7701]], y: [-0.6, 0.6], collide: 1}
      - {kind: poly, points: [[-9.6229, 9.1164], [-8.3838, 8.5446], [-8.2718, 9.8857], [-8.6751, 10.0718]], y: [-0.6, 0.6], collide: 1}
      - {kind: poly, points: [[-7.7838, 8.2138], [-6.5955, 7.5427], [-6.3744, 8.8702], [-6.7611, 9.0886]], y: [-0.6, 0.6], collide: 1}
      - {kind: poly, points: [[-5.9614, 7.1803], [-4.7852, 6.4883], [-4.5407, 7.8116], [-4.9235, 8.0369]], y: [-0.6, 0.6], collide: 1}
      - {kind: poly, points: [[-4.2165, 6.1403], [-3.1219, 5.3253], [-2.7359, 6.6145], [-3.0922, 6.8798]], y: [-0.6, 0.6], collide: 1}
      - {kind: poly, points: [[-2.6883, 4.9401], [-1.8129, 3.8932], [-1.138, 5.0574], [-1.4229, 5.3982]], y: [-0.6, 0.6], collide: 1}
      - {kind: poly, points: [[-1.5296, 3.4366], [-1.0006, 2.1786], [-0.0133, 3.0931], [-0.1855, 3.5026]], y: [-0.6, 0.6], collide: 1}
      - {kind: poly, points: [[-0.8699, 1.6465], [-0.7121, 0.2909], [0.4908, 0.8943], [0.4394, 1.3355]], y: [-0.6, 0.6], collide: 1}
  - id: gb
    shape: part
    pos: [10.02, 0, 0]
    density: 7800
    friction: 0.1
    color: "#e8dec6"
    pieces:
      - {kind: disc, center: [10.02, 0], radius: 1.4, y: [-1.0, 1.0], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [0.6166, 0.0], [0.6365, -0.6116]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [0.6365, -0.6116], [0.6961, -1.2206]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [0.6961, -1.2206], [0.7958, -1.8273]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [0.7958, -1.8273], [0.9342, -2.4234]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [0.9342, -2.4234], [1.111, -3.0092]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [1.111, -3.0092], [1.3267, -3.5849]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [1.3267, -3.5849], [1.5783, -4.1427]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [1.5783, -4.1427], [1.8656, -4.683]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [1.8656, -4.683], [2.1891, -5.2059]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [2.1891, -5.2059], [2.5442, -5.7042]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [2.5442, -5.7042], [2.9311, -6.1783]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [2.9311, -6.1783], [3.35, -6.6284]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [3.35, -6.6284], [3.7952, -7.0482]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [3.7952, -7.0482], [4.2668, -7.4381]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [4.2668, -7.4381], [4.7651, -7.7982]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [4.7651, -7.7982], [5.2835, -8.1234]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [5.2835, -8.1234], [5.8218, -8.4143]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [5.8218, -8.4143], [6.3807, -8.6707]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [6.3807, -8.6707], [6.9523, -8.889]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [6.9523, -8.889], [7.5369, -9.0697]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [7.5369, -9.0697], [8.1349, -9.2126]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [8.1349, -9.2126], [8.7381, -9.3157]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [8.7381, -9.3157], [9.3467, -9.3793]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [9.3467, -9.3793], [9.9611, -9.4033]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [9.9611, -9.4033], [10.5728, -9.3872]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [10.5728, -9.3872], [11.1821, -9.3314]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [11.1821, -9.3314], [11.7895, -9.2355]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [11.7895, -9.2355], [12.3864, -9.1009]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [12.3864, -9.1009], [12.9733, -8.9277]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [12.9733, -8.9277], [13.5504, -8.7156]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [13.5504, -8.7156], [14.1098, -8.4676]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [14.1098, -8.4676], [14.6518, -8.1836]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [14.6518, -8.1836], [15.1767, -7.8635]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [15.1767, -7.8635], [15.6772, -7.5114]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [15.6772, -7.5114], [16.1538, -7.1276]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [16.1538, -7.1276], [16.6065, -6.7115]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [16.6065, -6.7115], [17.029, -6.2689]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [17.029, -6.2689], [17.4219, -5.7998]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [17.4219, -5.7998], [17.7851, -5.3037]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [17.7851, -5.3037], [18.1136, -4.7874]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [18.1136, -4.7874], [18.4078, -4.2509]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [18.4078, -4.2509], [18.6677, -3.6937]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [18.6677, -3.6937], [18.8896, -3.1234]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [18.8896, -3.1234], [19.074, -2.5399]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [19.074, -2.5399], [19.2206, -1.9428]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [19.2206, -1.9428], [19.3275, -1.3403]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [19.3275, -1.3403], [19.395, -0.7321]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [19.395, -0.7321], [19.4228, -0.1179]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [19.4228, -0.1179], [19.4096, 0.4939]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [19.4096, 0.4939], [19.3515, 1.1032]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [19.3515, 1.1032], [19.2431, 1.7094]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [19.2431, 1.7094], [19.082, 2.3026]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [19.082, 2.3026], [18.8656, 2.8813]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [18.8656, 2.8813], [18.5919, 3.4439]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [18.5919, 3.4439], [18.2645, 3.981]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [18.2645, 3.981], [17.8852, 4.4917]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [17.8852, 4.4917], [17.456, 4.9759]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [17.456, 4.9759], [16.9863, 5.4274]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [16.9863, 5.4274], [16.4804, 5.8481]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [16.4804, 5.8481], [15.9421, 6.2409]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [15.9421, 6.2409], [15.3827, 6.6038]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [15.3827, 6.6038], [14.8051, 6.9414]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [14.8051, 6.9414], [14.2112, 7.2584]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [14.2112, 7.2584], [13.6099, 7.5547]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [13.6099, 7.5547], [13.0008, 7.8344]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [13.0008, 7.8344], [12.382, 8.1005]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [12.382, 8.1005], [11.7601, 8.3506]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [11.7601, 8.3506], [11.1324, 8.5848]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [11.1324, 8.5848], [10.4965, 8.8016]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [10.4965, 8.8016], [9.8595, 8.9947]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [9.8595, 8.9947], [9.2204, 9.16]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [9.2204, 9.16], [8.5789, 9.2924]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [8.5789, 9.2924], [7.945, 9.3844]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [7.945, 9.3844], [7.3202, 9.4311]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [7.3202, 9.4311], [6.7065, 9.4271]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [6.7065, 9.4271], [6.115, 9.3684]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [6.115, 9.3684], [5.5478, 9.2523]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [5.5478, 9.2523], [5.0068, 9.0767]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [5.0068, 9.0767], [4.501, 8.8436]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [4.501, 8.8436], [4.0305, 8.5543]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [4.0305, 8.5543], [3.595, 8.2103]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [3.595, 8.2103], [3.1992, 7.8195]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [3.1992, 7.8195], [2.8404, 7.3859]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [2.8404, 7.3859], [2.5154, 6.9131]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [2.5154, 6.9131], [2.2249, 6.4117]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [2.2249, 6.4117], [1.9643, 5.8854]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [1.9643, 5.8854], [1.7295, 5.3368]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [1.7295, 5.3368], [1.5196, 4.7756]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [1.5196, 4.7756], [1.331, 4.2028]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [1.331, 4.2028], [1.1613, 3.6182]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [1.1613, 3.6182], [1.0114, 3.029]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [1.0114, 3.029], [0.8813, 2.4335]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [0.8813, 2.4335], [0.7725, 1.8297]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [0.7725, 1.8297], [0.6894, 1.224]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [0.6894, 1.224], [0.6358, 0.6146]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[10.02, 0.0], [0.6358, 0.6146], [0.6166, 0.0]], y: [-0.6, 0.6], collide: 0}
      - {kind: poly, points: [[0.6965, 0.6825], [0.6967, -0.6822], [-0.568, -0.2222], [-0.5681, 0.222]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[0.7592, -1.2756], [1.0434, -2.6104], [-0.2893, -2.4235], [-0.3819, -1.9891]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[1.2282, -3.1774], [1.7844, -4.4236], [0.442, -4.5187], [0.261, -4.1131]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[2.0833, -4.9397], [2.887, -6.0427], [1.5939, -6.4154], [1.3324, -6.0564]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[3.2869, -6.4852], [4.3028, -7.3964], [3.1158, -8.0305], [2.7852, -7.7339]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[4.7861, -7.7459], [5.9696, -8.4254], [4.9408, -9.2929], [4.5556, -9.0718]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[6.5151, -8.6665], [7.8142, -9.0844], [6.9889, -10.1473], [6.566, -10.0113]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[8.398, -9.2067], [9.7557, -9.3446], [9.17, -10.5562], [8.7281, -10.5113]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[10.3521, -9.3426], [11.7088, -9.1945], [11.3884, -10.5016], [10.9469, -10.5498]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[12.2918, -9.0681], [13.5879, -8.6409], [13.5466, -9.986], [13.1248, -10.125]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[14.1316, -8.3956], [15.3102, -7.7077], [15.5502, -9.0319], [15.1666, -9.2558]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[15.7908, -7.3546], [16.8002, -6.4361], [17.3109, -7.6812], [16.9824, -7.9801]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[17.1967, -5.9906], [17.9925, -4.8819], [18.7515, -5.9932], [18.4925, -6.3541]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[18.2876, -4.3636], [18.8348, -3.1134], [19.8087, -4.0421], [19.6306, -4.449]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[19.0154, -2.545], [19.29, -1.2082], [20.4361, -1.9136], [20.3467, -2.3486]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[19.3485, -0.6149], [19.338, 0.7497], [20.6061, 0.2992], [20.6095, -0.1449]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[19.2738, 1.3115], [18.9179, 2.629], [20.2588, 2.5144], [20.3746, 2.0856]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[18.7018, 3.125], [17.9812, 4.2839], [19.2981, 4.5609], [19.5327, 4.1837]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[17.6149, 4.7143], [16.6238, 5.6525], [17.8274, 6.2544], [18.15, 5.9491]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[16.1331, 6.0211], [14.9866, 6.7614], [16.0593, 7.5741], [16.4324, 7.3331]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[14.4081, 7.0771], [13.1819, 7.6763], [14.1507, 8.6104], [14.5498, 8.4154]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[12.5547, 7.9483], [11.2828, 8.443], [12.1702, 9.4547], [12.5842, 9.2937]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[10.6439, 8.664], [9.3311, 9.0365], [10.1191, 10.1274], [10.5464, 10.0062]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[8.7116, 9.177], [7.3572, 9.3446], [7.9693, 10.5431], [8.4101, 10.4885]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[6.7957, 9.3636], [5.4441, 9.1747], [5.725, 10.4908], [6.1649, 10.5523]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[4.985, 9.0335], [3.804, 8.3497], [3.5687, 9.6747], [3.953, 9.8973]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[3.4483, 8.0175], [2.6011, 6.9476], [1.8954, 8.0935], [2.1712, 8.4417]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[2.3211, 6.4441], [1.7532, 5.2032], [0.7948, 6.148], [0.9797, 6.5518]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[1.5367, 4.596], [1.147, 3.2881], [0.0665, 4.0902], [0.1933, 4.5159]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[0.9937, 2.6476], [0.7627, 1.3025], [-0.4058, 1.9702], [-0.3306, 2.408]], y: [-0.6, 0.6], collide: 2}
  - {id: stubs, shape: frame, rods: [{from: [-10.02, -2.4, 0], to: [-10.02, 2.4, 0], radius: 0.6}, {from: [10.02, -2.4, 0], to: [10.02, 2.4, 0], radius: 0.6}], color: "#8f8a80"}
joints:
  - {id: j_a, type: hinge, body: ga, axis: [0, -1, 0], damping: 0.001}
  - {id: j_b, type: hinge, body: gb, axis: [0, -1, 0], damping: 0.01}
contact: {solref: [0.002, 1.0], solimp: [0.95, 0.99, 0.0005], margin: 0}
driver: {joint: j_a, kind: velocity, rpm: 20, kv: 6, max_torque: 8}
checks:
  # equal tooth counts: -1 over whole turns (20 rpm: 3 s a turn)
  - {type: ratio, out: j_b, in: j_a, expect: -1.0, tol: 0.015, settle_s: 1, window_s: 6}
  # the uniform half of a turn (driver at 0..pi, 3..4.5 s): r1/r2 = 10/10.04
  - {type: ratio, out: j_b, in: j_a, expect: -0.996, tol: 0.02, settle_s: 3.2, window_s: 1.1}
  # the varied half: the slices swing out towards -1.23 and -0.81
  - {type: ratio_range, out: j_b, in: j_a, min: -1.3, max: -0.75, min_swing: 0.25, settle_s: 1, window_s: 6}
  - {type: penetration, max: 0.001, settle_s: 0.5}
camera: {target: [0, 0, 0], position: [0, -78, 1], fov: 34}
display:
  output: j_b
  labels: {j_a: "Driver", j_b: "Driven (uniform, then varied)"}
  proof: {label: "Teeth out of contact", sub: "the driver turns alone: the driven wheel stands still"}
