Delphi: LineTo selbst machen

Alle Arten von Programmen und Anwendungen: Egal ob Betriebssysteme, Systemtools, Grafikbearbeitung, Musikeditoren oder Textverarbeitung. Hier wird über alles gesprochen.
vogt31337
Junior Member
Junior Member

 
Beiträge: 69
Registriert: 25.06.2003
Mi 22. Dez 2004, 01:24 - Beitrag #1

Lineto - Selbst machen

Hi,

wir arbeiten zur Zeit an Grafik gedöns unter Delphi(gezwungernermaßen).
Ich konnte es mir nicht nehmen lassen mein geliebtes SDL für Delphi zu suchen und gleich auch zu benutzen. Aber ich hab ein größeres Problem. Und zwar brauch ich eine LineTo Funktion.
Ich hab da was über Steigungsdreiecke improvisiert, dass ist aber nicht wirklich der Hammer. Wenn mir einer verrät wie man mittel große code listings postet (ich glaub mit code in eckigen Klammern ging das?), dann poste ich den mal.

Mein Lehrer war auch nicht wikrlich in der Lage mir weiterzuhelfen. Er meinte man könnte mit einer Art "Standard"-Abweichung arbeiten. Ich bin der Meinung, das einmal mit wenigen Zeilen gelöst gesehen zu haben.
Vielleicht kennt jemand einen besseren Ansatz, der einfacher und besser zu implementieren ist.

nazgul
Excellent Member
Excellent Member

Benutzeravatar
 
Beiträge: 674
Registriert: 08.02.2003
Do 23. Dez 2004, 01:14 - Beitrag #2

Huch? Was genau willst du bei Delphi mit SDL???


T*.Canvas.Move
T*.Canvas.Line

IIRC gabs bei Delphi ne Online-Hilfe, da könntest du mal nach lineto suchen....


Wenn du natürlich Kantenglättung willst:
a) GDI kann das irgendwie (ist zumindest möglich)
b) Selbst nen Algorithmus implementieren

blobbfish
Listenkandidat
Lebende Legende

Benutzeravatar
 
Beiträge: 3022
Registriert: 26.01.2003
Do 23. Dez 2004, 09:48 - Beitrag #3

T*.Canvas.Move
T*.Canvas.Line


Wird nicht funktionieren, da die Canvasfunktionen nur mit Standarddelphioberflächen aka PaintBox, Imagebox, Forms/Frames und der gelichen funktionieren.

Huch? Was genau willst du bei Delphi mit SDL???


Die Kompetenen von Delphi erweitern, beziehungsweise Delphi irgendwelche verschaffen. Im Ernst. Es geht um die Darstellung von L-Systemem und das Problem bei selbigen ist, dass die Schrittlänge kleiner werden muss, wenn es mehr Stufen gibt. Die Schrittlänge durch die Iterationen ist nicht wirklich befridignd und SDL bringt dann eben eine Funktion zu automatischen resizen mit.

nazgul
Excellent Member
Excellent Member

Benutzeravatar
 
Beiträge: 674
Registriert: 08.02.2003
Do 23. Dez 2004, 11:03 - Beitrag #4

Alles was ein Canvas hat sollte auch ein OnResize haben.

ANsonsten fiele mir da noch OpenGL ein ;-)
Da wird das Skalieren auch recht einfach Gelöst (du musst ihm blos Mitteilen wie groß der Viewport ist.

ausserdem ist Skalieren nicht so der Act...
Das geht schneller als die SDL kennenzulernen ;-)

blobbfish
Listenkandidat
Lebende Legende

Benutzeravatar
 
Beiträge: 3022
Registriert: 26.01.2003
Fr 24. Dez 2004, 11:38 - Beitrag #5

Das OnResizevon Delphi passt, wenn ich das richtig verstanden ahbe, das Objekt an seinen Inhalt an, aber wir brauchen es ja genua umgekehrt.

Mir ist allerdings noch einen sehr unelde und daher zu Delphi passende Lösung eingefallen: TChart. Resized von selbst und hat Zoom. Und alles was irgendwie an ein TChart erinnert kann ausgeblendet werden, bis auf einen dämlichen Rahmen. Muss nurnoch rausfinden, wie man eine neue Linie zur Laufzeit hinzufügt, sollte aber machbar sein.Werde ich mich im Laufe des Tages drum kümmern.

vogt31337
Junior Member
Junior Member

 
Beiträge: 69
Registriert: 25.06.2003
So 26. Dez 2004, 23:46 - Beitrag #6

