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

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 17.08.2007, 13:35 Titel: |
|
|
..hä?  _________________ "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 |
|
 |
AndT
Anmeldungsdatum: 02.04.2007 Beiträge: 481
|
Verfasst am: 17.08.2007, 13:50 Titel: |
|
|
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...  |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 17.08.2007, 13:51 Titel: |
|
|
um es noch etwas zu verdeutlichen habe ich mal eben ein uraltes beispiel von mir FBC 17+ tasuglich gemacht
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
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
Edit:
Sehr Sinnfrei AndT
Wie ich die Bildmitte finde, das weiss ich gerade noch so, danke  _________________
 |
|
Nach oben |
|
 |
Digga

Anmeldungsdatum: 07.01.2006 Beiträge: 48
|
Verfasst am: 17.08.2007, 13:57 Titel: |
|
|
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 |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 17.08.2007, 14:32 Titel: |
|
|
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 |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 17.08.2007, 14:55 Titel: |
|
|
Das sind zwei sehr schoene Beispiele aber nicht wirklich das was ich gemeint habe (btw: das von Digga gefaellt mir recht gut )
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
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  _________________
 |
|
Nach oben |
|
 |
ytwinky

Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 17.08.2007, 16:10 Titel: |
|
|
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
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 |
|
 |
|
|
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.
|
|