Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Eigene Line Routine...

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 24.03.2007, 04:24    Titel: Eigene Line Routine... Antworten mit Zitat

vermutlich bekomm ich langsam Alzheimer oder sowas, denn ich habe schon einmal eine recht gute Line routine in Power Basic geschrieben, leider kann ich mich nicht mehr erinnern wie, ich habe jetzt noch einmal den versuch gemacht...

Code:

screen 19

declare sub set_line (x1,y1,x2,y2)

sub set_line (x1,y1,x2,y2)
    dim stcx1 as integer
    dim stcx2 as integer
   
    dim stcy1 as integer
    dim stcy2 as integer
   
    dim steps as double
   
    dim destx as double
    dim desty as double
   
    dim sdx as double
    dim sdy as double
   
    stcx1=x1 : stcx2=x2 :stcy1=y1 : stcy2=y2
   
    If stcx1>stcx2 then swap stcx1,stcx2
    If stcy1>stcy2 then swap stcy1,stcy2
   
    steps=((stcx2-stcx1)+(stcy2-stcy1))/2
   
    destx=(x2-x1)/steps
    desty=(y2-y1)/steps
   
    for l=0 to steps-1
        pset (x1+sdx,y1+sdy),15
        sdx+=destx
        sdy+=desty
    next l
   
End sub


set_line (0,0,799,599)
'line (0,0)-(799,599),8

sleep


und das ist jetzt leider nur dabei herausgekommen, ich weiss das es gar nicht so kompliziert war, liegt vermutlich an der Uhrzeit zwinkern
wäre nett wenn sich das kurz jemand ansehen könnte...
danke
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 24.03.2007, 22:34    Titel: Antworten mit Zitat

Interessanter Artikel an dieser Stelle für Dich:

http://de.wikipedia.org/wiki/Bresenham-Algorithmus

Früher beim Commodore 64-BASIC war dies bekanntlich der einzige Weg, Grafik zu zeichnen! Dasselbe natürlich auch, wenn jemand gemäss meinem VESA-Artikel arbeiten möchte...
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 24.03.2007, 22:36    Titel: Antworten mit Zitat

sollte öffter auch mal bei Wiki gucken zwinkern danke, sowas hab ich gesucht, steh in letzter Zeit 'n bissle auf'n schlauch durchgeknallt
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 27.03.2007, 12:53    Titel: Antworten mit Zitat

Das ist der C-Code den ich von Wikipedia habe, leider ist mein umgang mit C in etwa so wie mein Umgang mit englisch, grobes verstehen ist da aber mehr auch nicht zwinkern mir fehlen die Bilder in dem Code grinsen durchgeknallt

void gbham(int xstart,int ystart,int xend,int yend,int *npix,int **xpix,int **ypix)
/*--------------------------------------------------------------
* Bresenham-Algorithmus: Linien auf Rastergeräten zeichnen
*
* Eingabeparameter:
* int xstart, ystart = Koordinaten des Startpunkts
* int xend, yend = Koordinaten des Endpunkts
*
* Ausgabeparameter:
* int *npix = Anzahl der Pixel
* int (*xpix)[i],(*ypix)[i] = Koordinaten des i-ten Pixels
*---------------------------------------------------------------
*/
{
int x, y, t, dist, xerr, yerr, dx, dy, incx, incy;

/* Entfernung in beiden Dimensionen berechnen */
dx = xend - xstart;
dy = yend - ystart;

/* Vorzeichen des Inkrements bestimmen */
if(dx<0)
{
incx = -1;
dx = -dx;
}
else if (dx > 0)
{
incx = 1;
}
else
{
incx = 0;
}

if(dy < 0)
{
incy = -1;
dy = -dy;
}

else if (dy > 0)
{
incy = 1;
}
else
{
incy = 0;
}

/* feststellen, welche Entfernung größer ist */
dist = (dx > dy)?dx:dy;

/* Initialisierungen vor Schleifenbeginn */
x = xstart;
y = ystart;
xerr = dx;
yerr = dy;

*npix = dist + 1;

*xpix = (int*)malloc( *npix * sizeof( int));
if( NULL == *xpix)
{
*npix = 0;
return;
}

*ypix=(int*)malloc( *npix * sizeof( int));
if( NULL == *ypix)
{
free( *xpix);
*npix = 0;
return;
}

/* Pixel berechnen */
for(t = 0; t < dist; ++t)
{
(*xpix)[t] = x;
(*ypix)[t] = y;

xerr += dx;
yerr += dy;

if(xerr > dist)
{
xerr -= dist;
x += incx;
}

if(yerr>dist)
{
yerr -= dist;
y += incy;
}
}

(*xpix)[dist] = xend;
(*ypix)[dist] = yend;
} /* gbham() */

kann mir einer möglicherweise erklären was genau da passiert, was ich rot eingefärbt habe ? Versteh das gerade nicht so ganz...
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Stormy



Anmeldungsdatum: 10.09.2004
Beiträge: 567
Wohnort: Sachsen - wo die schönen Frauen wachsen ;)

BeitragVerfasst am: 27.03.2007, 13:16    Titel: Antworten mit Zitat

Ich untersuche den Algorithmus mal kontextfrei.

Code:
dist = (dx > dy)?dx:dy;

Sofern die Bedingung (dx > dy) wahr ist, bekommt dist den Wert dx. Andernfalls bekommt dist den Wert dy.

Code:
*npix = dist + 1;

Der Wert, worauf der Pointer npix zeigt, soll den Wert dist + 1 bekommen.

Code:

*xpix = (int*)malloc( *npix * sizeof( int));
if( NULL == *xpix)
{
*npix = 0;
return;
}

Allokiere einen Speicherblock (genauer gesagt ein Int-Array der Länge *npix). Sofern das nicht klappt, wird abgebrochen.

Code:
*ypix=(int*)malloc( *npix * sizeof( int));
if( NULL == *ypix)
{
free( *xpix);
*npix = 0;
return;
}


Dasselbe wie im Code eins darüber, bloß, dass ypix auf den Speicherblock zeigt.
_________________
+++ QB-City +++ Die virtuelle Stadt für jeden Freelancer - Join the community!
Projekte: QB-City,MysticWorld (RPG), 2D-OpenGL-Tutorial
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 27.03.2007, 13:19    Titel: Antworten mit Zitat

ahh super, danke, mit pointer wollte ich eigentlich nicht arbeiten, aber ich schätze so kann ich es mir jetzt wenigstens übersetzen zwinkern
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 27.03.2007, 13:30    Titel: Antworten mit Zitat

Code:
'dist = (dx > dy)?dx:dy;

dist = Iif (dx > dy, dx, dy) 'so in Freebasic

_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 27.03.2007, 13:36    Titel: Antworten mit Zitat

Zitat:
Code:

'dist = (dx > dy)?dx:dy;

dist = Iif (dx > dy, dx, dy) 'so in Freebasic


Ein Befehl den ich bisher noch nie benutzt habe ?! damit könnte man sich reichlich If/Then Abfragen sparen, danke zwinkern

Allerdings hat mir das alles auch nicht wirklich weitergeholfen, kann es so schwer sein eine fehlerfreie Line Routine zu schreiben ?? da war mein erster versuch ja noch erfolgreicher....

Code:

Sub Line_ (byval pxs as integer,byval pys as integer,byval pxe as integer,byval pye as integer)
   
    DX=pxe-pxs
   
        If DX<0 Then
                xdest=-1
                DX=0-DX
            Elseif DX>0 then
                xdest=1
            Else
                xdest=0
        End If
   
        If DY<0 Then
                ydest=-1
                DY=0-DY
            Elseif DY>0 then
                ydest=1
            Else
                ydest=0
        End If
   
    Dist=IIF(DX > DY, DX, DY)
    'If DX>DY then Dist=DX else Dist=DY
   
    xx=pxs
    yy=pys
   
    xerr=dx
    yerr=dy
   
    for t=0 to dist
     
       xerr += DX
       yerr += DY
     
       if xerr>dist Then
         xerr -= dist
         xx += xdest
       End If
     
       if yerr>dist Then
         yerr -= dist
         yy += ydest
       end if
       
       pset (xx,yy),15 
   next t
   
   
End SUb


Das habe ich jetzt aus dem C Code gemacht ? aber irgendwie macht er wie immer alles nur nicht das was er soll....
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 27.03.2007, 13:48    Titel: Antworten mit Zitat

Code:
DY=pye-pys
vergessen mit dem Kopf durch die Mauer wollen mit dem Kopf durch die Mauer wollen mit dem Kopf durch die Mauer wollen
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 27.03.2007, 13:53    Titel: Antworten mit Zitat

Code:
'/* Pixel berechnen */
'for(t = 0; t < dist; ++t)

For t = 0 To dist-1 ' so in Freebasic

_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz