# Mesh-Klasse



## Mana (17. Jun 2009)

Hallo,

ich soll für eine Studienarbeit verschiedene Funktionen mit der Mesh-Klasse darstellen.
Hinterher soll daraus ein Funktionsplotter werden.
Ich habe seid diesem Semester Ingenieursinformatik und die Übungen liefen bis jetzt ganz gut aber bei der Studienarbeit komme ich nicht ganz vorran, da ich mich mit dieser Mesh-Klasse überhaupt nicht auskenne.
Ich habe jetzt mittlerweile ein Beispiel für eine Funktion in der Mesh-Klasse:


```
import inf.v3d.obj.BoundingBox;
import inf.v3d.obj.Mesh;
import inf.v3d.obj.MeshContourLines;
import inf.v3d.view.Viewer;


public class Test {
	public static void main(String[] args) {
	int n = 50;
	 Mesh mesh = new Mesh(n, n);
	 BoundingBox boundingBox = new BoundingBox(mesh);
	 MeshContourLines contourLines = new MeshContourLines(mesh);

	 for (int i = 0; i < n; i++) {
	        for (int j = 0; j < n; j++) {
	                double x = i - n / 2;
	                double y = j - n / 2;
	                double z = x * y / n;

	                mesh.setCoordinates(i, j, x, y, z);
	                mesh.setData(i, j, z);
	        }
	 }
	 mesh.setSmooth(true);
	 mesh.setColoringByData(true);
	 mesh.createColors();
	 contourLines.createContours();
	 new Viewer().setVisible(true);
}

}
```

Meine Frage: Was hat es mit diesen Knoten auf sich die man mit dem Mesh-Konstruktor erstellt? Und kann ich einfach andere Werte für die Koordinaten einsetzten oder muss ich da irgendetwas mit diesen Knoten machen?!
Ich habe bereits versucht andere Koordinaten einzusetzten was aber nichts gebracht hat und nurnoch die Box im Viewer angeziegt wurde was mich darauf schließen lässt das es was mit diesem Mesh zu tun hat!

Ich habe versucht die Schnecke

| 1.2^u(1+cos v)cos u |
| 1.2^u(1+cos u )sin u |
| 1.2^usin v -1.5 1.2^u |  für 0<=u <=6pi ; 0<=v<=2pi

zu erstellen:

```
mport inf.v3d.obj.BoundingBox;
import inf.v3d.obj.Mesh;
import inf.v3d.obj.MeshContourLines;
import inf.v3d.view.Viewer;

public class Test01 {

	public static void main(String[] args) {
		int n = 50;
		int u = 0;
		int v = 0;
		Mesh mesh = new Mesh(n ,n);
		BoundingBox boundingBox = new BoundingBox(mesh);
		MeshContourLines contourLines = new MeshContourLines(mesh);
		for (int i = u; i <= 6 * Math.PI; i++) {
			for (int j = v; j <= 2 * Math.PI; j++) {
				double x = Math.pow(1.2, i) * (1 + Math.cos(i)) * Math.cos(i);
				double y = Math.pow(1.2, i) * (1 + Math.cos(i)) * Math.sin(i);
				double z = Math.pow(1.2, i) * Math.sin(j) - 1.5
						* Math.pow(1.2, i);
				mesh.setCoordinates(i, j, x, y, z);
				mesh.setData(i, j, z);
			}
		}
		mesh.setSmooth(true);
		mesh.setColoringByData(true);
		mesh.createColors();
		contourLines.createContours();
		new Viewer().setVisible(true);

	}
}
```


----------



## Marco13 (22. Jun 2009)

Diese Mesh-Klasse, um die es da wohl geht, ist euch wohl zur Vefügung gestellt worden - da sollte es eine Doku dazu geben....!?


----------



## Mana (22. Jun 2009)

Das mit der Mesh Klasse habe ich mittlerweile verstanden !
Nun habe ich ein anderes Problem:
Ich soll den Funktionswert einer Funktion ausgeben.
Die Funktion (Parabolische Schale) :

f(x,y)= 1-x^2-0.5*(x^2-1)*(y^2-1)

-1 <= x <= 1 ; -1 <= y <= 1

