Aufgabe - Geometrie Punkte

Hallo liebe Community,

ich bin neu in der Welt von Java, ich bin gerade dabei ein Program zu schreiben das Punkte ( Koordinaten ) weitergibt um Dreiecke, Quadrate, Polygon usw erstellt.
Nun ist mein Problem das ich in der Übungsaufgabe nicht genau weiss was von mir verlangt wird und ich auch nach einer Woche suchen keine hilfreichen Informationen gefunden habe und hoffe das ich diese bei euch finde.

Folgendes, ich hab die Klasse Punkte (1 von 5 Klassen):

public class Punkt {
    
   private final static int maxpos = 1023;
   private int xpos;
   private int ypos;

   public Punkt(int xpos, int ypos) {
     this.xpos = xpos;
     this.ypos = ypos;
     
  if(xpos<0) {
    this.xpos = 0;
  } else if(xpos>maxpos) {
    this.xpos=maxpos;
  } else {
    this.xpos=xpos;
  }
   if(ypos<0) {
    this.ypos = 0;
  } else if(xpos>maxpos) {
    this.ypos=maxpos;
  } else {
    this.ypos=xpos;
  }
}
         
   public Punkt() {
     this.xpos = 511;
     this.ypos = 511;
   }

   public int getXpos() {
     return this.xpos;
   }

   public void setXYpos(int xpos, int ypos) {
     this.xpos = xpos;
     this.ypos = ypos;
   }

   public int getYpos() {
     return this.ypos;
   }

   public Punkt verschiebeUm(int deltax, int deltay) {
     return new Punkt(xpos + deltax, ypos + deltay);
   }

   public Punkt verschiebeUm(Punkt deltaxy) {
     return new Punkt(xpos + deltaxy.xpos, ypos + deltaxy.ypos);
   }

