Berechnung der Polygonfläche einer Nutzungsart und Max-, Minwert dieser Flaechen

ala

Grünschnabel
Hallo an alle,
ich habe so zu sagen ein Problem, ich habe die Klasse für Berechnung der Polygonflaechen soweit fertig, es funktioniert nur teilweise, wenn ich nur bestimmte Flächen einer Nutzungsart bei mir z.B. zwei Rechtecke rechnen will, bekomme ich das Ergebnis der Gesamtflaeche der Polygone und Max,- Minwert werden auch nicht für eine bestimmte Flaeche berechnet. Könnte jemand nach schauen und mir sagen wo mein Fehler liegt ich wäre euch dankbar.... Ich habe noch Klasse Punkt2D und Klasse Ausnahme definiert aber in diese drei Klassen sind meine Probleme ich habe verschiedene Varianten versucht aber es ging leider nicht ich weiß, dass es sehr einfach ist aber ich komme einfach nicht drauf bitte um hinweise bedanke mich im Vorrraus.......

Code:
package berechnung;
//Bauplan der Klasse polygon
public class Polygon {
	/*Attribut der Klasse: ein 1D-feld mit elementen vom Typ Punkt2D.
	 * Liste von Punkten, in einem Feld verwaltet.
	 */
	Punkt2D[]p;
	String name;
	
	/*Konstruktor für die Prägung von Objekten der Klasse: 
	 * der Uebergabeparameter beschreibt ein Polygon
	 */
	public Polygon(String n, Punkt2D[]p){
		name=n;
		this.p=p;
	}
	

	/*Eine Methode zur Berechnung der Fläche eines Polygons
	 * nach Gaußschen-Trapezformel.
	 * Es wurde auch eine Klasse deklariert, deren Objekte bei Ausnahme geworfen werden.
	 */
	public double flaeche()throws Ausnahme{
		//n ist als gesamtanzahl der Punkte definiert
		int n=p.length-1;
		//eine variable Flaeche wird erzeugt
		double flaeche=0;

		/*Mit einer for-Schleife wird die Summe aller,
		 *von zwei aufeinander folgenden Punkten erzeugte, Trapezflächen berechnet.		
		 */
		for(int i=0; i<n; i++){
			flaeche+= (p[i].y+p[i+1].y)*(p[i].x-p[i+1].x);
					}
		// der Anfangswert der Fläche : (Yn+Y1)*(Xn-X1).
		flaeche+= (p[n].y+p[0].y)*(p[n].x-p[0].x);
		//Aufgrund doppelte Flaechenberechnung wird um genaue Flaeche zuerhalten halbiert
		flaeche=flaeche/2;
		//die Flaeche wird zurückgegeben
	
	if(flaeche==0){
		Ausnahme e=new Ausnahme("Nicht alle Punkte der Flaeche wurde in der Liste eingetragen!");
 throw e;}
     return flaeche;
	}
		// Rückgabe den gesuchten Wert.
	
	//Ausgabe der Punktefolge auf Shel, 
	public void print(){
		for(int i=0; i<p.length; i++){
		System.out.println("Punkt "+p[i].name+", ("+p[i].x+" , "+p[i].y+" );");
		System.out.println();
	}
		
	}
	
	public String getname() {
		// TODO Auto-generated method stub
		return name;
	}
}
Code:
package berechnung;

public class RaumBodenFlaeche {
	Polygon[]r;
	public RaumBodenFlaeche(int anzFlaeche){
		r= new Polygon[anzFlaeche];
	}
 public void getRaum(int name, Polygon p){
	  r[name]=p;
  }
	public double berechneFlaecheDesRaums(String id) throws Ausnahme{
		double flaeche=0;
		
		for(int i=0; i<r.length; i++){
			if(r[i].name != id){
	    		 flaeche+=r[i].flaeche();
	    	 }
			
		}
		return flaeche;
		
	}
	
