Allgemeine Fragen zur PROFAN Programmierung
Views (Heute): 249327 (10763)
  Suchen
 Zurück zur Übersicht
 AutorThema: Berechnung von Pixel, Befehl Line ..
Christian Devilbis
Datum:30.11.01 15:40 Antwortenals Email verschicken (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



Sebastian Sprenger
Datum:30.11.01 17:49 Antwortenals Email verschicken (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




Christian Devilbis
Datum:30.11.01 20:06 Antwortenals Email verschicken (idefix_nosferatus@lycos.de) 


Hi Sebastian,

Das funktioniert ja recht gut !!!!

Was heist eigentlich "Umsetzung", von wo stammt den
die Uhr-Quelle ?

Christian



Sebastian Sprenger
Datum:30.11.01 20:38 Antwortenals Email verschicken (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



Frank Abbing
Datum:30.11.01 20:04 Antwortenals Email verschicken (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


Jürgen Hunke
Datum: 03.12.01 23:01 Antwortenals Email verschicken (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




 Zurück zur Übersicht