Autor | Thema: Berechnung von Pixel, Befehl Line .. | | Datum:30.11.01 15:40 
(idefix_nosferatus@lycos.de) | |
Hi allerseits,
Nun habe ich glatt auch mal ein Problem.
Jeder kennt den Befehl Line, der auf einem Screen
eine Linie zeichnet. Z.b. Line 10,10-100,10 zeichnet
eine Linie von X = 10, Y = 10 bis nach X = 100.
Genauer gesagt, sind es also 90 Pixel in x Richtung.
LINE 10,10 - 120,40
würde also eine Linie von X = 10, Y = 10 bis nach
X = 120 und Y = 40 Zeichnen, die Linie neigt sich
also rechts nach unten.
Jeder Punkt der Linie wäre ja ein Pixel !! klar.
Nun soll also genau mittels SETPIXEL so eine Linie
gezeichnet werden, von 10/10 nach 120/10. Quasi
der erste Pixel auf X=10, Y=10, der Zweite auf X=11,Y=11,
usw, bis das Ende 120/40 erreicht ist.
Das Problem ist jedoch hier die Unsymemtrische angabe,
der Abstand zwischen X und Y (X hat 110, Y hat 30 Pixel),
wodruch nicht einfach imemr nur +x und +y in einer
Schleife gezählt werden kann, das ganze würde dann ehr
einer Schranke ähneln.
10/10
\
\_________ 120/40
Wer hat dazu ne Lösung ???
gruss
Christian
|
| | Datum:30.11.01 17:49 
(prof.chaos@netcologne.de) | |
Hi,
also du willst eine Linie mit SetPixel anstelle von Line zeichnen?
Hier ist eine Lösung:
(Ich hab sie aber selbst noch nicht ganz verstanden, der Code ist nämlich ne Umsetzung)
proc Linie
parameters lx1%,ly1%,lx3%,ly3%,lf&
declare lxx2%,lyy2%,lxx1%,lyy1%,lx2%,ly2%,lnn%,ln%
lxx2%=0
lyy1%=0
if lx3%<lx1% ' Müssen wir von links nach rechts zeichnen?
lxx1%=-1 ' X-Richtung (nach links)
lx2%=lx1%-lx3% ' X-Abstand
else
lxx1%=1 ' X-Richtung (nach rechts)
lx2%=lx3%-lx1% ' X-Abstand
endif
if ly3%<ly1% ' Müssen wir von unten nach oben zeichnen?
lyy2%=-1 ' Y-Richtung (nach oben)
ly2%=ly1%-ly3% ' Y-Abstand
else
lyy2%=1 ' Y-Richtung (nach unten)
ly2%=ly3%-ly1% ' Y-Abstand
endif
if lx2%<ly2% ' X-Abstand kleiner als der Y-Abstand?
ln%=lx2% ' Dann vertauschen wir alles...
lx2%=ly2% ' Anregung für Profan 7.5: Ein Swap Befehl
ly2%=ln%
lxx2%=lxx1%
lxx1%=0
lyy1%=lyy2%
lyy2%=0
endif
lnn%=lx2%/2 ' ???
ln%=1 ' Der erste Pixel
setpixel lx1%,ly1%,lf& ' Den ersten Pixel ins Fenster
whilenot lx2%<ln% ' Sind wir nun alle Pixel durchgegangen?
add lx1%,lxx1% ' X-Position des nächsten Pixels
add ly1%,lyy1% ' Y-Position des nächsten Pixels
add lnn%,ly2%
if lnn%>lx2% ' ???
sub lnn%,lx2%
add lx1%,lxx2% ' X-Position des nächsten Pixels
add ly1%,lyy2% ' Y-Position des nächsten Pixels
endif
setpixel lx1%,ly1%,lf& ' Und rein ins Fenster
inc ln% ' Den nächsten Pixel
endwhile
endproc
'Aufruf:
'Linie X1,Y1,X2,Y2,F
'X1,Y1 : Start-Koordinaten
'Y2,Y2 : End-Koordinaten
'F : Farbe der Linie
Sebastian
|
| | Datum:30.11.01 20:06 
(idefix_nosferatus@lycos.de) | |
Hi Sebastian,
Das funktioniert ja recht gut !!!!
Was heist eigentlich "Umsetzung", von wo stammt den
die Uhr-Quelle ?
Christian
|
| | Datum:30.11.01 20:38 
(prof.chaos@netcologne.de) | |
Hallo nochmal,
> Das funktioniert ja recht gut !!!!
Schön.
> von wo stammt den die Uhr-Quelle ?
das war ein Commodore 64 Basic Listing, das die Titelfigur eines Magazins namens MAD zeichnen sollte.
Sebastian
|
| | Datum:30.11.01 20:04 
(frankabbing@12move.de) | |
Hallo,
hierfür kannst du auch den Bresenham-Algorhythmus verwenden, der eine Linie zusätzlich rastert (Antialiasing). Die Methode ist außerdem sehr schnell.
Auf folgender Seite wird der Algorhythmus einfach verständlich und mit Beispielprogrammen vorgestellt:
http://siemens.md.st.schule.de/fachbereiche/texte/informatik/bresenham/bres.htm
Gruß, Frank
|
| | Datum: 03.12.01 23:01 
(JHunke@aol.com) | |
Christian,
einen fertigen Bresenham Profan code, welcher setpixel zum Linienzeichnen verwendet, findest Du auf meiner Homepage zum download (Bresenham Line Draw):
http://members.aol.com/JHunke2/Stadtpark.htm
J.Hunke
|
|
|