Programmieraufgabe - Grafische Oberfläche- falsches Ergebnis?

TomatenBrot447

Mitglied
Hallo,
ich versuche mich zurzeit an einner Aufgabe vom letzten Jahr aus der Uni. Diese Aufgabe ist eher für Java anfänger. Ich sitze schon seit einigen Wochen an der Aufgabe und kann meinen Fehler einfach nicht erkennen.
Ich weiß jetzt nicht, wie ich euch das jetzt am besten hier berichte, damit ihr meinen Fehler eventuell bemerkt und mir mitteilen könnt was denn jetzt genau nicht richtig ist.
Ich werde versuchen euch mein Problem etwas strukturiert hier darzulegen damit ihr mir folgen könnt. Zunächst einmal poste ich euch die Aufgabe (bzw. worum es in dieser aufgabe überhaupt geht) im Anschluss daran poste ich MEINE Bemühungen (also meinen Quellcode) und eventuell auch screenshots.
Ich hoffe ihr könnt mir helfen. Am Mittwoch diese Woche schreibe ich ne Prüfung und ich will da fit sein. Ich hoffe ich kann auf euch zählen 😀
 

Anhänge

import java.awt.Polygon;
import java.awt.Point;

public class Isogon extends Polygon {

private Point mitte;
private int startwinkel;
private int radius;

public Isogon(){

}

public Isogon(int mitteX,int mitteY,int radius , int anzahlEcken){
this.mitte=new Point(mitteX,mitteY);
super.addPoint(this.mitte.x, this.mitte.y);
this.radius=radius;
this.npoints=anzahlEcken;

for (int i = 0; i < this.npoints; i++) {
Point a;
xpoints= (int)Math.round(this.radius* Math.cos(2*Math.PI*i/this.npoints));
ypoints= (int)Math.round(this.radius* Math.sin(2*Math.PI*i/this.npoints));
a = new Point(xpoints,ypoints);

}

}
public Isogon(int mitteX,int mitteY,int radius , int anzahlEcken, int startwinkel){
this.mitte=new Point(mitteX,mitteY);
super.addPoint(this.mitte.x, this.mitte.y);
this.radius=radius;
this.npoints=anzahlEcken;
this.startwinkel=startwinkel;

for (int i = 0; i < this.npoints; i++) {
xpoints= (int)Math.round(this.radius* Math.cos(Math.toRadians(this.startwinkel)+(2*Math.PI*i/this.npoints)));
ypoints= (int)Math.round(this.radius* Math.sin(Math.toRadians(this.startwinkel)+(2*Math.PI*i/this.npoints)));
super.addPoint(xpoints, ypoints);

}

}

public void setEckenzahl(int anzahlEcken){
this.npoints=anzahlEcken;
}
@Override
public void translate (int deltaX, int deltaY){

}
public void rotiere(int winkel){

}



public void verschiebeAufNeueMitte(int mitteX,int mitteY){

}

@Override
public void addPoint(int x, int y){
System.out.println("Das Hinzufügen von Koordinatenpunkten macht bei einem regelmäßigen Polygon keinen Sinn!");
}

@Override
public String toString(){
return "a";
}




}
 
Keine Lust mir das jetzt alles durchzulesen aber ich wette es ist mal wieder das übliche Problem dass du mit einem Grad Winkel rechnest obwohl cos aber eine Rad Winkel erwartet...
 
nein , wie du siehst verwende ich doch die Methode
"xpoints= (int)Math.round(this.radius* Math.cos(Math.toRadians(this.startwinkel)+(2*Math.PI*i/this.npoints)));"
also das kann es nicht sein.
 
das ist wirklich nicht viel. Die aufgabe verstehste in 3 min und wenn du dir meinen Quellcode in deine Entwicklungsumgebung kopierst dann haste das schon. Das sind eigentlich nur zwei Konstruktoren worauf es ankommt. Das ist viel weniger als du denkst.
 
Du errechnest in diesem Konstruktur ständig einen Point a, du machst aber gar nichst damit ?

