# Warum schwingt die Linie nicht?



## rumkugeln (28. Jun 2009)

Ich habe ein Programm geschrieben, das folgenden Quelltext enthält:

```
class Zeichnerklasse extends Canvas implements Runnable
{

    int wartezeit;
    int bildschirmhöhe;
    int bildschirmbreite;
    int x ;
    int x2 ;
    int y;
    int y2;





    public Zeichnerklasse ()
    {
        bildschirmhöhe = getHeight ();
        bildschirmbreite = getWidth ();
        x = bildschirmbreite/2;
        y = bildschirmhöhe-60;
        x2 = bildschirmbreite/2;
        y2 = y-200;

    }




    public void paint (Graphics g)
    {
       g.setGrayScale (255);
       g.fillRect (0,0, bildschirmbreite, bildschirmhöhe);
       g.setColor(0, 0, 0);
       g.fillArc ( (bildschirmbreite-40)/2,bildschirmhöhe-80 ,40,40,0,360);
       g.setColor (255,0,0);
       g.drawLine (x, y, x2, y2 );

       
        
    }

    public void start()
    {
        Thread thread = new Thread (this);
        thread.start ();
    }


    public void run ()
    {
        while (true)
        {
            
            

            for (int i=0;i<60;i++)
            {
                x2 =(int) (Math.cos ((i/180*Math.PI)*(bildschirmbreite-60)+30));
                y2 = (int) (Math.sin (i/180*Math.PI)*((bildschirmhöhe-60)/2)+140);
                repaint();
                serviceRepaints();
               

                try
                {
                    Thread.sleep (wartezeit*60);
                }
                catch (InterruptedException o)
                {

                }


                if (x2 == bildschirmbreite)
                    break;

            }

            for (int j=60; j>0; j--)
            {
                x2 =(int) ((Math.cos (j/180*Math.PI)*(bildschirmbreite-60)+30));
                y2 = (int) ((bildschirmhöhe-60)* Math.sin (j/180*Math.PI) +140);
                repaint();
                serviceRepaints();
               
                 try
                {
                  Thread.sleep (wartezeit*60);
                }
                catch (InterruptedException o)
                {

                }

                if (x2 == 0)
                    break;
            }
        }

    }
    public void stop()
    {
        
    }


}
```

Die Linie die in der paint() Funktion gezeichnet wird soll hin und her schwingen. Im Moment bewegt sie sich schon hin un her, aber ruckartig, das heißt sie springt von einem Endpunkt bis zum anderen. Woran kann das liegen?


----------



## Schandro (28. Jun 2009)

wartezeit ist 0. Deswegen hat paint nicht genug Zeit um alle Zwischenschritte zu malen.


----------



## rumkugeln (28. Jun 2009)

Guter Gedanke, aber wartezeit kriegt einen Wert zugewiesen in einer anderen Klasse.


----------



## SlaterB (28. Jun 2009)

Kardinalfehler: (fast) 1000 Zeilen Code bauen ohne das irgendwas funktioniert und sich am Ende über alles wundern,

fange ganz langsam an, z.B. komplett ohne GUI nur mit Textausgabe,
dann nehmen wir uns als nächstes mal 3 der 108 Zeilen:
> for (int i=0;i<60;i++)
>           {
>                x2 =(int) (Math.cos ((i/180*Math.PI)*(bildschirmbreite-60)+30));

du vermutest bestimmt irgendwas sinnvolles dahinter, 
getestet kannst du es aber kaum haben:

```
public class Test {

	public static void main(String[] args) throws Exception {
		int bildschirmbreite = 100;
		int x2;
		for (int i = 0; i < 60; i++) {
			x2 = (int) (Math.cos((i / 180 * Math.PI) * (bildschirmbreite - 60)+ 30));
			System.out.print(x2 + ", ");
		}
	}
}
```
Ausgabe:

```
0, 0, 0, 0, 0, 0, 0, 0, 0, [...] 0, 0, 0, 0, 0, 0, 0, 0, 0,
```
wohl nicht was du erwartest hast oder?

selbst das zu analysieren ist noch viel zu groß,
kleiner kleiner kleiner, mit den Grundlagen anfangen!

```
public class Test {

	public static void main(String[] args) throws Exception {
		int x2;
		for (int i = 0; i < 10; i++) {
			x2 = i / 180 * 300;
			System.out.print(x2 + ", ");
		}
	}
}
```
Ausgabe

```
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
```

immer noch nicht ideal, aber zumindest ein überschaubares Problem,
in Java wird nämlich int/ int ganzzahlig gerechnet, i / 180 wird immer 0 sein, solange i < 180 ist,

mit 

```
public class Test {

	public static void main(String[] args) throws Exception {
		int x2;
		for (int i = 0; i < 10; i++) {
			x2 = (int) (i / 180.0 * 300);
			System.out.print(x2 + ", ");
		}
	}
}
```
käme dagegen

```
0, 1, 3, 5, 6, 8, 10, 11, 13, 15,
```
raus,
int/double wird zu double gerechnet


dein ganzes Programm musst du also auf int/int usw. kontrollieren,
viel wichtiger als ein einzelner Fehler wäre aber, überhaupt zu wissen, was im Programm passiert
-> kleine Testprogramme + Logausgaben während der Ausführung oder Debugging


----------



## rumkugeln (28. Jun 2009)

Vielen Dank das du dir so große Mühe gemacht hast!! Das ist ja irgendwie leicht erschreckend mit der ersten Ausgabe! Da wird wohl noch eine Menge Arbeit auf mich zukommen


----------

