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:

Sin/Cos Rotation in 2D

 
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: 22.03.2007, 14:48    Titel: Sin/Cos Rotation in 2D Antworten mit Zitat

Hi, hab mal wieder ein kleines Problem.
bisher habe ich nie viel mit Sinus und Cosinus berechnungen angestellt ausser ein paar kleineren Spielereien die nicht so kompliziert waren und wo es auch nicht so sehr auf die genauigkeit ankam.
Jetzt wollte ich ein kleineres 2D Objekt in einen Betimmten Winkel drehen lassen aber wie der folgene Code zeigt scheint es da noch das eine oder andere Problem zu geben, und nach unzähligen versuchen weiss ich nun nicht mehr was ich noch versuchen soll:

Code:

Screen 18,32,2


Dim Shared Font(255,15) As Ubyte


Declare Sub Font_Erstellen



Sub Font_Erstellen
    For zeichen=0 To 255
        Locate 1,1
        Print Chr$(zeichen) 
   
        For y=0 To 15       
            For x=0 To 7     
                Farbe=Point(x,y)
                If Farbe<>0 Then Font(zeichen,y)+=(1 Shl x)
            Next x
        Next y
    Next zeichen
    Cls
End Sub


Dim Shared Zeichen_Size_x as integer
Dim Shared Zeichen_Size_y as integer

Zeichen_Size_x=16
Zeichen_Size_y=8

           
           
Font_Erstellen   

for rotate = 0 to 359 step 45
    'cls
Zeichen=asc("T")

For y=0 To 15
For x=0 To 7

    If Bit(Font(Zeichen,y),x)<>0 Then
       
       
        npx = INT(((Zeichen_Size_x/2)+x)*Cos(rotate) - ((Zeichen_Size_y/2)+y)*Sin(rotate))
        npy = INT(((Zeichen_Size_x/2)+x)*Sin(rotate) + ((Zeichen_Size_y/2)+y)*Cos(rotate))
       
        'npx=((Zeichen_Size_x/2)+x)+(cos(rotate*(4*ATN(1))/180))
        'npy=((Zeichen_Size_y/2)+y)+(sin(rotate*(4*ATN(1))/180))
   
        Pset((npx)+100,(npy)+100),&hffffff
       
    End If
Next x
Next y
sleep 100
next rotate

sleep


Im Prinzip dreht sich das zeichen "T" (zum testen) schon mal, aber nicht genau um den Winkel den er eigentlich soll, darüber hinaus dreht er sich um eine falsche Achse, wie man bei dem versuch sehen kann ?!

Edit:
hier noch zwei beispiele mit sin/cos
Star.bas
3D-test.bas
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Flo
aka kleiner_hacker


Anmeldungsdatum: 23.06.2006
Beiträge: 1210

BeitragVerfasst am: 22.03.2007, 15:54    Titel: Antworten mit Zitat

also:
falscher winkel:
qb rechnet im RAD system (denke bei FB auch so)
also: grad winkel in rad umrechnen ( rad-winkel mal 180 durch pi oder so... ka)

falsche achse: um welche solls sich denn drehen
_________________
MFG
Flo

Satoru Iwata: Wer Spaß am Spielen hat, fragt nicht nach Grafik.

zum korrekten Verstaendnis meiner Beitraege ist die regelmaessige Wartung des Ironiedetektors unerlaesslich.
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: 22.03.2007, 16:02    Titel: Antworten mit Zitat

stimmt, nicht beacht hab'

Code:

        npx = (x+1)*Cos(rotate*pi/180) - (y+1)*Sin(rotate*pi/180)
        npy = (x+1)*Sin(rotate*pi/180) + (y+1)*Cos(rotate*pi/180)


damit wäre der korrekte winkel berechnet, aber die achse um die sich das zeichen drehen soll, ist der mittelpunkt von objekt, also zeichen aber es dreht sich einfach nur aussern herum ?!
_________________
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: 22.03.2007, 16:33    Titel: Antworten mit Zitat

so, das problem mit der achse ist auch gelöst...

Code:

        npx = (0-(zeichen_size_x/2)+(x+1))*Cos(rotate*pi/180) - (0-(zeichen_size_y/2)+(y+1))*Sin(rotate*pi/180)
        npy = (0-(zeichen_size_x/2)+(x+1))*Sin(rotate*pi/180) + (0-(zeichen_size_y/2)+(y+1))*Cos(rotate*pi/180)


Jetzt ist nur noch das Problem, das die berechnung eine leichte fehlerdarstellung zeigt, kann man das noch irgendwie hinterherberechnen ??


