 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 24.03.2007, 04:24 Titel: Eigene Line Routine... |
|
|
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
wäre nett wenn sich das kurz jemand ansehen könnte...
danke _________________
 |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 24.03.2007, 22:36 Titel: |
|
|
sollte öffter auch mal bei Wiki gucken danke, sowas hab ich gesucht, steh in letzter Zeit 'n bissle auf'n schlauch  _________________
 |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 27.03.2007, 12:53 Titel: |
|
|
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 mir fehlen die Bilder in dem Code
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 |
|
 |
Stormy

Anmeldungsdatum: 10.09.2004 Beiträge: 567 Wohnort: Sachsen - wo die schönen Frauen wachsen ;)
|
Verfasst am: 27.03.2007, 13:16 Titel: |
|
|
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.
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 |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 27.03.2007, 13:19 Titel: |
|
|
ahh super, danke, mit pointer wollte ich eigentlich nicht arbeiten, aber ich schätze so kann ich es mir jetzt wenigstens übersetzen  _________________
 |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 27.03.2007, 13:30 Titel: |
|
|
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 |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 27.03.2007, 13:36 Titel: |
|
|
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
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 |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 27.03.2007, 13:48 Titel: |
|
|
vergessen  _________________
 |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 27.03.2007, 13:53 Titel: |
|
|
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 |
|
 |
|
|
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.
|
|