Code:
public Isogon(int mitteX,int mitteY,int radius , int anzahlEcken){
this.mitte=new Point(mitteX,mitteY);
super.addPoint(this.mitte.x, this.mitte.y);
this.radius=radius;
this.npoints=anzahlEcken;

for (int i = 0; i < this.npoints; i++) {
Point a;
xpoints= (int)Math.round(this.radius* Math.cos(2*Math.PI*i/this.npoints));
ypoints= (int)Math.round(this.radius* Math.sin(2*Math.PI*i/this.npoints));
a = new Point(xpoints,ypoints);

}

}
 
Ich kann mich dran erinnern, vor geraumer Zeit, nicht allzu langer Zeit, das selber gemacht zu hab, und das kam bei raus:
LqiNjDt.png

Ich glaub, das ist auch das von @JStein52 , und die Methode sah ungefähr so aus:
Java:
        regpoly(g, Color.red, 3, 50, 100, 100);
        regpoly(g, Color.blue, 4, 50, 150, 150);
        regpoly(g, Color.yellow, 5, 50, 200, 200);
        regpoly(g, Color.green, 6, 50, 250, 250);
        regpoly(g, Color.magenta, 7, 50, 300, 300);

Nun ist die Frage, ob dir das iewie helfen könnte. Ich hab nämlich auch nicht die komplette Aufgabenstellung der PROJEKTaufgabe gelesen, das erscheint mir doch etwas viel, und auch nach Hausaufgaben!
 
Du errechnest in diesem Konstruktur ständig einen Point a, du machst aber gar nichst damit ?
JStein52 hat recht das kann so nicht funktionieren. Isogon wird von Polygon abgeleitet. Das bedeutet Du berechnest die notwendigen Punkte richtig und fügst diese mittels der Methode super.addPoint(x, y) zu Deinem Isogon. Thats it!!.
Stolperstein ist hier vielleicht, den Mittelpunkt richtig mit einzubeziehen.
super.addPoint(this.mitte.x, this.mitte.y);
Das stimmt so nicht, da der Mittelpunkt zum Zeichnen von Polygon nicht verwendet wird.

xpoints= (int)Math.round(this.radius* Math.cos(2*Math.PI*i/this.npoints));
ypoints= (int)Math.round(this.radius* Math.sin(2*Math.PI*i/this.npoints));
Auch hier fehlt der Winkel zur Berechnung der Polarkoordinaten und der Mittelpunkt.
Tipp: Angabe genau lesen! 🙂
 
Hier der Code für das Isogon.
Code:
import java.awt.Point;
import java.awt.Polygon;
public class Isogon extends Polygon {
    private static final long serialVersionUID = 1L;
    private Point mitte = null;
    private int radius = 0;
    private int numEcken = 0;
    public Isogon(int mitteX, int mitteY, int radius, int numEcken) {
        this.mitte = new Point(mitteX, mitteY);
        this.radius = radius;
        this.numEcken = numEcken;
        double alpha = 360.0 / numEcken;
        for (int n = 0; n < numEcken; n++) {
            int xp = (int) Math.round(radius * Math.cos(alpha + (2 * Math.PI * n) / numEcken)) + mitteX;
            int yp = (int) Math.round(radius * Math.sin(alpha + (2 * Math.PI * n) / numEcken)) + mitteY;           
            super.addPoint(xp, yp);
        }
    }
    public Point getMitte() {
        return mitte;
    }
    public int getNumEcken() {
        return numEcken;
    }
    public int getRadius() {
        return radius;
    }
}
 
Zuletzt bearbeitet:
Hier eine Testklasse!
Code:
import java.awt.Graphics;
import java.awt.Point;
import javax.swing.JPanel;

public class TestPanel extends JPanel {
    private static final long serialVersionUID = 5563895549797564727L;
    private Isogon[] isogons = null;
    public TestPanel(int maxEcken, int radius) {   
        isogons = new Isogon[maxEcken - 2];
        int x = radius ;
        for (int n = 3; n <= maxEcken; n++) {
            isogons[n - 3] = new Isogon(x, x, radius, n);
            x+=radius+10;
        }
    }
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);        
        for (int i = 0; i < isogons.length; i++) {
            Point m = isogons[i].getMitte();
            g.drawPolygon(isogons[i]);
            g.drawLine(m.x, m.y, m.x, m.y); // test middle point       
        }
    }
}
Code:
import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JFrame;

