/**
   * Change the parent of a game object.
   *
   * <p>TODO: add code so that the object does not change its global position, rotation or scale
   * when it is reparented.
   *
   * @param newParent
   */
  public void setParent(GameObject newParent) {

    GameObject oldParent = this.myParent;

    double oldLocalRotation = this.getRotation();
    double newLocalRotation =
        MathUtil.normaliseAngle(
            oldParent.getGlobalRotation() - newParent.getGlobalRotation() + oldLocalRotation);

    double oldLocalScale = this.getScale();
    double newLocalScale = oldParent.getGlobalScale() * oldLocalScale / newParent.getGlobalScale();

    double[] globalPosition = this.getGlobalPosition();

    double[] globalPositionPoint = new double[3];
    globalPositionPoint[0] = globalPosition[0];
    globalPositionPoint[1] = globalPosition[1];
    globalPositionPoint[2] = 1;

    double[] newLocalPositionPoint =
        MathUtil.multiply(newParent.getInverseGlobalMatrix(), globalPositionPoint);

    double[] newLocalPosition = new double[2];
    newLocalPosition[0] = newLocalPositionPoint[0];
    newLocalPosition[1] = newLocalPositionPoint[1];

    myParent.myChildren.remove(this);
    myParent = newParent;
    myParent.myChildren.add(this);

    this.myTranslation = newLocalPosition;
    this.myRotation = newLocalRotation;
    this.myScale = newLocalScale;
  }
  public double[][] getGlobalMatrix() {
    double[] myGlobalPosition = this.getGlobalPosition();
    double[][] myGlobalTranslationMatrix = MathUtil.translationMatrix(myGlobalPosition);

    double myGlobalRotation = this.getGlobalRotation();
    double[][] myGlobalRotationMatrix = MathUtil.rotationMatrix(myGlobalRotation);

    double myGlobalScale = this.getGlobalScale();
    double[][] myGlobalScaleMatrix = MathUtil.scaleMatrix(myGlobalScale);

    double[][] m = MathUtil.getIdentity();
    m = MathUtil.multiply(m, myGlobalTranslationMatrix);
    m = MathUtil.multiply(m, myGlobalRotationMatrix);
    m = MathUtil.multiply(m, myGlobalScaleMatrix);
    return m;
  }
  public double[][] getInverseGlobalMatrix() {
    double[] globalPosition = this.getGlobalPosition();
    double[] inverseTranslation = new double[2];
    inverseTranslation[0] = -globalPosition[0];
    inverseTranslation[1] = -globalPosition[1];
    double[][] myInverseGlobalTranslationMatrix = MathUtil.translationMatrix(inverseTranslation);

    double myInverseRotation = -this.getGlobalRotation();
    double[][] myInverseGlobalRotationMatrix = MathUtil.rotationMatrix(myInverseRotation);

    double myInverseScale = 1d / this.getGlobalScale();
    double[][] myInverseGlobalScaleMatrix = MathUtil.scaleMatrix(myInverseScale);

    double[][] m = MathUtil.getIdentity();
    m = MathUtil.multiply(m, myInverseGlobalScaleMatrix);
    m = MathUtil.multiply(m, myInverseGlobalRotationMatrix);
    m = MathUtil.multiply(m, myInverseGlobalTranslationMatrix);
    return m;
  }
 /**
  * Compute the object's position in world coordinates
  *
  * <p>TODO: Write this method
  *
  * @return a point in world coordinats in [x,y] form
  */
 public double[] getGlobalPosition() {
   double[] globalPosition = new double[2];
   if (myParent == null) {
     globalPosition[0] = myTranslation[0];
     globalPosition[1] = myTranslation[1];
   } else {
     double[][] parentsGlobalMatrix = myParent.getGlobalMatrix();
     double[] positionPoint = new double[3];
     positionPoint[0] = myTranslation[0];
     positionPoint[1] = myTranslation[1];
     positionPoint[2] = 1;
     double[] globalPositionPoint = MathUtil.multiply(parentsGlobalMatrix, positionPoint);
     globalPosition[0] = globalPositionPoint[0];
     globalPosition[1] = globalPositionPoint[1];
   }
   return globalPosition;
 }