SDL - Zeichnen von Linien

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
Mumbo
Beiträge: 3
Registriert: So 22. Jul 2012, 13:42

SDL - Zeichnen von Linien

Beitrag von Mumbo »

Hi.
Ich bastle gerade mit der SDL herum, und soweit funktioniert es ganz gut.
Mein Problem ist derzeit, das die SDL in der Version 1.2 scheinbar keine Funktion zum zeichnen einer Linie bereitstellt. SDL_gfx und SDL_draw (zwei weitere DLLs, die die Funktion scheinbar bereitstellen) würde ich gerne umgehen, da ich befürchte das sie zu Kompabilitätsproblemen führen könnten (will nach möglichkeit Crossplattformfähig für Windows und Linux schreiben), und ich derzeit Probleme habe SDL_gfx unter Win7 64 bit zu kompilieren ;/.

Daher steht nun die Idee im Raum einfach selbst eine Funktion zum Zeichnen einer Linie zu basteln. Nur hätte ich dazu wohl in der Analysis wohl besser aufpassen müssen:
Wenn ich das ganze in eine Schleife packe, die von x1 bzw. y1 zu x2 oder y2 durchläuft, gibt es Probleme mit der Länge der Darstellung wenn die Linie hier unpassende Werte hat (z.B. x1=0 y1= 5, x2= 0, y1 = 8 => eine Schleife die von x1 zu x2 durchläuft würde keine Linie darstellen). Mein Lösungsversuch beinhaltet daher zwei Schleifen: Einmal eine Schleife von x1-1 zu x2, und darin dann eine y1-1 zu y2 Schleife. In der X-Schleife wird.
Die X-Schleife dient eigt. nur dazu den Wert nach oben zu Setzen, die y-Schleife erhöht mit jedem durchlauf den Pointer um die Breite des Screens.
Die Funktion sieht nun so aus:

Code: Alles auswählen

procedure DrawLine(x1,x2,y1,y2: integer; handle: PSDL_Surface); //Prozedur wird definiert, nimmt die 4 Kordinatenpunkte als Integer und das handle des Screens auf den gezeichnet werden soll.
begin
  for tempInt2 := x1-1 to x2 do begin //erste Schleife, erhöht nur den x-Wert
  for tempint3 := y1-1 to tempint2 do begin //zweite Schleife, erhöht den y-Wert
  NEW(pixellocation);
  WRITE('Pitch value: ',handle^.pitch DIV handle^.format^.BytesPerPixel); //Pointer wird erzeugt und definiert.
  pixellocation := handle^.pixels+tempint2+(tempint3*handle^.w); //Pointer wird auf x + y*breite des screens gesetzt.
  pixelcolor:=SDL_MapRGB(handle^.format, 255, 0, 255); //pixelfarbe wird definiert
  pixellocation^ := pixelcolor; //Pixel wird gefärbt.
  end;
  end;
end;


Wenn ich nun versuche das ganze mit DrawLine(20, 900, 500, 800, screen); zu Verwenden, stürzt das Programm mit der Meldung über eine Exception-Klasse Runerror(63760) ab.
Hat jemand eine Idee wie sich das beheben lässt (bzw. ob das ganze so überhaupt funktioniert?

Edit: Es liegt an der Stelle:
WRITE('Pitch value: ',handle^.pitch DIV handle^.format^.BytesPerPixel); - die stammt so relativ direkt aus dem Tutorial hier.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: SDL - Zeichnen von Linien

Beitrag von mschnell »

Hast Du es mal mit Jedi-SDL probiert ? ( http://sourceforge.net/projects/jedi-sdl/ )

-Michael

Mumbo
Beiträge: 3
Registriert: So 22. Jul 2012, 13:42

Re: SDL - Zeichnen von Linien

Beitrag von Mumbo »

Hi.
Von der Jedi-SDL habe ich schon einmal gehört, weiß aber nicht was genau sie bringt/ist - leider ist die Mainpage down.
Habe mein "Problem" nun folgendermaßen gelöst:

Code: Alles auswählen

procedure DrawPixel(x1,y1: integer; handle: PSDL_Surface);
begin
 NEW(pixellocation);
 pixellocation:=handle^.pixels+x1+(y1*1680);
 pixelcolor:=SDL_MAPRGB(handle^.format,255,0,0);
 pixellocation^ := pixelcolor;
end;
procedure DrawLine(x1, x2, y1, y2: integer; handle: PSDL_Surface);
begin
if x1 = x2 then begin
for tempint2 := y1 to y2 do begin
DrawPixel(x1, tempint2, handle);
end;
exit;
end;
if y1 = y2 then begin
for tempint2 := x1 to x2 do begin
DrawPixel(tempint2, y1, handle);
end;
exit;
end;
if (y1 <> y2) and (x1 <> x2) then begin
Steigung := (y2-y1) / (x2-x1);
for tempint2 := 0 to round(sqrt(sqr(x1-x2)+sqr(y1-y2))) do begin
DrawPixel(trunc(X1 + (X2 - X1) * tempint2 div round(sqrt(sqr(x1-x2)+sqr(y1-y2)))), trunc(Y1 + ((Y2 - Y1) * tempint2 div round(sqrt(sqr(x1-x2)+sqr(y1-y2))))), handle);
end;
end;
end;


Danke, und Grüße
Mumbo

Antworten