circleToStaticLine static method

bool circleToStaticLine(
  1. RigidBody body,
  2. Line line
)

Implementation

static bool circleToStaticLine(RigidBody body, Line line) {
  final circle = body.shape as Circle;

  _closestPointOnLine(circle.position, line, _temp2);

  // diff = circle.position - closest
  _temp.set(circle.position.x - _temp2.x, circle.position.y - _temp2.y);
  final distSq = _temp.magnitudeSquared;

  if (distSq >= circle.radius * circle.radius) return false;

  final dist = distSq == 0 ? 0.0 : _temp.magnitude;
  if (dist == 0) {
    _temp.set(0, 1);
  } else {
    _temp.scale(1 / dist);
  }

  final penetration = circle.radius - dist;
  circle.position.x += _temp.x * penetration;
  circle.position.y += _temp.y * penetration;

  final sepVel = body.velocity.x * _temp.x + body.velocity.y * _temp.y;

  if (sepVel > 0) return true;

  final impulse = -sepVel * (1 + body.elasticity);

  body.velocity.x += _temp.x * impulse;
  body.velocity.y += _temp.y * impulse;

  return true;
}