   public String toString() {
     return "(" + xpos + "," + ypos + ")";
   }
 
}```

und die Klasse main:

public class Hauptprogramm {
public static void main(String[] args) {

   System.out.println("Aufgabe 2a:");
    Punkt A = new Punkt();
    Punkt B = new Punkt(123456, 654321);
    Punkt C = new Punkt(123,-456);
    Punkt D = new Punkt(654,321);
    
    System.out.println("A=" + A);
    System.out.println("B=" + B);
    System.out.println("C=" + C);
    System.out.println("D=" + D);
    System.out.println("----------");
}

}


Die ausgabe **so** ist:
Aufgabe 2a:
A=(0,0)
B=(1023,1023)
C=(123,0)
D=(654,654)

wobei die Ausgabe eigentlich, **diese** sein müsste:
A=(511,511)
B=(1023,1023)
C=(123,0)
D=(654,321)

Nun hab ich die Aufgabenstellung immer und immer wieder wiederholt und gelesen und denke das es an den Punkt hier liegen muss:
**Der Standardkonstruktor soll die Koordinaten mit dem Wert 511 initialisieren.**

Wobei ich mir das aber nicht denken kann, da ich ja bereits einen Konstruktor (siehe unten):
```   public Punkt() {
     this.xpos = 0;
     this.ypos = 0;```

Müsste ich ja den eigentlich nur in 511 statt 0 umschreiben oder mit (siehe unten) aufrufen:
```new Punkt(511, 511);```

Aber das hilft alles nicht bei meinem Problem ausser das ich bei Punkt A=511 stehen habe aber die anderen zahlen nicht verändert werden (bei ausgabe) und das ich nicht auf das vorgegebene Ergebnis somit komme, versteht jemand was ich meine oder mein Problem :D

[ol]
[li]Herzlich Wilkommen im Forum!
[/li][li]Wir helfen gerne!
[/li][li]Danke, dass Du schon mal Codebeispiele gepostet und diese ordentlich Formatiert hast.
[/li][li]Verstehe ich Dein Post nicht so ganz…
[/li][/ol]
Ist das lange Codestück die Musterlösung?
Wenn ja, dass hilft uns das nicht weiter Dir zu helfen. Wir müssen **Deinen **Code sehen und dass möglichst als KSKB, also kompilierbar und auf das Problem begrenzt.

Soweit ich das verstanden habe ist Dein Problem das selbe, dass auch ich mit dem langen Codestück habe: 2 Konstruktoren.
Ein Konstruktor dient dazu die internen Variablen eines neuen Objekts der Klasse zu initialisieren, d.h.: die als Konstruktorparameter übergebenen Werte in den internen Variablen zu speichern.

Einer der beiden Konstruktoren hat keine Parameter. Dies ist der so genannte Default-Konstruktor. Im langen Codebeispiel setzt dieser Defaultkonstruktor die internen Variablen auf einen Standardwert (511).

Der zweite Konstruktor hat für jede interna Variable einen Parameter und sogt dafür, dass, falls diese ungültig sind, statt dessen gültige Werte (hier die nächstliegende Grenze) gespeichert werden.

Um Deinen Fehler genauer zu analysieren benötigen wir aber wie gesagt Deine Implementierung der Aufgabe.

bye
TT

1.Danke
2.Freut mich zu hören
4.Versuch ich es mal mit dem teil der Aufgabenstellung

Das lange Codestück ist mein eigener Code :o

Ich hab ein UML-Diagramm vorliegen und soll diesen in ein Code umschreiben was ich soweit gemacht habe, aber halt nur den Rahmen und bin dabei den nun Stück für stück mit leben zu füllen. Da ich mich aber noch nicht so sehr mit Java auskenne habe ich so einige verständlichkeits Probleme wie bspw mit den Funktionen und Methoden da diese am anfang für mich gleich aussahen und fast identisch sind,… (habe dann halt angefangen mit Java ist auch eine Insel zu lesen)

Ich füge mal die Aufgabenstellung hier ein, vielleicht hilft es etwas näher mein problem zu verstehen:
Der parametrisierte Konstruktor soll die übergebenen Werte den entsprechenden Attributen der Klasse zuweisen. Der Konstruktor soll prüfen ob die übergebenen Werte im zulässigen Bereich liegen und falls nicht, die Attribute auf die Grenzwerte des zulässigen Bereiches setzten. Der zulässige Bereich liegt zwischen 0 und maxpos. Der Standardkonstruktor soll die Koordinaten mit dem Wert 511 initialisieren.
Die Methoden getXpos, bzw. getYpos sind die Getter-Methoden der Attribute xpos und ypos.
Die Methode setXYpos soll die übergebenen Parameter den Attributen zuweisen.
Die Methode verschiebeUm soll eine Verschiebung des Punktes um die als Parameter übergebenen Werte durchführen und als Rückgabe den verschobenen Punkt liefern. Beachten Sie: Die Methode kann als Parameter entweder zwei ganze Zahlen oder ein Objekt vom Typ Punkt erhalten.

Wie bekomme ich denn den Code vom Debugger als KSKB? Ich arbeite mit Netbeans und hab den Debugger nur soweit kennengelernt das ich mir einen Breakingpoint machen kann und den Debugger dann Starte, um einfach zu sehen was genau an dieser einen stelle passiert,…

Sorry, dass ich Verwirrung stiftete.

Das was Du gepostet hast ist ein KSKB. Hast also alles richtig gemacht, ich habe es nur nicht erkannt.

Ich sehe jetzt auch deinen Fehler. Schau Dir Zeile 24 noch mal sehr genau an.

Man kann solche “Copy/Paste” fehler leicht vermeiden in dem man seinen Code vereinfacht. Im konkreten Fall heißt das Verfahren: extrahiere sich wiederholendes Verhalten in parametrisierte Methoden.

Was ist das wiederholte Verhalten? Es ist die Prüfung, ob sich die Koordinate außerhalb der erlaubten Grenzen befindet.
Diese Prüfung könnte man so verallgemeinern:private int garantiereInnerhalbGenzen(int koordinate){ if(0>koordinate) return 0; if(maxpos<koordinate) return maxpos; return koordinate; }Damit ändert sich der Code im Konstruktor zu:public Punkt(int xpos, int ypos) { this.xpos = garantiereInnerhalbGenzen(xpos); this.ypos = garantiereInnerhalbGenzen(ypos); } das ist alles!
Da wäre der Tippfehler sicher schneller aufgefallen.

Und genau darum gehts beim Programmieren (nicht nur in Java): Schreibe Code, der leicht zu verstehen ist und in dem Fehler leicht auffallen.

bye
TT

[QUOTE=Timothy_Truckle;117564]Sorry, dass ich Verwirrung stiftete.

Das was Du gepostet hast ist ein KSKB. Hast also alles richtig gemacht, ich habe es nur nicht erkannt.

Ich sehe jetzt auch deinen Fehler. Schau Dir Zeile 24 noch mal sehr genau an.

Man kann solche “Copy/Paste” fehler leicht vermeiden in dem man seinen Code vereinfacht. Im konkreten Fall heißt das Verfahren: extrahiere sich wiederholendes Verhalten in parametrisierte Methoden.

Was ist das wiederholte Verhalten? Es ist die Prüfung, ob sich die Koordinate außerhalb der erlaubten Grenzen befindet.
Diese Prüfung könnte man so verallgemeinern:private int garantiereInnerhalbGenzen(int koordinate){ if(0>koordinate) return 0; if(maxpos<koordinate) return maxpos; return koordinate; }Damit ändert sich der Code im Konstruktor zu:public Punkt(int xpos, int ypos) { this.xpos = garantiereInnerhalbGenzen(xpos); this.ypos = garantiereInnerhalbGenzen(ypos); } das ist alles!
Da wäre der Tippfehler sicher schneller aufgefallen.

Und genau darum gehts beim Programmieren (nicht nur in Java): Schreibe Code, der leicht zu verstehen ist und in dem Fehler leicht auffallen.

bye
TT[/QUOTE]

Wegen einen kleinen tippfehler suche ich den ganzen Tag danach,… Danke dir vielmals.
Habe noch einige Probleme =) jetzt habe ich eine weitere Klasse namens Polygon:


public class Polygon {
   private String bezeichnung;
   private Punkt[] eckpunkte;

   public Polygon() {
     eckpunkte = new Punkt[0];
     this.bezeichnung = "";
   }
 
   public Polygon(Punkt[] eckpunkte, String bezeichnung) {
     this.eckpunkte = eckpunkte;
     this.bezeichnung = bezeichnung;
   }

   public Polygon(Punkt[] eckpunkte) {
     this.eckpunkte = eckpunkte;
     this.bezeichnung = "";
   }
 
   public Punkt[] getEckpunkte() {
     return eckpunkte;
   }
 
   public int getAnzahlEcken() {
     return eckpunkte.length;
   }
 
   public void setEckpunkte(Punkt[] eckpunkte) {
     this.eckpunkte = eckpunkte;
   }
 
   public double[] berechneSeitenlaengen() {
     return new double[eckpunkte.length]; //TODO: berechnung
   }
 
   public double berechneUmfang() {
     return 0; //TODO: berechnung
   }
 
   @Override
   public String toString() {
     return Arrays.toString(eckpunkte);
   }
}```

Ich brauche folgendes, Das Attribut eckpunkte soll eine Liste mit Objekten der Klasse Punkt enthalten, die die Eckpunkte des Polygons, einen Polygonzug, enthalten. Ausserdem soll sollen die verbindung der Punkte das Polygon beschreiben und wie bekomme ich die Konstruktoren dazu das diese die Parameter den Attributen zuzuweisen ? Ach ja und ich weiss nicht wie ich einen neuen Punkt mit den berechnungen schreiben soll egal was ich versuche es ist nicht richtig und wird falsch angezeigt,..

Das tun sie doch schon!?

Nebenbei ein kleiner „Trick“: Man kann Konstruktoren auch andere aufrufen lassen. So muss man ggf. tests und Zuweisungen nur EINmal machen. Z.B:

   public Polygon() {
     this(new Punkt[0], "");
   }
 
   public Polygon(Punkt[] eckpunkte) {
     this(eckpunkte, "");
   }

   public Polygon(Punkt[] eckpunkte, String bezeichnung) {
     this.eckpunkte = eckpunkte;
     this.bezeichnung = bezeichnung;
   }
 

Ggf. müßtest du noch klären, ob es wie Liste von Punkten sein soll (also eine List<Punkt>) oder ein Array, so wie es jetzt bei dir ist.

Auch da wäre es wieder gut, wenn du schreiben würdest, WAS du versucht hast, und was „falsch angezeigt“ genau bedeutet. Aber du könntest z.B. eine Methode

public double abstand(Punkt anderer) {
    ....
}

in die Punkt-Klasse einfügen, und die dann später in „berechneSeitenlaengen“ verwenden…

[quote=Brexoi]Ich brauche folgendes, Das Attribut eckpunkte soll eine Liste mit Objekten der Klasse Punkt enthalten,[/quote]Der erfahrene Programmierer in mir schreit an der stelle auf, wo Du die “Liste” der Eckpunkte als Array definiert hast.
Ein Array ist keine Liste. Dafür hat Java das Interface List und verschiedene konkrete Klassen, die dieses Interface implementieren (wie beispielsweise ArrayList).

[quote=Brexoi;117569]und wie bekomme ich die Konstruktoren dazu das diese die Parameter den Attributen zuzuweisen ?[/quote]Das hast Du in der Klassse Polygon doch schon gemacht.

[quote=Brexoi;117569]Ach ja und ich weiss nicht wie ich einen neuen Punkt mit den berechnungen schreiben soll[/quote]Was genau willst Du tun? einen weiteren Punkt zum Polygon hinzufügen?

[quote=Brexoi;117569]egal was ich versuche es ist nicht richtig und wird falsch angezeigt,…[/quote]Da brauche ich wieder einen KSKB, der die flasche Ausgabe erzeugt und genaue Angaben, was Du erwartest (also genau so wie im TO-Posting).

bye
TT

Dann willst du mein KSKB nicht sehen :smiley:
ich weiss das es falsch ist und bitte denke daran das ich nur am rumversuchen war :smiley:

     for ( eckpunkte = 1 ; eckpunkte < eckpunkte.length ; eckpunkte++ );
       berechneUmfang += abstand( polygon[eckpunkte-1], polygon[eckpunkte] ) ; 
    berechneUmfang += abstand( Punkt[eckpunkte.length-1], Punkt[0] ) ; 

   }```

Ich brauche die berechnung für die Seitenlänge und den Umfang.
Momentan habe ich als Ausgabe:

Aufgabe 2b:
Polygon 1: mit N= 4, U= 0.0 und den Koordinaten P=[(511,511), (1023,1023), (123,0), (654,321)]

**Erwarte** aber:
Polygon 1: Testpoly mit N=4, U=2944.908019422271 und den Koordinaten P=[(511,511), (1023,1023), (123,0), (654,321)]

Also erstens glaube ich du hast einen Tippfehler drin.
Deine Zählvariable und dein Array haben am Anfang den selben Namen “eckpunkte” und später heißt dein Array “polygon”.
Das würde so erst garnicht funktionieren, ich gehe mal von einem Copy/Paste Fehler aus.

Abstände können auch negativ sein, weshalb du das Ergebniss von abstand() per Math.abs() entnegativieren solltest vor der Rückgabe.
Deshalb kommt wahrscheinlich “0” heraus.

Außerdem berechnest du den Abstand in einer Schleife von Punkt zu Punkt und addierst zu diesem Abstand nochmal den Abstand zwischen dem Punkt und dem start-Punkt hinzu in jedem Schleifendurchlauf!
Mal abgesehen davon das die Rechnung sowieso nicht stimmt weil wenn eckpunkt = 1 ist dann ist eckpunkt-1=0 und damit berechnest du den Abstand zwischen Punkt 0 und 0 und der ist =0; musst du das außerhalb der Schleife packen und den Abstand zwischen polygon[0] und dem letzten Eintrag im Array berechnen.

Grüße
TMII

PS: Meine Tastatur spinnt gerade komplett und schreibt was sie will, Rechtschreibfehler bitte einpacken und zurück schicken.

[quote=Brexoi]ich weiss das es falsch ist[/quote]Falsch ist es, wenn das gewünschte Ergebnis nicht erreicht wird. Alles andere ist per se erst mal richtig.

Dann kann (und sollte) man sich noch darüber unterhalten, ob dass was man da produziert hat die Anforderungen an guten Code erfüllt. Welche Anforderungen das sind steht für mich in Onkel Bobs Buch Clean Code.

Und in diesem Sinne sind Arrays mit Bedacht einzusetzen. Ich selbst greife lieber zu einer der vielen Implementierungen des [JAPI]Collection[/JAPI] Interfaces oder je nach Bedarf auch einer einer Spezialisierungen. Und in Deinem Fall, wo Du meinem Verständnis nach weitere Elemente anfügen willst sind Arrays ehr unhandlich, da sie zur Laufzeit nicht wachsen können.

[quote=Brexoi;117574]Ich brauche die berechnung für die Seitenlänge und den Umfang.
Momentan habe ich als Ausgabe:

Aufgabe 2b:
Polygon 1: mit N= 4, U= 0.0 und den Koordinaten P=[(511,511), (1023,1023), (123,0), (654,321)]

Erwarte aber:
Polygon 1: Testpoly mit N=4, U=2944.908019422271 und den Koordinaten P=[(511,511), (1023,1023), (123,0), (654,321)][/quote]Die Frage nach dem Umfang ist leicht gelöst: Die Methode, die den Abstand zweier Punkte berechnet scheint noch nicht fertig zu sein.

bye
TT

Okay da liegt mein fehler, ich kann bzw weiss nicht wie ich die methode “abstand” schreiben soll und wo ich diese packen sollte.
Ich meine (vermute) das ich weiss wie das geht, aber nicht niederschreiben kann.
Ich bräuchte zur berechnung des Abstandes zwei Koordinaten sprich A und B die Seitenlänge währe ja dann
AB = Wurzel (B1 - A1)² + (B2 - A2)²

Mein A und B in dem bsp sind bei mir xpos/ypos und in einer anderen Klasse unzwar unter der Klasse Punkte:

public class Punkt {
    
   private final static int maxpos = 1023;
   private int xpos;
   private int ypos;

   public Punkt(int xpos, int ypos) {
     this.xpos = xpos;
     this.ypos = ypos;
     
    if(xpos<0) {
    this.xpos = 0;
  } else if(xpos>maxpos) {
    this.xpos=maxpos;
  } else {
    this.xpos=xpos;
  }
   if(ypos<0) {
    this.ypos = 0;
  } else if(xpos>maxpos) {
    this.ypos=maxpos;
  } else {
    this.ypos=ypos;
  }
   }

   public Punkt() {
     this.xpos = 511;
     this.ypos = 511;
      }

   public int getXpos() {
     return this.xpos;
   }

   public void setXYpos(int xpos, int ypos) {
     this.xpos = xpos;
     this.ypos = ypos;
   }

   public int getYpos() {
     return this.ypos;
   }

   public Punkt verschiebeUm(int deltax, int deltay) {
     return new Punkt(xpos + deltax, ypos + deltay);
   }

   public Punkt verschiebeUm(Punkt deltaxy) {
     return new Punkt(xpos + deltaxy.xpos, ypos + deltaxy.ypos);
   }

   public String toString() {
     return "(" + xpos + "," + ypos + ")";
   }
 
}```

