anchor.diff:        //threshold is roughly 8 px
         if(segment_distance_sq < 65)  {
           //if below the threshold, make it much bigger
  -        this.path.scale(20);
  -        this.text.characterStyle.fontSize *= 20;
  +        this.increment_scale();
         } else {
           //if above a threshold, make it slightly smaller
  -        this.path.scale(this.scaling_rate);
  -        this.text.characterStyle.fontSize *= this.scaling_rate;
  +        this.decrement_scale();
         }
   
         return vector;
  
positive.code: 
    function onFrame(event) {
      mover_group.update_positions();
    }
  </script>
  <canvas id="visualization_canvas" resize>
  
negative.code:         }
        }
      },
      handle_mouse_down: function(event)  {
        //this should probably be moved to the initializer
        var hit_options = {
          fill: true,
          tolerance: 5,
        };
        //captures the click event location
        var hit_result = project.hitTest(event.point, hit_options);
        //make sure we are on the inside of a path that has an inside
        if(hit_result)  {
          if(hit_result.type == "fill")  {
            //loop over all the movers, and try to find one that matches the hit result
            for(var i = 0; i < this.num_paths; i++)  {
              if(this.movers[i].path == hit_result.item)  {
                //triple the size
                this.movers[i].set_scale(3);
              }
            }
          }
        }
      },
    });
  
    var Connection = Base.extend({
  