| |
|
|
- Page 1 - |
|
| Hey potuto mir bitte einer der deutlich mehr mathematisch gebildeten XProfaner auf die Sprünge helfen ? Ich sehe den Wald vor Bäumen nicht mehr
Alles was ich will ist eine schnelle Funktion die aus der Strecke xy,xxyy mir den winkel (360°!) zurückliefert.
Mein Code funktioniert schon - naja fast. KompilierenMarkierenSeparierenCLS
WHILE 1
CLS
PRINT WNK(100,100,%MOUSEX,%MOUSEY)
SLEEP 100
ENDWHILE
WAITKEY
proc WNK
PARAMETERS X&,Y&,XX&,YY&
var T!=0
IF XX&<X&
RETURN WNK(XX&,Y&,X&,YY&)
ENDIF
IF YY&<Y&
RETURN WNK(X&,YY&,XX&,Y&)
ENDIF
LINE X&,Y& - XX&,YY&
var DX!=XX&-X&
var DY!=YY&-Y&
T!=(SQRT(DX!*DX!+DY!*DY!))
IF YY&<XX&
T!=RAD2DEG(SINH(DY!/T!))
ELSE
T!=45+(45-RAD2DEG(SINH(DX!/T!)))
ENDIF
RETURN T!
endproc
proc RAD2DEG
PARAMETERS ANGLE!
RETURN (180 / @PI()) * ANGLE!
endproc
proc SINH
PARAMETERS ANGLE!
RETURN (@EXP(ANGLE!) - @EXP(-ANGLE!)) / 2
./../function-references/xprofan/endproc/'>endproc
|
|
|
| |
|
|
|
| |
|
- Page 6 - |
|
Hubert Binnewies | Tjaaaaaaaaaaaaaaaaaaaa....
Wie soll ich es sagen......
alles auf anfang zurück....
bei dem Versuch auch hier den Sinus und Cosinus wegzulassen habe ich bemerkt das meine obige Routine zwar schön funktioniert, aber leider nicht richtig. an der stelle wo eigendlich 45 Grad auftauchen sollten werden 61 Grad angezeigt. das liegt daran das die Seiten eines rechtwinkligen Dreiecks doch nicht im direkten Rapporto zu den Winkeln steht, sondern doch nur zu den Sinus und Cosinus der Winkel. Womit alles das was ich bis jetzt hier geschrieben habe absoluter blödsinn ist. woraus folgt: das Lob an mich war mehr als verfrüht....
Hubert
P.S.: ich überlege weiter ob man da doch was machen kann, aber ich glaube nicht mehr daran. |
|
|
| WinXP Prof, XProfan 9.1 Newbie
Ein kluger Kopf sagte mal: "Nach dem derzeitigen Stand der Technik ist es unmöglich Programme zu schreiben, die fehlerfrei laufen!" | 08.12.2006 ▲ |
|
|
|
|
| Neinnein hier ist kein Lob verfrüht denn die Erkenntnis als Solche hat doch ihren Wert! Ich irre mich auch ständig und oft auch halbwegs dadurch beabsichtig mich an einer falschen Idee hochzuhangeln um die Erfahrung zu erhalten woran es letztendlich scheitert.
Wenn Du meinst die Funktion geht mathematisch nicht zu beschläunigen - dann haben wir also möglicherweise schon den besten Weg hier vorliegen. Das zu wissen ist doch viel Wert! |
|
|
| |
|
|
|
Hubert Binnewies | Hallo IF... es hat mich nicht losgelassen, ob ich es nicht doch schaffe zumindest deine zweite Formel zu kürzen...
Hier ist das Ergebniss...(und das Funktioniert , wie man sehen kann) KompilierenMarkierenSeparierenCLS
Declare OUTPX!,OUTPY!
OUTPX!=0
OUTPY!=0
WHILELOOP 0,359
GETCIRCP(100,100,50,&LOOP)
SETPIXEL OUTPX!,OUTPY!,0
GETCIRCP(300,100,&LOOP/10,&LOOP*3)
SETPIXEL OUTPX!,OUTPY!,0
ENDWHILE
WAITKEY
END
proc GETCIRCP
PARAMETERS XP!,YP!,R!,W!
OUTPX!=(R!*(@Sin(0.0174532925199433*W!)))+XP!
OUTPY!=YP!-(R!*(@Sin(0.0174532925199433*(90-W!))))
endproc
Kannst ja mal versuchen das zu benchen... Bin gespannt ob es nicht doch schneller ist
Hubert |
|
|
| WinXP Prof, XProfan 9.1 Newbie
Ein kluger Kopf sagte mal: "Nach dem derzeitigen Stand der Technik ist es unmöglich Programme zu schreiben, die fehlerfrei laufen!" | 09.12.2006 ▲ |
|
|
|
|
Hubert Binnewies | So... Dein zweites Prob hab ich mir auch mal angesehen.... Wenn Du noch den ArcSin vereinfachen würdest, sollte das immer noch einen tick schneller sein wie Deins (nicht sicher)...
Benche das doch mal.... KompilierenMarkierenSeparierenCLS
declare T!,DX!,DY!
WHILE 1
CLS
print WNK(400,200,%MOUSEX,%MOUSEY)
SLEEP 50
ENDWHILE
WAITKEY
proc WNK
PARAMETERS X&,Y&,XX&,YY&
LINE X&,Y& - XX&,YY&
LINE X&,Y& - X&+100,Y&+100
if xx&-x&>0
if yy&-y&=0
T! = 0 <---können auch 360 Grad sein
elseif yy&-y&>0
T! = 57.29577951*@ArcSin((yy& - y&)/sqrt((xx& - x&)^2 + (yy& - y&)^2))
elseif yy&-y&<0
T! = 180-(57.29577951*@ArcSin((((yy& - y&)*-1)/sqrt((xx& - x&)^2 + ((yy& - y&)*-1)^2))))+180
endif
endif
if xx&-x&=0
if yy&-y&>0
T! = 90
elseif yy&-y&<0
T! = 270
endif
endif
if xx&-x&<0
if yy&-y&>0
T! = 90-(57.29577951*@ArcSin(((yy& - y&)/sqrt(((xx& - x&)*-1)^2 + (yy& - y&)^2))))+90
elseif yy&-y&=0
T! = 180
elseif yy&-y&<0
T! = 180+(57.29577951*@ArcSin((((yy& - y&)*-1)/sqrt(((xx& - x&)*-1)^2 + ((yy& - y&)*-1)^2))))
endif
endif
RETURN T!
endproc
Proc ArcSin
Parameters Angle!
Declare Ergebnis!
If @Abs(Angle!) = 1
Ergebnis! = Angle! * (@Pi() / 2)
Else
Ergebnis! = @ArcTan(Angle! / @Sqrt(1 - @Sqr(Angle!)))
EndIf
Return< gebnis!
EndProc
Hubert |
|
|
| WinXP Prof, XProfan 9.1 Newbie
Ein kluger Kopf sagte mal: "Nach dem derzeitigen Stand der Technik ist es unmöglich Programme zu schreiben, die fehlerfrei laufen!" | 09.12.2006 ▲ |
|
|
|
|
| Zum WNK - das Zweite hier von Dir ist halb so schnell wie Deine erste Funktion die doppelt so schnell war wie meine. ^^
Hier der BenchSource: KompilierenMarkierenSeparierenDECLARE T!,DX!,DY!
RANDOMIZE
CLS
var TME&=&GETTICKCOUNT
WHILELOOP 10000
WNK(100,100,RND(200),RND(200))
ENDWHILE
TME&=&GETTICKCOUNT-TME&
var TME2&=&GETTICKCOUNT
WHILELOOP 10000
WNK2(100,100,RND(200),RND(200))
ENDWHILE
TME2&=&GETTICKCOUNT-TME2&
PRINT TME&
PRINT TME2&
WAITKEY
proc WNK
PARAMETERS X&,Y&,XX&,YY&
IF XX&-X&>0
IF YY&-Y&=0
T!=0
ELSEIF YY&-Y&>0
T!=57.29577951*@ARCSIN((YY& - Y&)/SQRT((XX& - X&)^2 + (YY& - Y&)^2))
ELSEIF YY&-Y&<0
T!=180-(57.29577951*@ARCSIN((((YY& - Y&)*-1)/SQRT((XX& - X&)^2 + ((YY& - Y&)*-1)^2))))+180
ENDIF
ENDIF
IF XX&-X&=0
IF YY&-Y&>0
T!=90
ELSEIF YY&-Y&<0
T!=270
ENDIF
ENDIF
IF XX&-X&<0
IF YY&-Y&>0
T!=90-(57.29577951*@ARCSIN(((YY& - Y&)/SQRT(((XX& - X&)*-1)^2 + (YY& - Y&)^2))))+90
ELSEIF YY&-Y&=0
T!=180
ELSEIF YY&-Y&<0
T!=180+(57.29577951*@ARCSIN((((YY& - Y&)*-1)/SQRT(((XX& - X&)*-1)^2 + ((YY& - Y&)*-1)^2))))
ENDIF
ENDIF
RETURN T!
endproc
proc ARCSIN
PARAMETERS ANGLE!
DECLARE ERGEBNIS!
IF @ABS(ANGLE!)=1
ERGEBNIS!=ANGLE! * (@PI() / 2)
ELSE
ERGEBNIS!=@ARCTAN(ANGLE! / @SQRT(1 - @SQR(ANGLE!)))
ENDIF
RETURN ERGEBNIS!
endproc
proc WNK2
PARAMETERS X!,Y!,XX!,YY!
var DX!=XX!-X!
var DY!=YY!-Y!
IF DX!>0
IF DY!>0
RETURN (90*(DY!))/SQRT((DX!)^2 + (DY!)^2)
ELSEIF DY!<0
RETURN 180-((90*((DY!)*-1))/SQRT((DX!)^2 + ((DY!)*-1)^2))+180
ELSE
RETURN 0
ENDIF
ELSEIF DX!<0
IF DY!>0
RETURN 90-((90*(DY!))/SQRT(((DX!)*-1)^2 + (DY!)^2))+90
ELSEIF DY!<0
RETURN 180+((90*((DY!)*-1))/SQRT(((DX!)*-1)^2 + ((DY!)*-1)^2))
ELSE
RETURN 180
ENDIF
ELSE
IF DY!>0
RETURN 90
ELSEIF DY!<0
RETURN 270
ELSE
RETURN 0
ENDIF
ENDIF RETURN T!
endproc
Und jetzt benche ich mal das GetCircP |
|
|
| |
|
|
|
| Jau Dein GetCirp ist doppelt so schnell *grins* KompilierenMarkierenSeparierenDECLARE COS_OUTPX!,COS_OUTPY!,OUTPX!,OUTPY!
RANDOMIZE
CLS
var TME&=&GETTICKCOUNT
WHILELOOP 10000
MYGETCIRCP(100,100,RND(100),RND(360))
ENDWHILE
TME&=&GETTICKCOUNT-TME&
var TME2&=&GETTICKCOUNT
WHILELOOP 10000
HBGETCIRCP(100,100,RND(100),RND(360))
ENDWHILE
TME2&=&GETTICKCOUNT-TME2&
PRINT TME&
PRINT TME2&
WAITKEY
proc HBGETCIRCP
PARAMETERS XP!,YP!,R!,W!
OUTPX!=(R!*(@SIN(0.0174532925199433*W!)))+XP!
OUTPY!=YP!-(R!*(@SIN(0.0174532925199433*(90-W!))))
endproc
proc MYGETCIRCP
PARAMETERS XP!,YP!,R!,W!
COS_OUTPX!=((((R!*SIN(((-1*(((-1+W!)*3.1415926535897932384626433832795)+3.1415926535897932384626433832795))/180))))*-1)+XP!)
COS_OUTPY!=((((R!*COS(((-1*(((-1+W!)*3.1415926535897932384626433832795)+3.1415926535897932384626433832795))/180))))*-1)+YP!)
endproc
|
|
|
| |
|
|
|
Hubert Binnewies | @IF zu 1 )Benche das nicht gegen meine alte routine, die rechnet doch nicht richtig. Benche gegen deine bisherige Routine, und versuche das Proc ArcSin zu vereinfachen, das macht die Sache schneller.
zu2 ) siehste....hat doch was gebracht.... ...(is aber nich ganz so genau wie deine....ein paar stellen hinterm Komma weniger)... |
|
|
| WinXP Prof, XProfan 9.1 Newbie
Ein kluger Kopf sagte mal: "Nach dem derzeitigen Stand der Technik ist es unmöglich Programme zu schreiben, die fehlerfrei laufen!" | 09.12.2006 ▲ |
|
|
|
|
| |
|
| |
|
|
|
| Ok hier die results 10.000 in Sekunden:
meine: 2,7 Deine1: 1,6 Deine2: 2,6
:--/ |
|
|
| |
|
|
|
| Versuche jetzt arcsin zu vereinfachen... |
|
|
| |
|
|
|
Hubert Binnewies | Nachtrag....
Der Gerechtigkeit halber (und meines Stolzes wegen circa meiner Verlobten) muss ich hier noch erwähnen, das die Formel nicht ganz auf meinem Mist gewachsen ist, sondern als ich nen Hänger hatte (nein...nich so einen...tztz...) meine Perle Ihre Matheunterlagen rausnahm (sie macht gerade ihren Realschulabschluss nach) hatte sie mich mit einer kleinen Diskussion in die richtige Richtung geschubst.....
Als Dank versprach ich ihr sie hier dankend zu erwähnen, was ich hiermit mache.
Hubert |
|
|
| WinXP Prof, XProfan 9.1 Newbie
Ein kluger Kopf sagte mal: "Nach dem derzeitigen Stand der Technik ist es unmöglich Programme zu schreiben, die fehlerfrei laufen!" | 12.12.2006 ▲ |
|
|
|
| |
|
- Page 7 - |
|
|
| |
|
| |
|
|