Italia
Foro

Mathe: Winkelberechnung

 
- 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.
KompilierenMarkierenSeparieren
CLS

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

 
05.12.2006  
 



 
- 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!
 
08.12.2006  
 




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)
KompilierenMarkierenSeparieren
CLS
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....
KompilierenMarkierenSeparieren
CLS
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:
KompilierenMarkierenSeparieren
DECLARE 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
 
09.12.2006  
 



Jau Dein GetCirp ist doppelt so schnell *grins*
KompilierenMarkierenSeparieren
DECLARE 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

 
09.12.2006  
 




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  
 



oje habs verstanden! Ist mir entgangen das das hier:
KompilierenMarkierenSeparieren
proc WNK

    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

endproc


Nicht richtig rechnet. Wäre sehr schade war doppelt so schnell.
 
09.12.2006  
 



Ok hier die results 10.000 in Sekunden:

meine: 2,7
Deine1: 1,6
Deine2: 2,6

:--/
 
09.12.2006  
 



Versuche jetzt arcsin zu vereinfachen...
 
09.12.2006  
 




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 -


 
12.12.2006  
 




Answer


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

4.538 Views

Untitledvor 0 min.
Michael W.23.12.2016
Julian Schmidt25.11.2013
holmol9310.05.2013
Andreas Koch07.11.2012
Di più...

Themeninformationen



Admins  |  AGB  |  Applications  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Entrance  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie