Allgemeine Fragen zur PROFAN Programmierung

Views (Heute): 249327 (10763)

| Suchen
| Zurück zur Übersicht

Autor | Thema: Berechnung von Pixel, Befehl Line ..
Christian Devilbis
| 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
Sebastian Sprenger
| 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
Christian Devilbis
| 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
Sebastian Sprenger
| 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
Frank Abbing
| 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
Jürgen Hunke
| 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

| Zurück zur Übersicht