anchor.diff:        // stop if we would hit the pole in the next timestep
         if (len <= kMinDistance) {
           Pole p = srcs[rng.nextInt(srcs.length)];
  -        _pos.xyz = p.Pos().xyz;
  +        _pos = p.Pos() + RandomVector(rng, 20.0 * dt);
           print("too close: ${len}");
           return;
         }
  
positive.code: }
  
  class Ion {
    VM.Vector3 _pos = new VM.Vector3.zero();
    double _speed;
  
    Ion(this._speed, VM.Vector3 pos) {
      _pos.xyz = pos.xyz;
    }
  
    VM.Vector3 Pos() => _pos;
  
negative.code: const int kNumFireworkParticles = 200;
  const double kMaxDistance = 100.0;
  const double kMinDistance = 0.2;
  const int kIons = 10000;
  
  String DumpVec(VM.Vector3 v) {
    return "${v.x} ${v.y} ${v.z}";
  