Falls mein gedanke soweit richtig ist, bin ich vielleicht dadurch verwirrt das ich diese in der Klasse Polygon nicht verwenden kann,..

Wenn ich die Seitenlänge hätte kann ich die Formel für den Umfang nutzen (glaub ich)

Mein Problem liegt eher darin, das ich nicht gerade genau weiss, wie ich das ganze niederschreibe und einfüge,
da kommt noch hinzu das meine Koordinaten/Punkte ("Seitenlänge") in einer anderen Klasse sind und ich nicht weiss (vielleicht mit Super, hab ich gelesen,..) wie ich diese in die andere Klasse bekomme,.. falls mein gedankengang soweit überhaupt richtig ist,.. 

Kann mir jemand an dem Punkt vielleicht einen kleinen stupser geben und mir das "alles" zur verfügung stellen wenn es nicht zu viel verlangt ist..?

Das A und das B in diesem Beispiel sind die Punkte.
A1 ist dann xpos von Punkt A
A2 ist dann ypos von Punkt A

Wenn die Methode dann definiert ist als

class Punkt {
    public double abstand(Punkt B) {
        ...
    }
}

kannst du in der Polygon-Klasse einfach schreiben

public double berechneUmfang() {
    double umfang = 0;
    for (int i=0; i<eckpunkte.length-1; i++)
    {
        umfang += eckpunkte**.abstand(eckpunkte[i+1]);
    }
    return umfang;
}

