Methoden format() mit Point(x, y)-Objekt

Kel

Aktives Mitglied
Java:
public class Kreis {

	private Point mittelpunkt;
	private double radius;
	
	public Kreis(int x, int y, double radius) {
		this.mittelpunkt = new Point(x, y);
		this.radius = radius;
	}

public void zeichnen() {
		String a = String.format("Kreis mit dem Radius %.1f und dem Mittelpunkt %'Formatanweisung' wurde gezeichnet", radius, mittelpunkt);
		System.out.println(a);
	}

	public static void main (String[] args) {
		Kreis kreis = new Kreis(3, 3, 2.2);
		kreis.zeichnen();
	}
}

Ich muss den Mittelpunkt im String ausgeben, ginge theoretisch ohne
Code:
format()
, indem ich einfach das Objekt einfüge -
Code:
"Mittelpunkt ist: " + mittelpunkt
Oder ich mach es mit
Code:
format()
, nutze aber einfach die Koordinaten
Code:
x, y
als Argumente (müsste ich dann nur noch deklarieren).
Aber gibt es nicht auch eine Möglichkeit, das ganze mit
Code:
format()
und dem Point-Objekt zu gestalten?
 
Zuletzt bearbeitet:
du kannst auch mittelpunkt.x, mittelpunkt.y an format übergeben,
das mittelpunkt-Objekt selber aber nicht wirklich, falls nicht zufällig dessen toString() aufgerufen wird,

anscheinend geht das mit %s, ist es das was du brauchst aber nicht selber suchen wolltest? 😉
Formatter (Java Platform SE 6)
 
mittelpunkt.x und mittelpunkt.y ist ziemlich das, was ich brauche 🙂.
Aber ich dachte, dazu hat man mittelpunkt.getX() und mittelpunkt.getY() aus der Point/Point2D-Klasse?

Wenn ich die Beschreibung richtig geschrieben habe, wandelt %s mein Argument einfach in einen String um, oder?
Da ich jetzt mittelpunkt.x kenne, nehme ich lieber %,d.
 
Zuletzt bearbeitet:
> Aber ich dachte, dazu hat man mittelpunkt.getX() und mittelpunkt.getY() aus der Point/Point2D-Klasse?

ist doch dasselbe, nur schönerer Zugriff aus gewisser Sicht, hängt alles davon ab ob die Methoden vorhanden sind und/ oder die Attribute direkt sichtbar/ public
 
ist doch dasselbe, nur schönerer Zugriff aus gewisser Sicht, hängt alles davon ab ob die Methoden vorhanden sind und/ oder die Attribute direkt sichtbar/ public
Das interessiert mich jetzt.

Java:
import java.awt.Point;
import java.awt.geom.Point2D;

public class Kreis

	private Point mittelpunkt;
	private double radius;

	public Kreis(int x, int y, double radius) {
		this.mittelpunkt = new Point(x, y);
		this.radius = radius;
	}

public Strecke generiereStrecke(float f) {
		int x = (int) (Math.cos(f) * radius);
		int y = (int) (Math.sin(f) * radius);
		// Point2D Strecke = new Point2D.Double(x, y);
		Strecke strecke = new Strecke(x, y, 0, 0);
		return strecke;
	}
	
	public static void main (String[] args) {
		Kreis kreis = new Kreis(3, 4, 2.5);
		Strecke foo = kreis.generiereStrecke(143);
		System.out.println(foo.getPunktA().x + " " + foo.getPunktA().y);
		System.out.println(foo.punktA);
		System.out.println(foo.punktA.getX());
	}

Java:
package figur;

import java.awt.Point;
import java.awt.geom.Point2D;

public class Strecke implements IStrich, IGeneriereStrecke {
	
	private Point punktA;
	private Point punktB;
	
	// Strecke: Konstruktor der alle Variablen der Klasse Strecke setzt
	public Strecke(int x, int y, int a, int b) {
		this.punktA = new Point(x, y);
		this.punktB = new Point(a, b);
	}

	// GETTER und SETTER
	public Point getPunktA() {
		return punktA;
	}

	public void setPunktA(Point punktA) {
		this.punktA = punktA;
	}

	public Point getPunktB() {
		return punktB;
	}

	public void setPunktB(Point punktB) {
		this.punktB = punktB;
	}
	// GETTER und SETTER

		
	// Strecke: Die neue Strecke, soll die ursprüngliche Strecke skaliert um den Faktor f sein
	// Der neue Punkt C der in der neuen Strecke statt B wäre hat die Koordinaten: C= A+f*(B-A)
	@Override
	public Strecke generiereStrecke(float f) {
		int x = (int) (punktA.x + f * (punktB.x - punktA.x));
		int y = (int) (punktA.y + f * (punktB.y - punktA.y));
		Strecke strecke = new Strecke((int)punktA.getX(), punktA.y, x, y);
		return strecke;
	}
	
