# klasse vektor addition



## jazzcookie (27. Nov 2009)

hi,
ich muss eine klassemit dem namen "Vektor3d" anlegen.die koordinaten im lR^3 sollen durch die drei membervariablen x,y,z dargestellt werden.zu implementieren ist eine Vektoraddition "public Vector3d add(Vector3d v)".meine versuche sehen bis jetzt so aus


```
package de.tum.ws2009.grprog.uebungsblatt05.geometricobjects;

public class Vector3d {
//member variablen
	double x,y,z;
	
	public static void main (String[] args)//die main funktion
	{
		
	}
	
	public Vector3d add(Vector3d v)//die vektoradditionsfunktion
	{
		Vector3d a=v;
		
		return a;
	}
}
```

ich denke ich habe die membervariablen angelegt und ich weiss, dass die methode "public Vector3d add(Vector3d v)" einen wert des datentyps Vector3d zurueckgeben muss.
ich denke,dass a nun auch vom typ Vector3d ist.
wie hole ich mir aus den 3 membervariablen genuegend werte um 2 allgemeine vektoren zu bekommen um sie anschliessend zu addieren und ausgeben zu koennen??


----------



## KrokoDiehl (27. Nov 2009)

Kleines Verständnisproblem liegt hier vor:

```
public void add(Vector3d vector)
```
Diese Methode soll den angegebenen Vektor _vector _zum dem _this _, sprich dem Objekt an dem diese Methode aufgerufen wird, addieren:

```
Vector3d vec1 = new Vector3d(1, 1, 1);
Vector3d vec2 = new Vector3d(2, 2, 2);
vec1.add(vec2);
// nun muss vec1 die Koordinaten 3, 3, 3 haben
```


----------



## Der Müde Joe (27. Nov 2009)

>// nun muss vec1 die Koordinaten 3, 3, 3 haben

Ich bin eher der immutable Typ und würde von add ein neues Object erwarten (wie alle String-Methoden) ;-)


----------



## ARadauer (27. Nov 2009)

was soll bei add passieren? soll ein neuer Vector erstellt werden oder soll dem aktuellen einfach der übergeben drauf addiert werden?

so 
	
	
	
	





```
public Vector3d add(Vector3d v)//die vektoradditionsfunktion
   {
           
      this.x = this.x +v.x;
      this.y = this.y +v.y;
      this.z = this.z +v.z;
      return this;
   }
```


oder einen neuen erstellen


```
public Vector3d add(Vector3d v)//die vektoradditionsfunktion
   {
      Vector3d newVector = new Vector3d();   
      newVector.x = this.x +v.x;
      newVector.y = this.y +v.y;
      newVector.z = this.z +v.z;
      return newVector;
   }
```


----------



## jazzcookie (27. Nov 2009)

```
public Vector3d add(Vector3d v)//die vektoradditionsfunktion
   {
      Vector3d newVector = new Vector3d();   
      newVector.x = this.x +v.x;
      newVector.y = this.y +v.y;
      newVector.z = this.z +v.z;
      return newVector;
   }
```
vielen dank für deinen post
kannst du mir noch folgende fragen beantworten,weil ich noch nicht genau verstehe,was innerhalb der methode passiert:
was bedeuted und was macht der ausdruck rechts des ersten gleichheitszeichen?
was bedeuted und was macht/ist "newVector.x"?
was bedeuted und was macht/ist "v.x"?
was bedeuted und was macht/ist "this.x"?

wie kann ich public Vector3d add in der funktion public static void main (String[] args){} testen


----------



## Tonxxx (27. Nov 2009)

> was bedeuted und was macht der ausdruck rechts des ersten gleichheitszeichen?



links vom kommazeichen machst du nur die reverrenz(Zeiger auf das objekt), rechts machst du dann die richtige instanzierung, das heisst ein objekt mit dem namen Vector3d.



> was bedeuted und was macht/ist "newVector.x"?



nach der addition bekommst du ja einen 3. Vektor, der heisst hier newVektor und x heisst, das es der x Achsen abschnitt des Vektores ist.



> was bedeuted und was macht/ist "v.x"?



du liest einen vektor v ein(parameter), und x ist  wieder der x-Achsenabschnitt



> was bedeuted und was macht/ist "this.x"?



this bedeutet nur, das du DIESES x meinst, das vor dem punkt steht.

```
vec1.add(vec2);
```

hier das x von vec1



> wie kann ich public Vector3d add in der funktion public static void main (String[] args){} testen



indem du einfach 
	
	
	
	





```
Vector3d vec1 = new Vector3d(1, 1, 1);
Vector3d vec2 = new Vector3d(2, 2, 2);
vec1.add(vec2);
// nun muss vec1 die Koordinaten 3, 3, 3 haben
```

indem du einfach diesen quellcodeabschnitt von KrokoDiehl in deine main methode schriebst!


----------



## jazzcookie (30. Nov 2009)

hi,
im voraus wurde eine andere klasse mit dem namen Vector3d erstellt.diese hat jetzt die drei membervariablen double x,y,z und 3 methoden(Vector3d add,Vector3d subtract,double scalarproduct).
jetzt ist die neue klasse mit dem namen "Sphere" anzulegen.sie enthaelt die methoden "public boolean set(Vector3d center, double radius)" und  "public Vector3d getCenter()". ziel ist mit "public boolean set(Vector3d center, double radius)" die position und den radius der kugel zu aendern."public Vector3d getCenter()" soll die kugelposition zurueckgeben.
ich hab das so geschrieben:





