projectPointOnSegment function

Map<String, dynamic> projectPointOnSegment(
  1. Map<String, dynamic> P,
  2. Map<String, dynamic> A,
  3. Map<String, dynamic> B
)

Implementation

Map<String, dynamic> projectPointOnSegment(
    Map<String, dynamic> P, Map<String, dynamic> A, Map<String, dynamic> B) {
  double x1 = A['cartesianCoordinate']['x'];
  double y1 = A['cartesianCoordinate']['y'];
  double x2 = B['cartesianCoordinate']['x'];
  double y2 = B['cartesianCoordinate']['y'];
  double x0 = P['cartesianCoordinate']['x'];
  double y0 = P['cartesianCoordinate']['y'];

  double dx = x2 - x1;
  double dy = y2 - y1;

  if (dx == 0 && dy == 0) {
    return A;
  }

  double t = ((x0 - x1) * dx + (y0 - y1) * dy) / (dx * dx + dy * dy);

  if (t < 0) {
    return A;
  } else if (t > 0) {
    return B;
  }

  return {
    'cartesianCoordinate': {
      'x': x1 + t * dx,
      'y': y1 + t * dy,
    }
  };
}