// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
part of dart.math;

/// A utility class for representing two-dimensional positions.
class Point<T extends num> {
  final T x;
  final T y;

  const Point(T x, T y)
      : this.x = x,
        this.y = y;

  String toString() => 'Point($x, $y)';

  /// A `Point` is only equal to another `Point` with the same coordinates.
  ///
  /// This point is equal to `other` if, and only if,
  /// `other` is a `Point` with
  /// [x] equal to `other.x` and [y] equal to `other.y`.
  bool operator ==(dynamic other) =>
      // Cannot change parameter type to `Object` in case some class
      // inherits the type and uses their argument dynamically.
      other is Point && x == other.x && y == other.y;

  int get hashCode => _JenkinsSmiHash.hash2(x.hashCode, y.hashCode);

  /// Add [other] to `this`, as if both points were vectors.
  ///
  /// Returns the resulting "vector" as a Point.
  Point<T> operator +(Point<T> other) {
    return Point<T>(x + other.x, y + other.y);
  }

  /// Subtract [other] from `this`, as if both points were vectors.
  ///
  /// Returns the resulting "vector" as a Point.
  Point<T> operator -(Point<T> other) {
    return Point<T>(x - other.x, y - other.y);
  }

  /// Scale this point by [factor] as if it were a vector.
  ///
  /// *Important* *Note*: This function accepts a `num` as its argument only so
  /// that you can scale Point<double> objects by an `int` factor. Because the
  /// star operator always returns the same type of Point that originally called
  /// it, passing in a double [factor] on a `Point<int>` _causes_ _a_
  /// _runtime_ _error_ in checked mode.
  Point<T> operator *(num /*T|int*/ factor) {
    return Point<T>((x * factor), (y * factor));
  }

  /// Get the straight line (Euclidean) distance between the origin (0, 0) and
  /// this point.
  double get magnitude => sqrt(x * x + y * y);

  /// Returns the distance between `this` and [other].
  double distanceTo(Point<T> other) {
    var dx = x - other.x;
    var dy = y - other.y;
    return sqrt(dx * dx + dy * dy);
  }

  /// Returns the squared distance between `this` and [other].
  ///
  /// Squared distances can be used for comparisons when the actual value is not
  /// required.
  T squaredDistanceTo(Point<T> other) {
    var dx = x - other.x;
    var dy = y - other.y;
    return dx * dx + dy * dy;
  }
}
