Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 22.03.2007, 14:48 Titel: Sin/Cos Rotation in 2D |
|
|
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 |
|
 |
Flo aka kleiner_hacker
Anmeldungsdatum: 23.06.2006 Beiträge: 1210
|
Verfasst am: 22.03.2007, 15:54 Titel: |
|
|
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 |
|
 |
Eternal_pain

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

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 22.03.2007, 16:33 Titel: |
|
|
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 |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 22.03.2007, 17:35 Titel: |
|
|
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 |
|
 |
ytwinky

Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 22.03.2007, 18:20 Titel: |
|
|
..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
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 |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 22.03.2007, 18:24 Titel: |
|
|
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 |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 23.03.2007, 00:24 Titel: |
|
|
..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'.  _________________ 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: 23.03.2007, 02:25 Titel: |
|
|
naja, lesen kann man den source, aber verstehen tu ich gar nichts 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 |
|
 |
chutullu
Anmeldungsdatum: 18.10.2005 Beiträge: 77
|
Verfasst am: 23.03.2007, 13:53 Titel: |
|
|
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 |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
|
Nach oben |
|
 |
Flo aka kleiner_hacker
Anmeldungsdatum: 23.06.2006 Beiträge: 1210
|
Verfasst am: 23.03.2007, 20:15 Titel: |
|
|
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 |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 23.03.2007, 21:02 Titel: |
|
|
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  _________________
 |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 27.03.2007, 10:34 Titel: |
|
|
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
Edit:
Der fehler liegt doch in der Line Routine  _________________
 |
|
Nach oben |
|
 |
Eternal_pain

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