	public static void main (String[] args) {
		Strecke strecke = new Strecke(3, 3, 2, 2);
		Strecke test = strecke.generiereStrecke(50);
		System.out.println(String.format("Punkt A: [%,d , %,d] \nPunkt C: [%,d , %,d]", (int) test.punktA.x, test.punktA.y, test.punktB.x, test.punktB.y));
	}

}

Ich hab jetzt mit den 3 Zugriffsmöglichkeiten experimentiert:
1:
Code:
System.out.println(foo.getPunktA().x + " " + foo.getPunktA().y);
2:
Code:
System.out.println(foo.punktA);
3:
Code:
System.out.println(foo.punktA.getX());

1: Gettermethode, funktioniert wie erwartet
2 + 3:
The field Strecke.punktA is not visible


Ich erzeuge ja mit
Code:
Kreis kreis = new Kreis(3, 4, 2.5);
ein neues Kreisobjekt
rufe die Methode
Code:
public Strecke generiereStrecke(float f)
auf -
Code:
kreis.generiereStrecke(5)
und pack die Rückgabe (Strecke-Objekt) in eine neue Objektreferenz vom Typ Strecke
Code:
Strecke foo = kreis.generiereStrecke(5);

Code:
foo
ist ja jetzt eine Referenz vom Typ Strecke auf ein Strecke-Objekt (Rückgabetyp der Methode), also sollte foo doch Zugriff auf die Instanzvariablen von Strecke haben. Wieso geht dann trotzdem kein Zugriff? Methode 2+3 zeigen mir, dass das nicht so funktioniert wie gewünscht.
 
Zuletzt bearbeitet:
Du bist ja nicht "in" foo, auch wenn du gerade eins "in der Hand hältst". Wenn das so erlaubt wäre wie du denkst, dann wären private Membervariablen überall zugreifbar.
 
Aber ich erzeuge doch ein Objekt vom Typ Strecke, das Objekt hat also auch die Instanzvariable
Code:
punktA
.
Wenn ich dem Objekt jetzt eine Objektreferenz vom Typ Strecke zuweise, dann sollte ich doch Zugriff auf alle private Methoden und Variablen haben.

private = nur innerhalb der Klasse sichtbar, foo ist aber doch eine eine Referenz auf ein Strecke-Objekt?
 
Ja, aber "innerhalb der Klasse" heißt, dass es nur innerhalb der Klasse Strecke sichtbar ist. Du versuchst aber darauf aus der Klasse Kreis zuzugreifen.
Dafür sind ja getter/setter ja auch da.
 
Achso, es kommt also nicht nur darauf an, ob ich ein Objekt der entsprechenden Klasse habe, sondern auch woher ich dieses Objekt "abrufe".

Ich dachte bis jetzt, dass ich mit einem Objekt einer Klasse auch Zugriff auf alle Instanzvariablen und Methoden der Klasse habe, unabhängig vom Ort der Instanziierung.

Ist mein Vorgehen im Code oben soweit korrekt mit der getter-Methode?
 
Probier es doch selber aus. Aber dei einem getter muss man sich schon anstrengen und kreativ sein um etwas falsch zu machen 😉
 
Meine Methode funktioniert ja soweit, die Variante mit punktA.x und punktA.getX() fand ich aber besser.

Hauptfrage war ja:
ist doch dasselbe, nur schönerer Zugriff aus gewisser Sicht, hängt alles davon ab ob die Methoden vorhanden sind und/ oder die Attribute direkt sichtbar/ public

Da weiss ich nicht, was genau gemeint ist. In der Dokumentation von Point steht zu
Code:
getX()
und
Code:
getY()
nichts spezifisches (Point (Java 2 Platform SE v1.4.2)).
 
In der Point-Klasse sind auch die x und y als
Code:
public int x
deklariert und nicht private. Deswegen klappt der Zugriff so.
Bei der Point-Klasse ist noch zu beachten, dass
Code:
somePoint.x
ein int liefert, aber
Code:
somePoint.getX()
ein double.
 
Okay, das mit int/double werd ich nochmal verwenden, um meinen Code etwas umzuschreiben.

Gerade ist ein neues Problem aufgetaucht: Ich muss das Objekt drehen
(neuen Thread aufmachen oder hier weiter? Ist ja eigentlich eher ein Matheproblem bzw. beides)
void drehen(int winkel)
Die Methode soll das Objekt in 90 Grad Schritten drehen(daher den Eckpunkt oder PunktA. Beim
Kreis macht eine Drehung keinen Unterschied)

Mir fehlen hier sämtliche mathematischen Ansätze, wie das zu bewerkstelligen wäre.
 
Na für 90° braucht man keine Drehmatrix, da reicht ein Koordinatentausch x -> y, y -> -x (man beachte das Minus) oder so.
 

Zurück
Oben