	public  double berechnungGesamtflaeche()throws Ausnahme{
		/* Pruefen :
	     * wenn Anzahl von Elementen im Feld kleiner als 2 ist, dann 
	     * wird das Programm beendet und auf der Shell erscheint entsprechende message.
	     */
		
       if(r.length<=1){
			/*Ein neues Objekt vom Typ Ausnahme wird erzeugt.
			 *Der Konstruktor wird aufgerufen und der Text der Message wird übergeben.
			 */
			
          Ausnahme e=new Ausnahme("Gegebener Flaeche existiert nicht!");
			//Die Methode wirft ein objekt vom typ Ausnahme,wenn ein Sonderfall auftritt.
	    throw e;
		}
		//Der Anfangswert der Fläche ist Null.
		
       double gesamtflaeche=0;
		//Eine for-schleife, die die Fläche aller Raeume zusammenaddiert. 
		
     for(int i=0; i<r.length;i++){
		
      gesamtflaeche=gesamtflaeche+r[i].flaeche();
		}
		//Rückgabe der Fläche.
return gesamtflaeche;
	}//eom
	
	public Polygon maxWert() throws Ausnahme{
		
		Polygon max=r[0];
			for(int i=1; i<r.length; i++){
				if(max.flaeche() < r[i].flaeche())max = r[i];
			}
			return max;
	}
	
	  public Polygon minWert() throws Ausnahme{
		  Polygon min=r[0];
    	  for(int i=1; i<r.length; i++){
    		  if(min.flaeche() > r[i].flaeche())min = r[i];
    	  }
    	  return min;
      }
	  public double mittelwert() throws Ausnahme{
	   double mittelwert=0;
	   for (int i=0; i<r.length; i++){
		   mittelwert+= r[i].flaeche(); 
	   }
	   return mittelwert/r.length;
   }
	  public String toString() {
		  for(int i=0; i<r.length; i++){
		    String s = null;
			try {
				s = "Name: " + r[i].name  + " | Flaeche: "+ r[i].flaeche();
			} catch (Ausnahme e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		    return s;}
		return null;
		  }

}//eoc
Code:
package anwendung;

import berechnung.*;


public class Anwendung {
	public static void main(String[]args){
// I. Berechnung des Flächeninhalts eines Polygons.
		
		/* Es wird versucht das Programm weiter ausführen, unter der Bedingung,
		 *  dass keine Ausnahme eintritt, die eine Ausnahme wirft.		
		 */
		try {	
		//a). Ein Rechteck. 
		System.out.println("Test1: Berechnung der Fläche eines Rechtecks ");	
		/* Es wird ein 1D-feld erzeugt.
		 * Die Elemente des Felds sind Objekte vom Typ Punkt2D, die ein Polygon beschreiben.
		 * Jeder Punkt wird mit einer Name identifiziert und besitz zwei Koordinaten x,y.
		 */
	
	Punkt2D []test1=new Punkt2D[]{
			    new Punkt2D("A",1,1),
		        new Punkt2D("B",2,1),
		        new Punkt2D("C",2.0,2.0),
		        new Punkt2D("D",1,2)};
	Polygon polygon1=new Polygon("Rechteck",test1);
	polygon1.print();
	System.out.println("Fläche  "+polygon1.flaeche()+" m**2");
	System.out.println("Test2: Berechnung der Fläche eines Rechtecks ");
	Punkt2D []test2=new Punkt2D[]{
			    new Punkt2D("A",1,1),
		        new Punkt2D("B",2,1),
		        new Punkt2D("C",2.0,2.0),
		        new Punkt2D("D",1,2)};
          /*Ein neues Objekt vom Typ Punkteliste wird erzugt.
           *Konstruktor wird aufgerufen. Im wurde das 1D-feld übergeben. 
           */
	
	Polygon p2= new Polygon("Rechteck1", test2);
	p2.print();
	System.out.println("                  ");
		//Eine methode wird aufgerufen um das Feld auf der Shell auszugeben.
		
		
		//Eine methode flaecheBerechnung()wird aufgerufen um der Fläche des Polygons zu berechnen.
		System.out.println("Fläche des zweiten Rechtecks  "+p2.flaeche()+" m^2");	
		//System.out.println(p2.getname()+", ");
		System.out.println("               ");		
		
		Punkt2D []test3=new Punkt2D[]{
			    new Punkt2D("A",1,0),
		        new Punkt2D("B",5,2),
		        new Punkt2D("C",4,5),
		        new Punkt2D("D",2,4)};

	Polygon polygon3=new Polygon("Trapez",test3);
		polygon3.print();
		
		System.out.println("Fläche "+polygon3.flaeche()+" m^2");
				
		
		RaumBodenFlaeche r= new RaumBodenFlaeche(3);
		r.getRaum(0,polygon1);
		r.getRaum(1, p2);
		r.getRaum(2, polygon3);
		r.berechneFlaecheDesRaums(null);
				r.berechnungGesamtflaeche();
				
				r.maxWert();
				r.minWert();
				r.mittelwert();
				System.out.println(r.berechneFlaecheDesRaums()+" ,"+r.berechnungGesamtflaeche()+" ,"+r.mittelwert()+" ,"+r.maxWert()+" ,"+r.minWert() );
	}
		catch (Ausnahme e) {
			System.out.println("Keine  Loesung berechenbar:"
			+ e.getMessage());
			
			
		}

				System.out.println("Test eines Ausnahmefalls: Anzahl der Flaechen=0 ");
}
}
 
Hi ala,