```
package de.tum.ws2009.grprog.uebungsblatt05.geometricobjects;

public class Sphere {
public boolean set(Vector3d center, double radius)
{
if(radius<0)//wenn der radius negativ ist, wird false returned
{
return false;
}
else
{
center=new Vector3d();//der vektor center zeigt auf den mittelpunkt der kugel
return true;//der neue radius wurde auch uebergeben
}
}
public Vector3d getCenter()
{
return center;
}
}
```




bei "public Vector3d getCenter()" schreib ich return center,weil ich dachte es ist richtig aber er zeigt mir einen sytaxfehler an:"center cannot be resolved"

weiss jemand, wie der rumpf von public Vector3d getCenter() auszusehen hat?


----------



## KrokoDiehl (30. Nov 2009)

Du musst in deiner _Sphere_-Klasse noch die Eigenschaften der Kugel als Attribute nennen:

```
public class Sphere
{
    // die zwei Eigenschaften einer Kugel:
    protected Vector3d center;
    protected double radius;

    //...
}
```
Damit kannst du dann in den Getter- und Setter-Methoden darauf zugreifen. Etwa wie folgt:

```
public Vector3d getCenter()
    {
        return center;
    }
```
Und als Hinweis: In der Methode 
	
	
	
	





```
set()
```
 läuft auch etwas falsch:
[JAVA=12]
center=new Vector3d();//der vektor center zeigt auf den mittelpunkt der kugel
[/code]
...in dieser Zeile übernimmst du niemals den Vektor, der als Parameter übergeben ist, sondern machst daraus ein neues Objekt. Etwas wie 
	
	
	
	





```
this.center = center;
```
 wäre angebrachter.

Ganz ehrlich, bei dir fehlt es noch an grundlegendem Verständnis zur Objektorientierung...


----------



## jazzcookie (30. Nov 2009)

KrokoDiehl hat gesagt.:


> Ganz ehrlich, bei dir fehlt es noch an grundlegendem Verständnis zur Objektorientierung...



und trotzdem muss ich  aufgaben aus diesem gebiet loesen.ich bin schon ein armer hund:toll:


----------



## KrokoDiehl (30. Nov 2009)

Klar   Sind ja da um zu lernen.
Du musst verstehen, dass Objekte Eigenschaften haben (manchmal nennt man sie auch Attribute oder sonstwie) und diese Eigenschaften machen die einzelnen Objekte aus. Bei einer Kugel sind es eben der Mittelpunkt und der Radius, bei einem Vektor sind es seine Koordinaten.
Die Get- und Set-Methoden sind "nur" dafür da, diese Eigenschaften zu ändern. Prinzipiell kann man die Eigenschaften auch öffentlich (public) machen, und dann von überall aus ändern. Dies ist aber sehr unsauber und bietet keinerlei Kontrolle. Wie z.B. bei deiner 
	
	
	
	





```
set()
```
-Methode kann man dann keine Prüfung machen, ob der Radius z.B. falsch (kleiner 0) ist.


```
public void setCenter(Vector3d center)
{
    /* Hier ist "center" ein Vektor, der von außen an die Kugel gegeben wird und der neuer
     * Mittelpunkt der Kugel sein soll. Daher muss man den jetzigen Kugelmittelpunkt "this.center"
     * auf diesen neuen Vektor setzen:
     */
    this.center = center;    
    /* Hier ist es übrigens wichtig zu erkennen, dass es zwei Objekte gibt, die hier "center" heißen:
     * Zum Einen der Parameter, der als lokale Variable zählt, zum anderen die Eigenschaft der Kugel, 
     * die ebenfalls "center" heißt. Daher verweist man mit "this.center" auf die Eigenschaft der Kugel.
     * Vielleicht ist daher so etwas verständlicher:
     * public void setCenter(Vector3d newCenter)
     * {
     *     center = newCenter;
     * }
     * Hier ist "center" die Eigenschaft der Kugel und "newCenter" ein anderer Vektor, der von außen
     * gegeben wird.
     */
}
```

Wenn du daher, wie in deinem Code, in der Set-Methode schreibst 
	
	
	
	





```
center = new Vector3d();
```
, dann sagst du dem _center_-Vektor, der von außen gegeben wurde (Parameter), dass er ein neues Objekt sein soll mit anderen Werten (wie gesagt, die Eigenschaften machen eine Klasse aus). Dies hat keinerlei Einfluss auf den eigentlichen Mittelpunkt der Kugel.

Grundsätzlich sehen Getter und Setter wie folgt aus (und man schreibt sie typischerweise auch immer mit dem Präfix get bzw. set):

```
public void setEigenschaft(Datentyp eigenschaft)
{
    this.eigenschaft = eigenschaft;
}

public Datentyp getEigenschaft()
{
    return this.eigenschaft;
    // das "this" könnte man sich hier auch sparen, da klar ist, welche eigenschaft gemeint ist
}
```
Natürlich gibt es noch einige Möglichkeiten, solche Getter und Setter auszubauen, wie in deinem Fall, mit einer Gültigkeitsprüfung.


----------



## jazzcookie (1. Dez 2009)

kann mir jemand noch ein beispiel geben wie ich die funktion Vector3d add in der main funktion teste, denn ich weiss nicht wie.


```
public Vector3d add(Vector3d v)//(a) vektoraddition
	{
		Vector3d newVector = new Vector3d();   
	      newVector.x = this.x +v.x;
	      newVector.y = this.y +v.y;
	      newVector.z = this.z +v.z;
	      return newVector;
	}

public static void main (String[] args)//die main funktion
	{
		
	}
```


----------

