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:

Rotations Funktion

 
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
Thorben



Anmeldungsdatum: 26.04.2005
Beiträge: 173
Wohnort: SH

BeitragVerfasst am: 01.07.2007, 11:45    Titel: Rotations Funktion Antworten mit Zitat

Hallo,

ich brauche eine Funktion die einen Objekt um eine Achse drehen kann.
Ich hab eine Funktion geschrieben, die das Objekt aber nur um die Xachse dreht.

Code:

'===========================================================================
   FUNCTION TDRotatex( CtrPnt AS TYPE_3DVektor , RotPnt AS TYPE_3DVektor , Rota AS SINGLE = 1 ) AS TYPE_3DVektor
   '===========================================================================
   
       DIM NewPnt  AS TYPE_3DVektor
       DIM Radius  AS SINGLE
       DIM Winkel1 AS SINGLE
       DIM Winkel2 AS SINGLE
           
       Radius  = SQR( ( CtrPnt.x - RotPnt.x ) * ( CtrPnt.x - RotPnt.x ) + ( CtrPnt.z - RotPnt.z ) * ( CtrPnt.z - RotPnt.z ) )
       
       IF Radius <> 0 THEN
       
          Winkel1 = ( ACOS( ( RotPnt.x - CtrPnt.x ) / Radius ) )
          Winkel2 = ( ASIN( ( RotPnt.z - CtrPnt.z ) / Radius ) )
     
          IF Winkel2 < 0 THEN
             Winkel1 = ABS( Winkel1 / deg2rad - 360 ) 
          ELSE
             Winkel1 = Winkel1 / deg2rad
          END IF   
   
          NewPnt.x = ( COS( ( Winkel1 + Rota ) * deg2rad ) * Radius ) + CtrPnt.x
          NewPnt.y = RotPnt.y
          NewPnt.z = ( SIN( ( Winkel1 + Rota ) * deg2rad ) * Radius ) + CtrPnt.z
         
       ELSE 

          NewPnt = RotPnt

       END IF   
       
       RETURN NewPnt
       
   END FUNCTION


Durch diese Funktion würde ich jeden Punkt( RotPnt ) des OBjekts laufen lassen und mit eienem Winkel von "Rota" um den Punkt "CtrPnt" drehen. Als Rückgabewert erhalte ich dann die neue Position von "RotPnt".

Ist diese Funktion zuverlässig? oder habt ihr eine bessere Idee bzw optiemierungs vorschläge.

MFG Thorben
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 01.07.2007, 12:29    Titel: Antworten mit Zitat

wenn es dir nicht ums selbstschreiben geht, kannst du auch mal MultiPut anschauen, das ist ziemlich gut zwinkern
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Thorben



Anmeldungsdatum: 26.04.2005
Beiträge: 173
Wohnort: SH

BeitragVerfasst am: 01.07.2007, 12:49    Titel: Antworten mit Zitat

Ich hab vergessen zu sagen, dass ich die neuen Punkte brauch.
Also das objekt soll nicht nur gedreht werden sondern ich benötige auch die neuen Koordinaten. Ansonsten könnte ich ja auch die OpenGL Funktion "glRotatef" benutzen.

MFG Thorben
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: 01.07.2007, 12:56    Titel: Antworten mit Zitat

Ich habe da vor laengerer Zeit mal ein kleinen Versuch gemacht, vielleicht hilft es Dir irgendwie weiter...

Code:

declare sub set_vertex (x as short, y as short, z as short)
declare sub set_surface (p1 as ushort, p2 as ushort, p3 as ushort)

const DegRad = 3.14159265358979323/180
const focus = 180
const midx = 400
const midy = 300

type vertex_
    as short x,y,z
end type

type surface_
    as ushort p1,p2,p3
end type

dim shared vertex(999)  as vertex_
dim shared surface(999) as surface_

dim shared vcnt as uinteger
dim shared tricnt as uinteger

sub set_vertex (x as short, y as short, z as short)
    vertex(vcnt).x=x
    vertex(vcnt).y=y
    vertex(vcnt).z=z
    vcnt=vcnt+1
end sub

sub set_surface (p1 as ushort, p2 as ushort, p3 as ushort)
    surface(tricnt).p1=p1-1
    surface(tricnt).p2=p2-1
    surface(tricnt).p3=p3-1
    tricnt=tricnt+1
end sub   


'*****---set_vertex----set_surface-------------------------------------------------------------------------------------'

'' create obj3d (quader 100x100x100 vertex=8 surface=12)
'' set_vertex (vertex position x,vertex position y,vertex position z)
set_vertex (-50,-50,-50) 'vertex 1 to..
set_vertex (-50,-50, 50) ' ..2..
set_vertex ( 50,-50, 50) ' ..3..
set_vertex ( 50,-50,-50) ' ..4..
set_vertex (-50, 50,-50) ' ..5..
set_vertex (-50, 50, 50) ' ..6..
set_vertex ( 50, 50, 50) ' ..7..
set_vertex ( 50, 50,-50) ' 8


