content: package com.google.vrtoolkit.cardboard.sensors.internal;
  
  public class Vector3d {
      public double x;
      public double y;
      public double z;
      
      public Vector3d() {
          super();
      }
      
      public Vector3d(final double xx, final double yy, final double zz) {
          super();
          this.set(xx, yy, zz);
      }
      
      public void set(final double xx, final double yy, final double zz) {
          this.x = xx;
          this.y = yy;
          this.z = zz;
      }
      
      public void setComponent(final int i, final double val) {
          if (i == 0) {
              this.x = val;
          }
          else if (i == 1) {
              this.y = val;
          }
          else {
              this.z = val;
          }
      }
      
      public void setZero() {
          final double x = 0.0;
          this.z = x;
          this.y = x;
          this.x = x;
      }
      
      public void set(final Vector3d other) {
          this.x = other.x;
          this.y = other.y;
          this.z = other.z;
      }
      
      public void scale(final double s) {
          this.x *= s;
          this.y *= s;
          this.z *= s;
      }
      
      public void normalize() {
          final double d = this.length();
          if (d != 0.0) {
              this.scale(1.0 / d);
          }
      }
      
      public static double dot(final Vector3d a, final Vector3d b) {
          return a.x * b.x + a.y * b.y + a.z * b.z;
      }
      
      public double length() {
          return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);
      }
      
      public boolean sameValues(final Vector3d other) {
          return this.x == other.x && this.y == other.y && this.z == other.z;
      }
      
      public static void add(final Vector3d a, final Vector3d b, final Vector3d result) {
          result.set(a.x + b.x, a.y + b.y, a.z + b.z);
      }
      
      public static void sub(final Vector3d a, final Vector3d b, final Vector3d result) {
          result.set(a.x - b.x, a.y - b.y, a.z - b.z);
      }
      
      public static void cross(final Vector3d a, final Vector3d b, final Vector3d result) {
          result.set(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x);
      }
      
      public static void ortho(final Vector3d v, final Vector3d result) {
          int k = largestAbsComponent(v) - 1;
          if (k < 0) {
              k = 2;
          }
          result.setZero();
          result.setComponent(k, 1.0);
          cross(v, result, result);
          result.normalize();
      }
      
      public static int largestAbsComponent(final Vector3d v) {
          final double xAbs = Math.abs(v.x);
          final double yAbs = Math.abs(v.y);
          final double zAbs = Math.abs(v.z);
          if (xAbs > yAbs) {
              if (xAbs > zAbs) {
                  return 0;
              }
              return 2;
          }
          else {
              if (yAbs > zAbs) {
                  return 1;
              }
              return 2;
          }
      }
  
      @Override
      public String toString() {
          final StringBuilder builder = new StringBuilder().append("{ ");
          builder.append(Double.toString(this.x));
          builder.append(", ");
          builder.append(Double.toString(this.y));
          builder.append(", ");
          builder.append(Double.toString(this.z));
          builder.append(" }");
          return builder.toString();
      }
  }
  