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:

Winkel und Radius bestimmen?

 
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: 17.08.2007, 02:47    Titel: Winkel und Radius bestimmen? Antworten mit Zitat

Hi,

Ich hatte vor ein Bild in Einzelteile zu splitten um dieses dann in einer Rotationsbewegung wieder zusammenfuegen.

Das Problem dabei ist folgendes, jedes Bildteil hat seine Feste endposition
in X und Y.
Wie kann ich diese X und Y position in Winkel und Radius vom Screenmittelpunkt errechnen? Damit ich bei der Rotation mit Cos/Sin weiss wo das Teil wieder fixiert werden soll?

Noch eine kleine Grafik, um das Problem zu verdeutlichen...


_________________
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: 17.08.2007, 13:35    Titel: Antworten mit Zitat

..hä? happy
_________________
"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
AndT



Anmeldungsdatum: 02.04.2007
Beiträge: 481

BeitragVerfasst am: 17.08.2007, 13:50    Titel: Antworten mit Zitat

in der Mitte ein Kreis zeichnen oder sowas.
Die Mitte erhält man so:
Code:
screen 14
dim as integer ScreenX,ScreenY
screeninfo ScreenX,ScreenY
ScreenX/=2:ScreenY/=2
pset (screenx,screeny)
sleep

und wies dann weiter geht kp.
_________________
Bis irgendwann... grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



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

BeitragVerfasst am: 17.08.2007, 13:51    Titel: Antworten mit Zitat

um es noch etwas zu verdeutlichen habe ich mal eben ein uraltes beispiel von mir FBC 17+ tasuglich gemacht grinsen

Code:

CONST PI AS DOUBLE = (4*(ATN(1)))
Const centerx as Integer = 320
const centery as integer = 240

SCREEN 18,32
setmouse 0,0,0
randomize timer

dim wtimer as double
Dim radius as integer

radius=150

dim stars as string
dim as integer sw,sw1,sw2
dim as integer sr,sr1,sr2

for star as integer=0 to 10
    sw=int(rnd*360)
    sr=int(rnd*500)
   
    if sw-255<0 then sw1=0:sw2=sw else sw1=sw-255:sw2=255
    if sr-255<0 then sr1=0:sr2=sr else sr1=sr-255:sr2=255
   
    stars=stars+chr(sw1,sw2,sr1,sr2)
next star


Dim Key as String
wtimer=timer

Dim as integer x,xx
Dim as integer y,yy
Dim as integer w1,w2
Dim as integer r1,r2
Dim winkel as integer
Dim cc as integer

while key<>chr(27)

    ScreenLock
    cls
    key=inkey


    for s as integer=0 to 10
        w1=asc(mid(stars,1+(s*5),1)):w2=asc(mid(stars,2+(s*5),1))
        r1=asc(mid(stars,3+(s*5),1)):r2=asc(mid(stars,4+(s*5),1))
        winkel=w1+w2 : radius=r1+r2

        xx=(SIN(winkel*pi/180)*(radius))
        yy=(COS(winkel*pi/180)*(radius))
        x=320+xx
        y=240+yy
       

        cc=&hffffff
        if s/2=int(s/2) then cc=&hcccccc
        if s/3=int(s/3) then cc=&haaaaaa


        if x>-1 and x<620 and y>-1 and y<460 and radius>10 then pset (x,y),cc
       

        if s/2=int(s/2) then winkel=winkel+1
        if s/3=int(s/3) then winkel=winkel-1 else winkel=winkel

        if winkel>359 then winkel=0   
        if winkel<0   then winkel=359
        radius=radius+1
        if radius>500 then radius=0


        if winkel-255<0 then sw1=0:sw2=winkel else sw1=winkel-255:sw2=255
        if radius-255<0 then sr1=0:sr2=radius else sr1=radius-255:sr2=255
        mid(stars,1+s*5)=chr(sw1,sw2,sr1,sr2)

    next s
    ScreenUnlock
    sleep (5)
wend


die Pixel (Sterne) die nun hier etwas orientierungslos in der gegen kreisen, sollen Bildteile werden... und dann in einer gleichmaessigen Sin/Cos roation von aussen nach innen ins Bild drehen...

Dabei soll von dem Originalbild von der Mitte aus mit dem ausschneiden begonnen werden und in den Sichtbaren Screen reinkommen... wenn es nun auf dem WorkScreen die ungefaehre stelle erreicht hat wie es seinen Platz im Original hat, so soll dieses fixiert werden waehrend schon das naechste Bildteilchen reingekommen ist, das auch sein platz sucht durchgeknallt
So ungefaehr...

ich habe sowas mal bei irgendeinem Uraltem Spiel gesehen (weiss aber wirklich nicht mehr welches das war bzw von wem) wo das DevLogo als MainIntro so aehnlich zustande kam... ich fand das war ein recht netter effeckt...

sowas koennte man sicherlich auch mit einer Bild fuer Bild animation machen, aber die Idee dabei war wie immer, Speicherplatz zu sparen, wozu MBs an Bildmaterial verschwenden, wenn es ein einziges auch tut grinsen

Edit:
Sehr Sinnfrei AndT mit den Augen rollen
Wie ich die Bildmitte finde, das weiss ich gerade noch so, danke durchgeknallt
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Digga



Anmeldungsdatum: 07.01.2006
Beiträge: 48

BeitragVerfasst am: 17.08.2007, 13:57    Titel: Antworten mit Zitat

Vieleicht hilft dir dieser code wieter. ist zwar ein rotierender Würfel aber das läßt sich ja ändern...
Code:

DEFSNG A-Z
SCREEN 12