Ich nehme SDL, weil OpenGL noch schwieriger ist. Außerdem will ich wissen, wie man eine LineTo funktion programmiert, wenn man nur putpixel hat.
Delphi hat dabie den Vorteil, dass jeder C-Hacker es versteht. Während hingegen C manchmal unlesbar ist.
Außerdem löst das OpenGL resize nicht das elementare Problem. Denn ich weiß im vornhinein nicht wie groß die Fläche ist. Und dann hilft auch kein View darauf, der wahrscheinlich auch nur einen Teil darstellt.
Zumal dieser ganze Canvas kram zwar schön und gut ist, aber ich würd ihn nie im Leben für wirklich ernsthafte Sachen einsetzen. Genauso wie ich den Borland C-Builder nicht sehr mag.
Find ich Delphi noch schlimmer, aber wir sind wie gesagt dazu gezwungen. Aber das sollte hier nicht Thema sein. Denn ich wusste schon vorher wie man ein LineTo bei Canvas macht. Das macht das ganze aber nicht einfacher. Ich will trotzdem wissen wie ein anständiges LineTo funktioniert.

nazgul
Excellent Member
Excellent Member

Benutzeravatar
 
Beiträge: 674
Registriert: 08.02.2003
Mo 27. Dez 2004, 15:36 - Beitrag #7

Lineto von Hand - Algorithmus Vorschlag

1. Test auf Sonderfälle Horizontale/Vertikale (weil ganz einfach zu malen)

2. Bestimme die Geradengleichung y=m*x+b fuer die Linie

$this->bbcode_second_pass_code('', '
let f(x) be the function describing the line
let PutPixel(x,y) be the drawing function
let xMin be the minimum x-pos
let xMax be the maximum x-pos
let x be integer describing the current x position


for x=xMin to xMax do begin
yc = f(x)
yo = f(x-1)
for y=y0 to yc do begin
PutPixel(x,y);
end;
end;
')

Sollte das Tun, was du Bedarfst.
eine linie von (0,0)->(1,100) sieht damit immernoch sch.. aus, aber du solltest den algorithmus dahingehend anpassen können.
Oh - und ne kleine Modifikation für den Linienanfang muss auch noch rein ;-) die würde das hier zu unübersichtlich machen.


OpenGL ist - auch mit Delphi - erstaunlich einfach.
+ Du kannst OpenGL auch runtime sagen, wiegroß seine Zeichenfläche ist.

Und: Nicht die Programmiersprache macht einen Hacker aus.
Du kannst sogar mit BASIC wirklich erstaunliche sachen auf die Beine stellen. Die Sprache ist nur das Werkzeug des Programmierers - relevant sind die Algorithmen.

vogt31337
Junior Member
Junior Member

 
Beiträge: 69
Registriert: 25.06.2003
Fr 31. Dez 2004, 13:35 - Beitrag #8

Naja, den selben Algo hab ich auch schon aufgestellt. Ich dachte aber, das eine elegantere Version davon gibt.

Aber die selben Probleme hab ich auch. Schmale linien sehen einfach nur bescheiden aus. Ich hab noch'nen paar tricks drin, aber die helfen auhc nicht unbedingt weiter. Ich dachte, vielleicht kennt irgendjemand einen besseren Algo. Mein Info-Lehrer meinte schon, man könnte mit einer art "dicke" arbeiten, was gleichzeitig antialiasing bedeutet.

Und: Deswegen frage ich ja nach besseren Algos. Ich hab früher auch viel in Basic gemacht. Aber diese Sprache hat irgendwann auch eine Grenze, die wie eine Schallmauer wirkt.
Man kann z.B. einen Webbrowser auch in Assembler programmieren. Der dann sogar unter Windows läuft und grafisch ist. Nur ich glaub das will niemand ernsthaft machen.

nazgul
Excellent Member
Excellent Member

Benutzeravatar
 
Beiträge: 674
Registriert: 08.02.2003
Di 4. Jan 2005, 00:45 - Beitrag #9

die elegantere Version heisst: etwickle einen algorithmus der die Abschnitte gleichmässiger unterteilt.

Anti-Aliasing macht die Linien unsauberer.

$this->bbcode_second_pass_code('', '
XX
XX
XX
')

$this->bbcode_second_pass_code('', '
XXx
xXXx
xXXx
')

X= Pixel mit linien-Farbe
x = Mischfarbe aus Linie und Hintergrund


Ach und btw: hast du schon Google versucht?

http://www.google.de/search?hl=de&q=linie+zeichnen+algorithmus&btnG=Google-Suche&meta=

Das hier sieht aus wie das was du willst:
http://www.siemens.md.st.schule.de/Dokumente/Informatik/bresenham/bres.htm
(Zweites ergebniss von Oben.........)


Zurück zu Software

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 15 Gäste