# Java Aufgabe



## Mohamed2 (2. Mai 2018)

Hallo zusammen,
ich komme nicht auf die Lösung kann mir jemand vielleicht helfen

Dreidimensionale Körper können in einer geschlossenen Form angegeben werden.
Dies ist eine Funktion, die für einen Punkt angibt, ob er sich innerhalb oder außerhalb der Form beﬁndet.
Beispiel: Für eine Kugel mit Radius r sieht die Funktion wie folgt aus.

f(x,y,z)=( true       sqrt(x2 + y2 + z2)

                false       sonst )

Für r = 5 ergibt f(1, 1, 1) true (in der Kugel), f(5, 5, 5) ergibt false (außerhalb der Kugel).

Betrachten Sie nun das Programm Sample3D.java. Es enthält eine Methode isInsideBody, die eine geschlossene Form für einen Körper darstellt.
Ihre Aufgabe ist es, die Hauptmethode main zu schreiben, so dass das Volumen des Körpers approximiert wird. Dies sollte für jede Implementierung von isInsideBody funktionieren (also nicht nur für Kugel mit Radius 5, die sie in Sample3D.java ﬁnden).
Hinweise:
• Sie dürfen annehmen, dass sich die Körper in einer 3D-Box beﬁndet, die von (-10, -10, -10) bis (10, 10, 10) reicht.
• Tipp: Werten Sie die Funktion an diskreten Punkten im 3D-Gitter aus und schließen sie damit auf das Volumen.

hier ist die isInsideBody Methode:

```
public class Sample3D {
/**
* Methods returns true if and only if given position is inside the body.
*
* @param x x position
* @param y y position
* @param z z position
*@Return true iff position is inside body
*/
public static boolean isInsideBody(double x, double y, double z) {
double distToCenter = Math.sqrt(x * x + y * y + z * z);
return distToCenter <= 5;
}

public static void main(String[] args) {

// Example
boolean isInside = isInsideBody(1, 2, 3);

// TODO: Compute volume

}
}
```


----------



## JCODA (3. Mai 2018)

Zunächst kannst du ja mal f an jedem Gitterpunkt auswerten, zählen wie oft du drin bist. Dann kannst du das Volumen von der 3d-box berechnen. Wie groß ist dieses? Wie viele ganzzahlige Gitterpunkte hat die Box? Nun kannst du das Volumen der Kugel bzw jedes anderen Körpers durch Dreisatz berechnen.


----------



## Mohamed2 (4. Mai 2018)

Danke für Info aber ich komme nicht wieder auf die Lösung es wäre nett wenn Sie mir den Code schicken könnten.


----------



## DrZoidberg (4. Mai 2018)

Du könntest zum Beispiel drei Schleifen verwenden um eine große Anzahl diskreter Punkte zu erzeugen, die du dann der Methode übergeben kannst.

```
double schrittweite = 1;
for(double x = -10; x < 10; x += schrittweite) {
  for(double y = -10; y < 10; y += schrittweite) {
    for(double z = -10; z < 10; z += schrittweite) {
      if(koerper.isInsideBody(x, y, z)) {
        ...
      }
    }
  }
}
```
Je kleiner die Schrittweite, desto mehr Punkte hast du und desto genauer wird das Ergebnis.


----------



## Dompteur (4. Mai 2018)

Du kannst da die Monte Carlo Methode verwenden.
Du kennst die Maße der 3D-Box. Damit kannst du auch deren Volumen berechnen. Nennen wir es VBox
Nun erzeugst du dir n zufällige Punkte innerhalb der 3D-Box. Du zählst dann alle Punkte, die innerhalb des Körpers liegen (isInsideBox() == true). Nennen wir die Summe sum.
Das Volumen des Körpers ist nun = VBox * sum / n.

Je größer du n wählst, umso mehr näherst du dich dem echten Wert.

Zum Nachlesen über das Verfahren hier ein Link : http://www.mathepedia.de/Monte-Carlo-Methode.html


----------



## Mohamed2 (14. Mai 2018)

Danke euch für eure Hilfe


----------