'     Tipp: PI ist der Arkustangens von 1 multipliziert mit 4
'
'     die Formeln:  CosinusRadiant = COS(PI/180)
'             und:    SinusRadiant = SIN(PI/180)
'
'     dienen zum Berechnen der Steps - also Punkte - die AUF einer Kreisbahn
'     von unseren Koordinaten zurckgelegt werden.
'
'     Distance% ist ein Wert der den Blickwinkel auf das Objekt - also
'     den 'Tiefenblick' beeinfluát. Tipp: Einfach mal den Wert auf 100 um-
'     stellen und du weiát was gemeint ist.

cRad = COS((ATN(1) * 4) / 180)
sRad = SIN((ATN(1) * 4) / 180)
Distance% = 400

'---> Typedefinition fr Koordinaten

TYPE tpointr
   X AS SINGLE
   Y AS SINGLE
   Z AS SINGLE
END TYPE
DIM SHARED Box(0 TO 7) AS tpointr

'---> Koordinaten auslesen

FOR I% = 0 TO 7
   READ Box(I%).X, Box(I%).Y, Box(I%).Z
NEXT

'---> Beginn Hauptschleife

DO: CLS

   '---> die X-Y-Z Koordinaten mit einfachem Bubblesort sortieren,
   '---> damit die Punkte im Hintergrund zuerst gezeichnet werden.

   FOR J% = 0 TO 6
      FOR I% = 0 TO 6
         IF Box(I%).Z < Box(I% + 1).Z THEN
            SWAP Box(I%).Z, Box(I% + 1).Z
            SWAP Box(I%).X, Box(I% + 1).X
            SWAP Box(I%).Y, Box(I% + 1).Y
         END IF
      NEXT
   NEXT
 
   '---> hinzeichnen

   LOCATE 1, 1: PRINT "Benutze [.] [,] und [-] zum rotieren."
 
   FOR I% = 0 TO 7

      '---> das hier wandelt die 3D-Koordinaten in 2D-Koordinaten um
      Xs1% = INT((Box(I%).X * Distance%) / (Box(I%).Z + Distance%))
      Ys1% = INT((Box(I%).Y * Distance%) / (Box(I%).Z + Distance%))

      '---> wenn Punkt im Hintergrund, dann nimm dunkle Farbe
      IF Box(I%).Z > 0 THEN F = 8 ELSE F = 7

      '---> 320 & 240 addieren, zum Zentrieren auf dem Bildschirm
      X% = INT(Xs1%) + 320
      Y% = INT(Ys1%) + 240

      '---> Punkte darstellen
      LINE (X% - 2, Y%)-(X% + 2, Y%), F
      LINE (X%, Y% - 2)-(X%, Y% + 2), F
   NEXT
 
   '---> Tastenabfrage mit Neuberechnung der Koordinaten

   DO: a$ = INKEY$
   SELECT CASE a$
      CASE CHR$(27): END
      CASE ",": '---> Rotation um X-Achse
         FOR I% = 0 TO 7
            Box(I%).Y = Box(I%).Y * cRad + Box(I%).Z * sRad
            Box(I%).Z = -Box(I%).Y * sRad + Box(I%).Z * cRad
         NEXT
         EXIT DO
      CASE ".": '---> Rotation um Y-Achse
         FOR I% = 0 TO 7
            Box(I%).X = Box(I%).X * cRad - Box(I%).Z * sRad
            Box(I%).Z = Box(I%).X * sRad + Box(I%).Z * cRad
         NEXT
         EXIT DO
      CASE "-": '---> Rotation um Z-Achse
         FOR I% = 0 TO 7
            Box(I%).X = Box(I%).X * cRad + Box(I%).Y * sRad
            Box(I%).Y = -Box(I%).X * sRad + Box(I%).Y * cRad
         NEXT
         EXIT DO
   END SELECT
   LOOP
LOOP

'---> Die Koordinaten beschreiben einen Wrfel
DATA -40,-40,-40
DATA  40,-40,-40
DATA  40, 40,-40
DATA -40, 40,-40
DATA -40,-40, 40
DATA  40,-40, 40
DATA  40, 40, 40
DATA -40, 40, 40

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


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

BeitragVerfasst am: 17.08.2007, 14:32    Titel: Antworten mit Zitat

das hier könnte passen... eine komplette rotation mit sinus / cosinus. ein alter qb-code, der noch mit -lang qb funktioniert:
http://www.freebasic-portal.de/index.php?s=fbporticula&mode=show&id=106
_________________
» 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
Eternal_pain



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

BeitragVerfasst am: 17.08.2007, 14:55    Titel: Antworten mit Zitat

Das sind zwei sehr schoene Beispiele aber nicht wirklich das was ich gemeint habe (btw: das von Digga gefaellt mir recht gut lächeln )

Aber noch waerend ich das hier gebastelt habe:

um noch einmal zu verdeutlichen was ich meine, ist mir bereits eine loesung zu dem Problem eingefallen grinsen

Eigentlich wollte ich ja herausfinden zu welchem Winkel und Radius der einzelne Bereich zur Bildmitte steht, allerdings ist es vermutlich viel einfacher wenn ich es einfach kreisen lasse bis der bereich erreicht ist und fertig durchgeknallt
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
ytwinky



Anmeldungsdatum: 28.05.2005
Beiträge: 2624
Wohnort: Machteburch

BeitragVerfasst am: 17.08.2007, 16:10    Titel: Antworten mit Zitat

Vllt solltest du mal mit Riwi.Bas spielen..
Riwi rechnet die Strecke zwischen 2 Punkten und den Richtungswinkel bezogen auf Nord(also oben)..
Mußte ma kucken, obde das gebrauchen kannst happy
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