_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 22.03.2007, 17:35    Titel: Antworten mit Zitat

fehlerfrei kriegst dus nur wenn du rückwärts denkst, sprich das bild was entstehen soll pixel für pixel anschaust, "rückwärts" drehst und schaust was an der entsprechenden stelle im originalbild ist. Andersrum bekommst du bein runden der einzelnen pixel von vorher eben löcher.
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ytwinky



Anmeldungsdatum: 28.05.2005
Beiträge: 2624
Wohnort: Machteburch

BeitragVerfasst am: 22.03.2007, 18:20    Titel: Antworten mit Zitat

..und bedenke, daß Sin() und Cos() Double-Werte berechnen.
Also Pi/180 als Atn(1)/45 berechnen und einer Variablen zuweisen, die du dann in den Berechnungen verwendest, geht schneller zwinkern
Gruß
ytwinky
_________________
v1ctor hat Folgendes geschrieben:
Yeah, i like INPUT$(n) as much as PRINT USING..
..also ungefähr so, wie ich GOTO..
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: 22.03.2007, 18:24    Titel: Antworten mit Zitat

jo, danke... habsch gemacht,
aber geschwindigkeitsoptimierung bringt auch erst wat wenns richtig funzt, bis jetzt siehts halt net so schön aus...
das mit dem Rückwerts berechnen hab ich jetzt nicht so ganz raus und würde sicher die gewonnene geschwindigkeit zunichte machen ? ?!
_________________
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: 23.03.2007, 00:24    Titel: Antworten mit Zitat

..fraglich ob dir dieser Hinweis hilft?

Hier hat Joshy mal ein MultiPut geschrieben: http://www.freebasic.net/forum/viewtopic.php?p=17733

Der Quelltext ist nicht so einfach lesbar.

EDIT/
uii, der 9000 Beitrag in 'Allgemeine Fragen zu FreeBASIC'. happy
_________________
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: 23.03.2007, 02:25    Titel: Antworten mit Zitat

naja, lesen kann man den source, aber verstehen tu ich gar nichts zwinkern werd mich da wohl morgen nochmal in ruhe dran setzen müssen... immerhin siehts ganz nett aus und ist das was ich will....
Danke dafür
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
chutullu



Anmeldungsdatum: 18.10.2005
Beiträge: 77

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

Nur ne' kleine Verbesserung zwecks Gescwindigkeit

anstatt :
Code:

        npx = (x+1)*Cos(rotate*pi/180) - (y+1)*Sin(rotate*pi/180)
        npy = (x+1)*Sin(rotate*pi/180) + (y+1)*Cos(rotate*pi/180)


lieber so :

Code:
       dim dummySin(1 to 360) as double
       dim dummyCos(1 to 360) as double

       'irgendwelcher Code ....
       pi180 = pi / 180
       
        for a = 1 to 360
           dummySin(a)  = sin(a*pi180)
           dummyCos(a) = cos(a*pi180)
        next a

        'irgendwelcher Code ...
        incX = x + 1
        incY = y + 1
        npx = incX * dummyCos(rotate) - incY * dummySin(rotate)
        npy = incX * dummySin(rotate) + incY * dummyCos(rotate)


Da spart man sich für 2 Additionen und 4 Trigonometrische Berechnungen was sich positiv auf die Laufzeit auswirken dürfte
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 23.03.2007, 15:05    Titel: Antworten mit Zitat

..zu http://www.freebasic.net/forum/viewtopic.php?p=17733
Eternal_pain hat Folgendes geschrieben:
naja, lesen kann man den source, aber verstehen tu ich gar nichts

na dann lies mal das hier: http://www.friends-of-fpc.org/tutorials/graphics/dlx_dc/teil20.html

Hmm.. die neue Version von Joshys MultiPut läuft bei mir nur in der 256Farben Version??
_________________
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
Flo
aka kleiner_hacker


Anmeldungsdatum: 23.06.2006
Beiträge: 1210

BeitragVerfasst am: 23.03.2007, 20:15    Titel: Antworten mit Zitat

pixelfehler: keine rastergrafik sondern mit linien gezeichnetes bverwenden

also z.B. 5px hoch,1links,1hoch,3 rechts etc.
hat auch den vorteil dass dus resizen kannst
_________________
MFG
Flo

Satoru Iwata: Wer Spaß am Spielen hat, fragt nicht nach Grafik.

zum korrekten Verstaendnis meiner Beitraege ist die regelmaessige Wartung des Ironiedetektors unerlaesslich.
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: 23.03.2007, 21:02    Titel: Antworten mit Zitat