'' surface (triangle)
'' set_surface (vertex 1, vertex 2, vertex 3)

set_surface (1,2,3)
set_surface (1,4,3)

set_surface (1,5,4)
set_surface (5,8,4)

set_surface (4,3,8)
set_surface (8,7,3)

set_surface (7,6,3)
set_surface (6,2,3)

set_surface (1,2,5)
set_surface (5,6,2)

set_surface (5,8,7)
set_surface (7,6,5)
'' - - end create - -

'---------------------------------------------------------------------------------------------------------------------'
declare sub draw_object (byval raxis as short,byval angle as short,byval zoom as short)


enum
    NONE    =  0
    XAXIS   =  1
    YAXIS   =  2
'    XYAXIS = 3
    ZAXIS   =  4
'    XZAXIS = 5
'    YZAXIS = 6
'    XYZAXIS = 7
end enum



    screen 19,24,2
    dim shared as ubyte _edit
    dim shared as ubyte _view
    _edit=0 : _view=1





sub draw_object (byval raxis as short,byval angle as short,byval zoom as short)
    screenset _edit
    cls
   
        'for study
        for y=0 to 59
            for x=0 to 79
                line (0+(x*10),0+(y*10))-(9+(x*10),9+(y*10)),&h66,b
            next x
        next y
       
        line (0,midy)-(799,midy),&hff
        line (midx,0)-(midx,599),&hff
        'end for study

   
    for pnt=0 to tricnt
       
        xpoint1 = vertex(surface(pnt).p1).x
        ypoint1 = vertex(surface(pnt).p1).y
        zpoint1 = vertex(surface(pnt).p1).z
       
        xpoint2 = vertex(surface(pnt).p2).x
        ypoint2 = vertex(surface(pnt).p2).y
        zpoint2 = vertex(surface(pnt).p2).z

        xpoint3 = vertex(surface(pnt).p3).x
        ypoint3 = vertex(surface(pnt).p3).y
        zpoint3 = vertex(surface(pnt).p3).z
   
        select case raxis
        case XAXIS
           
            yypoint1 = ypoint1 * SIN(DEGRAD * angle) + zpoint1 * COS(DEGRAD * angle)
            zzpoint1 = ypoint1 * COS(DEGRAD * angle) - zpoint1 * SIN(DEGRAD * angle)
                ypoint1 = yypoint1 : zpoint1 = zzpoint1

            yypoint2 = ypoint2 * SIN(DEGRAD * angle) + zpoint2 * COS(DEGRAD * angle)
            zzpoint2 = ypoint2 * COS(DEGRAD * angle) - zpoint2 * SIN(DEGRAD * angle)
                ypoint2 = yypoint2 : zpoint2 = zzpoint2
           
            yypoint3 = ypoint3 * SIN(DEGRAD * angle) + zpoint3 * COS(DEGRAD * angle)
            zzpoint3 = ypoint3 * COS(DEGRAD * angle) - zpoint3 * SIN(DEGRAD * angle)
                ypoint3 = yypoint3 : zpoint3 = zzpoint3
       
        case YAXIS
           
            xxpoint1 = zpoint1 * SIN(DEGRAD * angle) + xpoint1 * COS(DEGRAD * angle)
            zzpoint1 = zpoint1 * COS(DEGRAD * angle) - xpoint1 * SIN(DEGRAD * angle)
                xpoint1 = xxpoint1 : zpoint1 = zzpoint1

            xxpoint2 = zpoint2 * SIN(DEGRAD * angle) + xpoint2 * COS(DEGRAD * angle)
            zzpoint2 = zpoint2 * COS(DEGRAD * angle) - xpoint2 * SIN(DEGRAD * angle)
                xpoint2 = xxpoint2 : zpoint2 = zzpoint2
           
            xxpoint3 = zpoint3 * SIN(DEGRAD * angle) + xpoint3 * COS(DEGRAD * angle)
            zzpoint3 = zpoint3 * COS(DEGRAD * angle) - xpoint3 * SIN(DEGRAD * angle)
                xpoint3 = xxpoint3 : zpoint3 = zzpoint3

        case ZAXIS
           
            xxpoint1 = ypoint1 * SIN(DEGRAD * angle) + xpoint1 * COS(DEGRAD * angle)
            yypoint1 = ypoint1 * COS(DEGRAD * angle) - xpoint1 * SIN(DEGRAD * angle)
                xpoint1 = xxpoint1 : ypoint1 = yypoint1

            xxpoint2 = ypoint2 * SIN(DEGRAD * angle) + xpoint2 * COS(DEGRAD * angle)
            yypoint2 = ypoint2 * COS(DEGRAD * angle) - xpoint2 * SIN(DEGRAD * angle)
                xpoint2 = xxpoint2 : ypoint2 = yypoint2
           
            xxpoint3 = ypoint3 * SIN(DEGRAD * angle) + xpoint3 * COS(DEGRAD * angle)
            yypoint3 = ypoint3 * COS(DEGRAD * angle) - xpoint3 * SIN(DEGRAD * angle)
                xpoint3 = xxpoint3 : ypoint3 = yypoint3

        end select
       


        xp1 = xpoint1 * FOCUS / (FOCUS - zpoint1) + midx
        yp1 = ypoint1 * FOCUS / (FOCUS - zpoint1) + midy
   
        xp2 = xpoint2 * FOCUS / (FOCUS - zpoint2) + midx
        yp2 = ypoint2 * FOCUS / (FOCUS - zpoint2) + midy
   
        xp3 = xpoint3 * FOCUS / (FOCUS - zpoint3) + midx
        yp3 = ypoint3 * FOCUS / (FOCUS - zpoint3) + midy
   
   
        line (xp1,yp1)-(xp2,yp2),&hffaa00
        line (xp2,yp2)-(xp3,yp3),&hffaa00
        line (xp3,yp3)-(xp1,yp1),&hffaa00
       
    next pnt
    swap _edit,_view