Einer der Hauptgründe, warum es bisher nicht funktioniert hat, ist übrigens subtil:

                                                                  v Böses Semikolon!
for ( eckpunkte = 1 ; eckpunkte < eckpunkte.length ; eckpunkte++ );

[quote=Marco13]Wenn die Methode dann definiert ist als class Punkt { public double abstand(Punkt B) { ... } }
kannst du in der Polygon-Klasse einfach schreibenpublic double berechneUmfang() { double umfang = 0; for (int i=0; i<eckpunkte.length-1; i++) { umfang += eckpunkte**.abstand(eckpunkte[i+1]); } return umfang; }[/quote]
Diese Variante hat 2 große Vorteile gegenüber der Abstandsberechnung im der Polygon-Klasse: Du musst die Abstandsberechnung nicht in jeder weiteren Geometrie-Klasse (zum Beispiel in einer zukünftigen Klasse Kreis) wiederholen und falls die Welt irgendwann mal 3-dimensional wird ist nur die Punkt-Klasse anzupassen, alle anderen Klassen, die Abstände von Punkten verwenden sind dann automatisch 3D…

bye
TT

Danke euch beiden, habe auch weiter rumprobiert und bevor ich aber jetzt das von Maroc übernehme/benutze, würde ich gern wissen wo der fehler an meinem kleinen versuch liegt:

       double[] result = new double[eckpunkte.length]; 
     for (i from 0 to result.lenght) {
       double[] dx = eckpunkte[(i + 1) % eckpunkte.lenght].x - eckpunkte**.x;
       double[] dy = eckpunkte[(i + 1) % eckpunkte.lenght].y - eckpunkte**.y;
       result** = Math.sqrt(dx * dx + dy *dy);
   }
     return result;
   }```

Solche Kleinigkeiten, wie dass “dx” und “dy” keine Arrays sind, und es demnach nicht
double[] dx =…
sondern
double dx =…
heißen müßte, solltest du so langsam (d.h. so schnell wie möglich) selbst erkennen.

EDIT: Ich bin übrigens Deutscher.

Ja da gebe ich dir recht und ich gebe mir mühe das beizubehalten, aber auch wenn ich das ändere, der fehler liegt bei lenght immerhin zeigt er mir nur .lenght rot unterstrichen an sowie Zeile 3,…

Entschuldige, das sollte natürlich Marco heißen, hab es nicht bemerkt bis ich darüber nachdenken musste was du mit deinem Edit meinst,…

Hab nen fehler in Zeile 3 …
for (int i = 0; i < result.lenght; i++) {

Aber dennoch bleibt der fehler überall bei .lenght,…

Es musst auch **length **heißen.

ja hab es gerade auch gesehen :idea:

*** Edit ***

Der ganze Code scheint zu funktionieren aber macht nicht das was er sollte,…
Ausserdem soll die berechneUmfang methode falsch sein,…

   public double berechneUmfang() {
    double umfang = 0;
    for (int i=0; i<eckpunkte.length-1; i++)
    {
    umfang += eckpunkte**.abstand(eckpunkte[i+1]);
    }
    return umfang;
}```
 
Was mir eher viel wichtiger ist, ich hab das problem das ich nicht mehr durchblicke und immer noch nicht weiss wie ich die 
Abstand methode schreiben soll, welche Punkte bzw Koordinaten benutzen muss

public double abstand(Punkt B) {
return //rechnung?!
}```

Der Abstand von 2 Punkten ist eigentlich ein Mathematisch einfaches Problem und wird z.B. hier erklärt Abstand zweier Punkte - Mathebibel.de
Das heißt du must nur die Rechnung, die dort beschrieben wird in deinen Programmcode schreiben und fertig.

könnte also wie folgt aussehen:

public double abstand(Punkt b) {
   //rechnung?!
   int x=this.xPos-b.getXPos;
   int y=this.yPos-b.getYPos;	
   return Math.sqrt((x*x)+(y*y));
}

generell sollte man Variablennamen klein schreiben und jedes neue Wort dann mit einem Großbuchstaben CamelCase - Wikipedia, the free encyclopedia

Dann wäre es hilfreich wenn du schreibst WAS nicht funktioniert, und wie du es dir erwartest.
Am besten wäre noch ein KSKB wo man den Fehler nachvollziehen kann.

Schaut für mich auf den ersten Blick gut aus!