Seite 1 von 1
Lineto - Selbst machen

Verfasst:
Mi 22. Dez 2004, 01:24
von vogt31337
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.

Verfasst:
Do 23. Dez 2004, 01:14
von nazgul
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

Verfasst:
Do 23. Dez 2004, 09:48
von blobbfish
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.

Verfasst:
Do 23. Dez 2004, 11:03
von nazgul
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 ;-)

Verfasst:
Fr 24. Dez 2004, 11:38
von blobbfish
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.

Verfasst:
So 26. Dez 2004, 23:46
von vogt31337
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.

Verfasst:
Mo 27. Dez 2004, 15:36
von nazgul
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.

Verfasst:
Fr 31. Dez 2004, 13:35
von vogt31337
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.

Verfasst:
Di 4. Jan 2005, 00:45
von nazgul
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.........)