end sub




do
draw_object (yaxis,rotate,0)
screenset ,_view

if multikey(&h4b) then rotate=rotate-5 : if rotate <0 then rotate=rotate+360

if multikey(&h4d) then rotate=rotate+5 : if rotate >359 then rotate=rotate-360


loop until inkey$=chr$(27)


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



Anmeldungsdatum: 26.04.2005
Beiträge: 173
Wohnort: SH

BeitragVerfasst am: 01.07.2007, 15:41    Titel: Antworten mit Zitat

Danke!

Mal sehen ob es mir was nützt ich erhalte nemlich bei meiner Funktion ab und zu sehr ungewöhnliche Werte sodas die Objekte sehr komisch aussehen^^.

MFG Thorben
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Thorben



Anmeldungsdatum: 26.04.2005
Beiträge: 173
Wohnort: SH

BeitragVerfasst am: 01.07.2007, 21:31    Titel: Antworten mit Zitat

Danke die Funktion ist sehr gut lächeln

Aber wie schaff ich es die Funktionen so umzudrehen das sich das Objekt gegen den Uhrzeigersinn dreht wenn ich der Funktion als Winkel z.B. 45 Grad
übergebe?

MFG Thorben

/edit:

So hab ich die Funktion modifieziert:

Code:

'===========================================================================
   FUNCTION TDRotatez( CtrPnt AS TYPE_3DVektor , RotPnt AS TYPE_3DVektor , Rota AS SINGLE = 1 ) AS TYPE_3DVektor
   '===========================================================================
             
      DIM NewPnt AS TYPE_3DVektor
     
      RotPnt = TDMatrixSub( RotPnt , CtrPnt )
      NewPnt.x = RotPnt.y * SIN( deg2rad * Rota ) + RotPnt.x * COS( deg2rad * Rota ) + CtrPnt.x
      NewPnt.y = RotPnt.y * COS( deg2rad * Rota ) - RotPnt.x * SIN( deg2rad * Rota ) + CtrPnt.y
      NewPnt.z = RotPnt.z + CtrPnt.z
           
      RETURN NewPnt
       
   END FUNCTION
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
ytwinky



Anmeldungsdatum: 28.05.2005
Beiträge: 2624
Wohnort: Machteburch

BeitragVerfasst am: 01.07.2007, 21:46    Titel: Antworten mit Zitat

Thorben hat Folgendes geschrieben:
So hab ich die Funktion modifieziert:

Code:

'===========================================================================
   FUNCTION TDRotatez( CtrPnt AS TYPE_3DVektor , RotPnt AS TYPE_3DVektor , Rota AS SINGLE = 1 ) AS TYPE_3DVektor
   '===========================================================================
             
      DIM NewPnt AS TYPE_3DVektor
     
      RotPnt = TDMatrixSub( RotPnt , CtrPnt )
      NewPnt.x = RotPnt.y * SIN( deg2rad * Rota ) + RotPnt.x * COS( deg2rad * Rota ) + CtrPnt.x
      NewPnt.y = RotPnt.y * COS( deg2rad * Rota ) - RotPnt.x * SIN( deg2rad * Rota ) + CtrPnt.y
      NewPnt.z = RotPnt.z + CtrPnt.z
           
      RETURN NewPnt
       
   END FUNCTION
Die Funktion wäre schneller, wenn du einführst:
Code:
Dim RotaRad=deg2rad * Rota
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
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