An die Mothode hab ich auch schon gedacht, muss ich mir nur dann noch überlegen wie ich sie letztendlich so umsetze das sie auch das am ende macht was ich damit vorhabe....
Danke an Volta und kleiner_hacker
Melde mich wieder, wenn ich es fertig habe, oder wieder hänge grinsen
_________________
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, 10:34    Titel: Antworten mit Zitat

kann einer den fehler bei der rotationsberechnung sehen ??

Code:

CONST RAD AS DOUBLE = Atn(1)/45
screen 18

Sub Line_ (byval pxs as integer,byval pys as integer _
          ,byval pxe as integer,byval pye as integer)
         
          dim i as double

          if pxs>pxe Then
              xdest=-1
          Else
              xdest=1
          end if
         
          if pxs=pxe Then xdest=0

          if pys>pye Then
              ydest=-1
          Else
              ydest=1
          end if
         
          if pys=pye Then ydest=0
   
         
          i=abs(pxe-pxs)/2
         
          nx=pxs
          ny=pys
         
          do
               
                if nx<>pxe then nx=nx+xdest
                i=i-abs(pye-pys)
               
                if i<0 then
                    if ny<>pye then ny=ny+ydest
                    i=i+(pxe-pxs)
                end if
               
                pset (nx,ny),15
               
          loop while nx<>pxe or ny<>pye
End Sub

while inkey$<>chr$(27)
        screenlock
        cls
        npxs = int((-50)*Cos(rotate*rad) - (-50)*Sin(rotate*rad))
        npys = int((-50)*Sin(rotate*rad) + (-50)*Cos(rotate*rad))

        npxe = int((50)*Cos(rotate*rad) - (50)*Sin(rotate*rad))
        npye = int((50)*Sin(rotate*rad) + (50)*Cos(rotate*rad))

        Line_ (320+npxs,240+npys,320+npxe,240+npye)
       
        rotate=rotate+2
       
        if rotate>360 then rotate=rotate-360
        screenunlock
        sleep 10
wend
end


ziel war es eigentlich, zum Test eine linie x100 pixel in step zwei grad zu drehen...
Langsam zweifel ich an meinem Verstand durchgeknallt

Edit:
Der fehler liegt doch in der Line Routine durchgeknallt grinsen
_________________
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, 14:36    Titel: Antworten mit Zitat

Jetzt habe ich die Rotation in verbindung mit einer Line routine versuchtr, aber habe dabei leider immernoch störpixel ?!

Code:

CONST RAD AS DOUBLE = Atn(1)/45

Screen 18,32,2


Dim Shared Font(255,15) As Ubyte

Dim shared npx as double
Dim shared npy as double
dim shared rotate as single

Declare Sub Font_Erstellen

Sub Font_Erstellen
    For zeichen=0 To 255
        Locate 1,1
        Print Chr$(zeichen) 
   
        For y=0 To 15       
            For x=0 To 7     
                Farbe=Point(x,y)
                If Farbe<>0 Then Font(zeichen,y)+=(1 Shl x)
            Next x
        Next y
    Next zeichen
    Cls
End Sub

Dim Shared Zeichen_Size_x as integer
Dim Shared Zeichen_Size_y as integer

Zeichen_Size_x=8/2
Zeichen_Size_y=16/2

           
           
Font_Erstellen   

while inkey$<>chr$(27)
Zeichen=asc("O")
screenlock
cls


   
       
       
       
         
 
               
               

    for lly=0 to 15
        npxs = ((-4)*Cos(rotate*rad) - ((-8)+lly)*Sin(rotate*rad))
        npys = ((-4)*Sin(rotate*rad) + ((-8)+lly)*Cos(rotate*rad))

        npxe = ((4)*Cos(rotate*rad) - ((-8)+lly)*Sin(rotate*rad))
        npye = ((4)*Sin(rotate*rad) + ((-8)+lly)*Cos(rotate*rad))
       
       
    DX=(npxe-npxs)
    DY=(npye-npys)
   
        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=npxs
    yy=npys
   
    xerr=dx
    yerr=dy
   
    for t=0 to dist-1
     
       xerr += DX
       yerr += DY
     
       if xerr>dist Then
         xerr -= dist
         xx += xdest
         icx=icx+1
       End If
     
       if yerr>dist Then
         yerr -= dist
         yy += ydest
         icy=icy+1
       end if
       
       If Bit(Font(Zeichen,lly),t)<>0 Then Pset (100+xx,100+yy),&hffffff
   next t
               
next lly               
 
rotate+=15
If rotate>359 then rotate-=360

screenunlock
sleep 10
wend



was ist daran jetzt falsch ???
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
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