ich habe mir gedacht dass ich den Definitionsbereich in eine for-schleife eingebe und dann der Funktionswert für den Bereich berechnet wird.


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

	}

	public double berechneFunktionswert(double x, double y) {
		for (int x = 1 ; x >= -1 ; x--){
		 for (int y = 1 ; y >= -1 ; y--){
			}
		}
		return 1 - Math.pow(x, 2) - 0.5 * (Math.pow(x, 2) - 1)
				* (Math.pow(y , 2));
	}

	{

}}
```

Dies funktioniert nur leider nicht und jetzt weiss ich leider nicht weiter;(???:L


----------



## Mana (22. Jun 2009)

Das mit der Mesh Klasse habe ich mittlerweile verstanden !
Nun habe ich ein anderes Problem:
Ich soll den Funktionswert einer Funktion ausgeben.
Die Funktion (Parabolische Schale) :

f(x,y)= 1-x^2-0.5*(x^2-1)*(y^2-1)

-1 <= x <= 1 ; -1 <= y <= 1

ich habe mir gedacht dass ich den Definitionsbereich in eine for-schleife eingebe und dann der Funktionswert für den Bereich berechnet wird.


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

	}

	public double berechneFunktionswert(double x, double y) {
		for (int x = 1 ; x >= -1 ; x--){
		 for (int y = 1 ; y >= -1 ; y--){
			}
		}
		return 1 - Math.pow(x, 2) - 0.5 * (Math.pow(x, 2) - 1)
				* (Math.pow(y , 2));
	}

	{

}}
```

Dies funktioniert nur leider nicht und jetzt weiss ich leider nicht weiter;(???:L


----------



## Marco13 (22. Jun 2009)

Auf Gutdünken ein paar Klammern einfügen...!? 

Es gibt ja nicht nur EINEN Funktionswert, sondern viele. Und wie viele, das hängt davon ab, an wie vielen Stellen die Funktion ausgerechnet werden soll. Wenn es nur darum geht, die Werte auszugeben

```
// For http://www.java-forum.org/hausaufgaben/84523-mesh-klasse.html#post529948

public class ParabolischSchale
{
    public static void main(String[] args)
    {
        gibFunktionswerteAus(-1,1, 0.1, -1, 1, 0.1);
    }

    private static void gibFunktionswerteAus(
        double xMin, double xMax, double xSchrittweite,
        double yMin, double yMax, double ySchrittweite)
    {
        int xSchritte = (int)Math.ceil((xMax-xMin)/xSchrittweite);
        int ySchritte = (int)Math.ceil((yMax-yMin)/ySchrittweite);


        for (int i=0; i<=xSchritte; i++)
        {
            for (int j=0; j<=ySchritte; j++)
            {
                double x = xMin + i * xSchrittweite;
                double y = yMin + j * ySchrittweite;
                double wert = berechneFunktionswert(x,y);
                System.out.println("Bei "+x+" "+y+" is der Wert "+wert);
            }
        }
    }


    public static double berechneFunktionswert(double x, double y)
    {
        return 1 - Math.pow(x, 2) - 0.5 * (Math.pow(x, 2) - 1)
                * (Math.pow(y , 2));
    }
}
```

Wenn es darum geht, ein Mesh zu erstellen, das diese Schalen-Form hat, muss man sich die Funktionswerte für die einzelnen Punkte speichern und als eine Koordinate für die Vertices verwenden...


----------



## Mana (23. Jun 2009)

Danke schon mal für den Code , hat mir super geholfen:toll:
Ich hab jetzt nurnoch eine Frage zur Ausgabe in der Konsole. Und zwar :

Die Schrittweite wird ja mit 0.1 angegeben  wie kommt es dann in der Konsole manchmal zu sowas 

Bei -0.8 -0.3999999999999999 is der Wert 0.38879999999999987

also wieso nich -0.4 für y?


----------



## Marco13 (23. Jun 2009)

Manche Zahlen können als double nicht genau dargestellt werden - genau wie man z.B. 1/3 (in diesem Sinne) "nicht genau" darstellen kann: 0.333333333333333..... 

Sehr ausführlich: What Every Computer Scientist Should Know About Floating-Point Arithmetic
Etwas weniger ausführlich: Floating point - Wikipedia, the free encyclopedia


----------



## Mana (23. Jun 2009)

ok vielen Dank  :toll:


----------

