Klassen Klasse Point mit atan2

Herd123

Mitglied
Hallo Leute,

ich brauch eure Hilfe. Ich habe hier eine Klasse, die ich so ausfüllen soll, dass sie stimmt. Mein Code sieht in etwa so aus:

Java:
 * Die Klasse soll Methoden für einen Punkt in der kartesischen Koordinatenebene
 * bereitstellen.
 */

public class Point {

	private final double yPosition;
	private final double xPosition;

	/** Erzeugt einen Punkt am Koordinatenursprung, das heisst an den Koordinaten (0, 0).
	 */
	public Point() {
		this(0, 0);
	}

	/** Erzeugt einen Punkt den gegebenen Koordinaten.
	 * @param x Horizontale Koordinate.
	 * @param y Vertikale Koordinate.
	 */
	public Point(final double x, final double y) {
		yPosition = y;
		xPosition = x;
	}

	/** Liefert die horizontale Koordinate dieses Punktes.
	 * @return xPosition = Horizontale Koordinate.
	 */
	public double getX() {
		return xPosition;
	}

	/** Liefert die vertikale Koordinate dieses Punktes.
	 * @return yPosition = Vertikale Koordinate.
	 */
	public double getY() {
		return yPosition;
	}

	/** Liefert die Blickrichtung von diesem Punkt zum Punkt that.
	 * @param that Ein Punkt. Darf nicht null sein.
	 * @return Blickrichtung zu that im Bogenmaß.
	 * Im Bereich 0 (einschließlich) bis 2*PI (ausschließlich).
	 * 0, wenn dieser Punkt mit that zusammenfällt.
	 * @throws RuntimeException that ist null.
	 * @see java.lang.Math#atan2(double, double)
	 */
	public double angleTo(final Point that) {
		exceptionIfNull(that);

		if(this.getX() == that.getX())
			return 0;
		else {
			return Math.atan2(that.getX(), that.getY());
		}
	}

    	    private void exceptionIfNull(final Point that) {
    	    	    if (that == null) {
    	    	    	    throw new RuntimeException("Point is Null");

    	    	    	}
    	    	}
}

Nun zum eigentlichen Problem. Wie funktioniert atan2? ???:L
Meine Methode angelTo (was sie eigentlich machen soll steht im javadoc darüber) möchte so nämlich nicht funktionieren. Soweit ich weiß, sollte sie thetha (als Bogenmaß )als returnwert geben , anscheinend mach ich da aber was falsch:
Die Fehlermeldung, die mir durch das Testsystem angegeben wird, ist folgende

[Point(), angleTo(^)=0.0, A=Point(1.0, 0.0), angleTo(A)=0.0, A.angleTo(^)=3.141592653589793] expected:<3.141592653589793> but was:<1.5707963267948966>
 

BRoll

Bekanntes Mitglied
ändert leider am Ergebnis nichts. Ist immernoch falsch^^

Wenn ich das richtig verstehe und du den Blickwinkel zwischen den beiden
Punkten haben willst, dann musst du es doch so schreiben:

Java:
Math.atan2( yPosition-that.getY(),xPosition-that.getX() );

Weil dann musst du schon das Dreieck verwenden das zwischen beiden
Punkten liegt.
 

Herd123

Mitglied
nein, habs ausprobiert. Leider ist die Fehlermeldung immernoch die gleiche:

java.lang.AssertionError: [Point(), angleTo(^)=0.0, A=Point(1.0, 0.0), angleTo(A)=0.0, A.angleTo(^)=3.141592653589793] expected:<3.141592653589793> but was:<1.5707963267948966>

Irgendwas stimmt da nicht, aber ich check es nicht... hab das y/xPosition einmal so verwendet und einmal als this. davor versehen, Fehlermeldung ist die gleiche.
 
P

pappawinni

Gast
Wenn du dein Problem mal genauer beschreiben würdest, wäre dein Problem längst gelöst.
Mit welchen Punkten hast du z.B. getestet usw.

* @return Blickrichtung zu that im Bogenmaß.
* Im Bereich 0 (einschließlich) bis 2*PI (ausschließlich).

atan2:
Returns the angle theta from the conversion of rectangular coordinates (x, y) to polar coordinates (r, theta). This method computes the phase theta by computing an arc tangent of y/x in the range of -pi to pi.

D.h. Wertebereich von atan2() ist: -pi < atan2(y,x) <= pi

Demnach müsstest du für negative Werte des atan2() 2*Pi addieren...
 

Herd123

Mitglied
also es passiert folgendes:

[Point(), angleTo(^)=0.0, A=Point(1.0, 0.0), angleTo(A)=0.0, A.angleTo(^)=3.141592653589793] expected:<3.141592653589793> but was:<1.5707963267948966>

Heißt: Defaultkonstruktor mit 0,0 (x,y) wird erstellt. Dann wird da das erste Mal der atan2 berechnet. Dabei kommt 0.0 raus. Ein weitere Punkt mit 1,0(x,y) wird erstellt und auch dessen Ergebnis ist 0,0. Anschließend wird die Blickrichtung von A zum Defaultkonstruktor getestet. Dieser müsste anscheinend PI ausgeben, gibt aber nur PI/2 aus.

So testet das Testsystem, das es zu "überwinden" gilt.

Mein Problem ist halt schlicht und einfach: es kommt nicht raus, was rauskommen soll^^
 
P

pappawinni

Gast
Du hast vermutlich immernoch die falsche Reihenfolge von x und y
Ich kann deine Problem nicht nachvollziehen:

Java:
public class PunktTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
    Point b = new Point();
    Point a = new Point(1,0);    
    System.out.println(a.angleTo(b));
	}

}

class Point {

   private final double yPosition;
   private final double xPosition;

   /** Erzeugt einen Punkt am Koordinatenursprung, das heisst an den Koordinaten (0, 0).
    */
   public Point() {
       this(0, 0);
   }

   /** Erzeugt einen Punkt den gegebenen Koordinaten.
    * @param x Horizontale Koordinate.
    * @param y Vertikale Koordinate.
    */
   public Point(final double x, final double y) {
       yPosition = y;
       xPosition = x;
   }

   /** Liefert die horizontale Koordinate dieses Punktes.
    * @return xPosition = Horizontale Koordinate.
    */
   public double getX() {
       return xPosition;
   }

   /** Liefert die vertikale Koordinate dieses Punktes.
    * @return yPosition = Vertikale Koordinate.
    */
   public double getY() {
       return yPosition;
   }

   /** Liefert die Blickrichtung von diesem Punkt zum Punkt that.
    * @param that Ein Punkt. Darf nicht null sein.
    * @return Blickrichtung zu that im Bogenmaß.
    * Im Bereich 0 (einschließlich) bis 2*PI (ausschließlich).
    * 0, wenn dieser Punkt mit that zusammenfällt.
    * @throws RuntimeException that ist null.
    * @see java.lang.Math#atan2(double, double)
    */
   public double angleTo(final Point that) {
       exceptionIfNull(that);

       if(this.getX() == that.getX())
           return 0;
       else {
    	   double angle =Math.atan2( that.getY()-yPosition,that.getX()-xPosition);
    	   if (angle < 0) angle += 2 * Math.PI;
           return angle;
       }
   }
   private void exceptionIfNull(final Point that) {
       if (that == null) {
               throw new RuntimeException("Point is Null");

           }
   }
}
 
Zuletzt bearbeitet von einem Moderator:

Neue Themen


Oben