  1. die [ JAVA ] - Tags sind eher zu empfehlen als die [ CODE] - Tags
  2. verstehe ich nicht ganz, warum du in der Methode RaumBodenFlaeche.berechneFlaecheDesRaumes(String) eine ID übergibst (wovon ich ohne Kommentar ausgehen würde, das genau das Element mit diesem Namen gesucht wird) und dann alle außer dem Element mit der übergebenen ID für die Flächenberechnung heranziehst...
    Die Methode RaumBodenFlaeche.berechnungGesamtflaeche() macht dann quasi genau das selbe, nur summiert sie die Fläche aller Elemente und lässt eben nicht dieses eine aus.


Viele Grüße
Carron
 
Danke für deine Antwort, ich wollte ja als javatags einfügen aber ehrlich ich weiß nicht wie das hier geht, zu der Aufgabe ich muss die Flächen einer bestimmten Nutzungsraum mit einander summieren können, und die maximale-, minimale-, und mittel- Wert einer bestimmten Nutzungsart ausgeben lassen, in der Aufgabenstellung steht, dass man eine Methode implementieren soll, die zusätzlich zur geometrischen Erfassung der Raumbodenflächen als Polygon Informationen zur Nutzungsart in einer Zeichenkette speichert. Ich weiß nicht genau wie ich diese definieren soll, damit die anderen Methoden funktionieren, wäre schon wenn du noch hinweise mir geben wurdest oder gar Beispiele, danke im Vorraus....
 
Wenn ich das recht verstehe, geht es dir zusätzlich zu deinen Polygon-/Flächen-Berechnungen darum noch weitere Informationen (wie beispielsweise eine Bezeichnung) zu hinterlegen.

Sollte dafür dein im Polygon bereits enthaltener Name:
Java:
public Polygon(String n, Punkt2D[]p){
    name=n;
    this.p=p;
}

nicht ausreichen, kannst du auch noch einen weiteren Parameter in Polygon einführen oder zusätzliche Klassen (gemäß deiner geforderten Nutzungsarten) von Polygon erben lassen und die Zusatzfunktionen ergänzen.

zum Beispiel:
Java:
public class Besenkammer extends Polygon {

    Putzmittel[] bestand;

    public Besenkammer(Putzmittel[] bestand, String name, Punkt2D[] punkte) {
        super(name, punkte);
        setBestand(bestand);
    }

    public Putzmittel[] getBestand() {
        Putzmittel[] kopie = new Putzmittel[this.bestand.length];
        System.arraycopy(this.bestand, 0, kopie, 0, kopie.length);
        return kopie;
    }

    public void setBestand(final Putzmittel[] bestand) {
        this.bestand = new Putzmittel[bestand.length];
        System.arraycopy(bestand, 0, this.bestand, 0, bestand.length);
    }
}


Ich hoffe es ist nachvollziehbar, was ich meine ;)


Gute Nacht
Carron
 

Neue Beiträge

Zurück