Bresenham Linienalgorythmus --> Optimierungsfehler

#897282
Lesenswert?

Hallo

Ich arbeite gerade im Rahmen meiner Diplomarbeit an den Steuerroutinen 
für ein 320x240 FarbLCD. Mittlerweile habe ich schon erfolgreich das 
Display initialisiert, kann Pixel gezielt mit der geqünschten Farbe 
setzen und mein selbstprogramierter Charactergenerator funktioniert auch 
schon wunderbar.

Jetzt arbeite ich gerade an der Funktion zum Zeichnen von Linien nach 
dem Schmema Startkoordinate und Endkkoordinate.
Ich verwende dazu einen Bresenheim-Algorythmus ähnlich dem in Wikipedia.
Die Algorythmus funkitionier auch schon fast perfekt.

Ich habe folgendens Problem:

Wenn ich bei eingeschalter Optimierung -0s im Hauptprogramm die 
Linienfunktion mehrmals Aufrufe, also zb...
1
int main()
2
{
3
  SSD1906_Clear();
4
  SSD1906_Init();
5
  SSD1906_DrawLine(10,10,150,150,red);
6
  SSD1906_DrawLine(10,20,150,150,red);
7
  SSD1906_DrawLine(10,30,150,150,red);
8
  SSD1906_DrawLine(10,40,150,150,red);
9
  SSD1906_DrawLine(10,50,150,150,red);
10

11
  while(1);
12
  return 0;
13
}


Am Display werden alle Linien richtig  gezeichnet. Das Problem ist das 
alle Linien nach der ersten in einer anderen Farbe gezeichnet werden. 
Das interressante ist dass bei abgeschalteter Optimierung die Farben 
stimmen.

Wo optimiert der Compiler mir was weg???

Den Code habe ich folgendermaßen iplementiert. (ATMEGA168)
1
void SSD1906_DrawLine(signed int Xstart, signed int Ystart, signed int Xende, signed int  Yende, unsigned int FGcolor)
2
{
3
  signed int distanzX=0, distanzY=0, incX=0, incY=0, distanz=0, X=0, Y=0, Xerror=0 , Yerror=0;
4
  unsigned long pixel=0;
5

6
  //Bestimmung des Entfernungsunterschiede in X- und Y- Richtung
7
  distanzX = Xende - Xstart;
8
  distanzY = Yende - Ystart;
9

10
  //Bestimmung des Vorzeichens des Imkrementalwerts
11
  if(distanzX<0) //Geht X in die negative Richtung?
12
  {
13
    incX = -1; distanzX = -distanzX;    
14
  }
15
  else incX = distanzX ? 1:0; //0 Wenn 90° oder 270°
16

17
  if(distanzY<0) //Geht X in die negative Richtung?
18
  {
19
    incY = -1; distanzY = -distanzY;
20
  }
21
  else incY = distanzY ? 1:0; //0 Wenn 0° oder 180°
22

23
  //Feststellen welche Entfernung größer ist
24
  distanz= (distanzX > distanzY) ? distanzX:distanzY;
25

26
  //Intialisierung der Fehlervariablen mit distanz/2
27
  X=Xstart; Y=Ystart;
28
  Xerror = Yerror = distanz>>1;
29

30
  //Berechnung der PIXEL  
31
  for(unsigned int i=0; i < distanz; i++)
32
  {
33
    //pixel berechnen
34
    //pixel ausgeben
35
    pixel=(unsigned long)153120-Y*(unsigned long)480+X*
36
                  (unsigned long)2; //SRAM Adresse berechnen
37
    SSD1906_SetSRAM(pixel,FGcolor);
38
    //Fehlervariablen aktualisieren
39
    Xerror += distanzX;
40
    Yerror += distanzY;
41

42
    //Fehler auswerten und ggf. reagieren
43
    if(Xerror >= distanz)
44
    {
45
      Xerror -= distanz;
46
      X += incX;
47
    }
48
    if(Yerror >= distanz)
49
    {
50
      Yerror -= distanz;
51
      Y += incY;
52
    }
53
  }
54
  pixel=(unsigned long)153120-Y*(unsigned long)480+X*(unsigned 
55
        long)2; //SRAM Adresse berechnen
56
  SSD1906_SetSRAM(pixel,FGcolor);
57
  //pixel berechnen
58
  //pixel ausgeben
59

60
}

Ich hoffe ihr konnt mir dabei helfen
Persönliche Seite #897391
Lesenswert?

> Der Beitrag war damit  voll umsonst *ganz schön schäm*
Wieso umsonst? Du hattest ein Problem, das Forum hat dir geholfen und 
viele die mitlesen, wissen nun von den Bugs in WinAVR-20080411.

> Das kommt davon wenn man nicht up-to-Date ist.
Man kann ja nicht immer up-to-date sein. Zwischen den vielen Updates 
möchte man ja gelegentlich auch mal noch schnell was löten oder 
programmieren ;-)
Gast #897899
Lesenswert?

>Zwischen den vielen Updates
>möchte man ja gelegentlich auch mal noch schnell was löten oder
>programmieren ;-)

Sollte das nicht lieber so heißen:
..gelegentlich auch mal noch was löten zum programmieren...?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren