// Copyright 2000-2003, FreeHEP.
package hep.graphics.heprep.ref;

import java.io.*;
import java.util.*;

import hep.graphics.heprep.*;
import hep.graphics.heprep.util.*;

/**
 *
 * @author M.Donszelmann
 *
 * @version $Id: DefaultHepRepPoint.java,v 1.16 2004/07/05 22:09:46 duns Exp $
 */

public class DefaultHepRepPoint extends DefaultHepRepAttribute implements HepRepPoint, Serializable {
    public static final String cvsId = "$Id: DefaultHepRepPoint.java,v 1.16 2004/07/05 22:09:46 duns Exp $";

    protected double x, y, z;
    protected HepRepInstance instance;

    protected DefaultHepRepPoint(HepRepInstance instance, double x, double y, double z) {
        super();

        if (instance == null) throw new RuntimeException("HepRepPoints cannot be created without a HepRepInstance.");
        this.instance = instance;

        this.x = x;
        this.y = y;
        this.z = z;

        // auto add to parent
        instance.addPoint(this);
    }

    public HepRepInstance getInstance() {
        return instance;
    }
    
/* Disabled for FREEHEP-386
    public boolean equals(Object o) {
        if (!super.equals(o)) return false;
        if (o instanceof HepRepPoint) {
            HepRepPoint ref = (HepRepPoint)o;
            return true;
// FREEHEP-386
//            return (ref.getX() == getX()) && (ref.getY() == getY()) && (ref.getZ() == getZ());
        }
        return false;
    }

    public int hashCode() {
        long r =  Double.doubleToLongBits(getX()) + 
                  Double.doubleToLongBits(getY()) + 
                  Double.doubleToLongBits(getZ());
        return (int)r;
    }
*/    
    public String toString() {
        return getClass()+": ("+x+", "+y+", "+z+")";
    }
    
    /**
     * look for attribute on this node, otherwise delegate to instance
     */
    public HepRepAttValue getAttValue(String lowerCaseName) {
       HepRepAttValue value = getAttValueFromNode(lowerCaseName);
       return (value != null) ? value : instance.getAttValue(lowerCaseName);
    }

    public HepRepPoint copy(HepRepInstance parent) throws CloneNotSupportedException {
        DefaultHepRepPoint copy = new DefaultHepRepPoint(parent, getX(), getY(), getZ());
        HepRepUtil.copyAttributes(this, copy);
        return copy;
    }

    public double getX() {
        return x;
    }

    public double getY() {
        return y;
    }

    public double getZ() {
        return z;
    }

    public double[] getXYZ(double[] xyz) {
        if (xyz == null) xyz = new double[3];
        xyz[0] = x;
        xyz[1] = y;
        xyz[2] = z;
        return xyz;
    }

    // Delegated to HepRepMath
    public double getRho() {
        return HepRepMath.getRho(x, y);
    }
    public double getPhi() {
        return HepRepMath.getPhi(x, y);
    }
    public double getTheta() {
        return HepRepMath.getTheta(x, y, z);
    }
    public double getR() {
        return HepRepMath.getR(x, y, z);
    }
    public double getEta() {
        return HepRepMath.getEta(x, y, z);
    }
    public double getX(double xVertex, double yVertex, double zVertex) {
        return HepRepMath.getX(x, xVertex);
    }
    public double getY(double xVertex, double yVertex, double zVertex) {
        return HepRepMath.getY(y, yVertex);
    }
    public double getZ(double xVertex, double yVertex, double zVertex) {
        return HepRepMath.getZ(z, zVertex);
    }
    public double getRho(double xVertex, double yVertex, double zVertex) {
        return HepRepMath.getRho(x, y, xVertex, yVertex);
    }
    public double getPhi(double xVertex, double yVertex, double zVertex) {
        return HepRepMath.getPhi(x, y, xVertex, yVertex);
    }
    public double getTheta(double xVertex, double yVertex, double zVertex) {
        return HepRepMath.getTheta(x, y, z, xVertex, yVertex, zVertex);
    }
    public double getR(double xVertex, double yVertex, double zVertex) {
        return HepRepMath.getR(x, y, z, xVertex, yVertex, zVertex);
    }
    public double getEta(double xVertex, double yVertex, double zVertex) {
        return HepRepMath.getEta(x, y, z, xVertex, yVertex, zVertex);
    }
}