public class start {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setPreferredSize(new Dimension(300, 300));
        frame.add( new TestPanel(7, 30), BorderLayout.CENTER );
        frame.pack();
        frame.setVisible(true);
    }
}
😉
 
Ich kann mich dran erinnern, vor geraumer Zeit, nicht allzu langer Zeit, das selber gemacht zu hab, und das kam bei raus:
LqiNjDt.png

Ich glaub, das ist auch das von @JStein52 , und die Methode sah ungefähr so aus:
Java:
        regpoly(g, Color.red, 3, 50, 100, 100);
        regpoly(g, Color.blue, 4, 50, 150, 150);
        regpoly(g, Color.yellow, 5, 50, 200, 200);
        regpoly(g, Color.green, 6, 50, 250, 250);
        regpoly(g, Color.magenta, 7, 50, 300, 300);

Nun ist die Frage, ob dir das iewie helfen könnte. Ich hab nämlich auch nicht die komplette Aufgabenstellung der PROJEKTaufgabe gelesen, das erscheint mir doch etwas viel, und auch nach Hausaufgaben!
Ich habe doch gesagt : Das sind keine Hausaufgaben. Wie du in der PDF sehen kannst ist die Aufgabe vom Sommersemester 2016! Ich versuche nur die Aufgaben FÜR MICH zu lösen damit ich auf die kommende Prüfung besser vorbereitet bin 😀
 
Hier eine Testklasse!
Code:
import java.awt.Graphics;
import java.awt.Point;
import javax.swing.JPanel;

public class TestPanel extends JPanel {
    private static final long serialVersionUID = 5563895549797564727L;
    private Isogon[] isogons = null;
    public TestPanel(int maxEcken, int radius) {  
        isogons = new Isogon[maxEcken - 2];
        int x = radius ;
        for (int n = 3; n <= maxEcken; n++) {
            isogons[n - 3] = new Isogon(x, x, radius, n);
            x+=radius+10;
        }
    }
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);       
        for (int i = 0; i < isogons.length; i++) {
            Point m = isogons[i].getMitte();
            g.drawPolygon(isogons[i]);
            g.drawLine(m.x, m.y, m.x, m.y); // test middle point      
        }
    }
}
Code:
import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JFrame;

public class start {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setPreferredSize(new Dimension(300, 300));
        frame.add( new TestPanel(7, 30), BorderLayout.CENTER );
        frame.pack();
        frame.setVisible(true);
    }
}
😉
Da ich selber anfänger bin, weiß ich leider nicht was du jetzt mit "Testklasse " meinst ...
 
Du errechnest in diesem Konstruktur ständig einen Point a, du machst aber gar nichst damit ?

Code:
public Isogon(int mitteX,int mitteY,int radius , int anzahlEcken){
this.mitte=new Point(mitteX,mitteY);
super.addPoint(this.mitte.x, this.mitte.y);
this.radius=radius;
this.npoints=anzahlEcken;

for (int i = 0; i < this.npoints; i++) {
Point a;
xpoints= (int)Math.round(this.radius* Math.cos(2*Math.PI*i/this.npoints));
ypoints= (int)Math.round(this.radius* Math.sin(2*Math.PI*i/this.npoints));
a = new Point(xpoints,ypoints);

}

}
Ja natürlich mach ich nichts damit. Erst wenn ich in der Hauptklasse ein Objekt erzeuge und meine Parameter eingebe, mache ich was damit . Oder hab ich da was falsch verstanden???
 
Ja natürlich mach ich nichts damit. Erst wenn ich in der Hauptklasse ein Objekt erzeuge und meine Parameter eingebe, mache ich was damit . Oder hab ich da was falsch verstanden???
Wenn Deine Klasse Isogon erzeugt wird, wird deren Konsturktor aufgerufen. Dort berechnest Du Die notwendigen Punkte. Die berechneten Koordinaten werden aber, da es sich
1) um lokale Variablen handelt nach verlassen des Konstruktors gelöscht.
2) überschreibst Du die beiden int xpoints, und ypoints bei jedem Schleifendurchlauf.
Ziel ist es alle Punkte zu berechnen und sich zu merken, um diese für das Zeichnen verwenden zu können.
Polygon hat das schon implementiert und mittels der Methode addPoint der Klasse Polygon wird das erledigt. Siehe meine Klasse Isogon.🙄
 

Zurück
Oben