// The ray tracer code in this file is written by Adam Burmister. It
// is available in its original form from:
//
//   http://labs.flog.co.nz/raytracer/
//
// Ported from the v8 benchmark suite by Google 2012.
part of ray_trace;

class Vector {
  double x, y, z;
  Vector(this.x, this.y, this.z);

  void copy(Vector v) {
    this.x = v.x;
    this.y = v.y;
    this.z = v.z;
  }

  Vector normalize() {
    var m = this.magnitude();
    return new Vector(this.x / m, this.y / m, this.z / m);
  }

  double magnitude() {
    return sqrt((this.x * this.x) + (this.y * this.y) + (this.z * this.z));
  }

  Vector cross(Vector w) {
    return new Vector(-this.z * w.y + this.y * w.z, this.z * w.x - this.x * w.z,
        -this.y * w.x + this.x * w.y);
  }

  double dot(Vector w) {
    return this.x * w.x + this.y * w.y + this.z * w.z;
  }

  Vector operator +(Vector w) {
    return new Vector(w.x + x, w.y + y, w.z + z);
  }

  Vector operator -(Vector w) {
    return new Vector(x - w.x, y - w.y, z - w.z);
  }

  Vector operator *(Vector w) {
    return new Vector(x * w.x, y * w.y, z * w.z);
  }

  Vector multiplyScalar(double w) {
    return new Vector(x * w, y * w, z * w);
  }

  String toString() {
    return 'Vector [$x, $y ,$z ]';
  }
}
