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 4 -



Hubert
Binnewies
Du hast recht....du konntest mit meiner Gleichung nix anfangem weil sie schlichtweg falsch war....

Die korrekte Formel siehst du unten im Bild.

Woraus sich folgendes Listing ergibt...übergangs- und sprunglos...
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&

    if xx&-x&>0

        if yy&-y&>0

            T! = (90*(yy& - y&))/sqrt((xx& - x&)^2 + (yy& - y&)^2)

        endif

    endif

    if xx&-x&<0

        if yy&-y&>0

            T! = 90-((90*(yy& - y&))/sqrt(((xx& - x&)*-1)^2 + (yy& - y&)^2))+90

        endif

    endif

    if xx&-x&<0

        if yy&-y&<0

            T! = 180+((90*((yy& - y&)*-1))/sqrt(((xx& - x&)*-1)^2 + ((yy& - y&)*-1)^2))

        endif

    endif

    if xx&-x&>0

        if yy&-y&<0

            T! = 180-((90*((yy& - y&)*-1))/sqrt((xx& - x&)^2 + ((yy& - y&)*-1)^2))+180

        endif

    endif

    RETURN T!

./../funktionsreferenzen/xprofan/endproc/'>endproc


Kannst du damit was anfangen??

Hubert

3 kB
Kurzbeschreibung: Gleichung
Hochgeladen:06.12.2006
Downloadcounter100
Download
 
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!"
06.12.2006  
 




Hubert
Binnewies
Du hast recht....du konntest mit meiner Gleichung nix anfangem weil sie schlichtweg falsch war....

Die korrekte Formel siehst du unten im Bild.

Woraus sich folgendes Listing ergibt...übergangs- und sprunglos...
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&

    if xx&-x&>0

        if yy&-y&=0

            T! = 0

        endif

    endif

    if xx&-x&>0

        if yy&-y&>0

            T! = (90*(yy& - y&))/sqrt((xx& - x&)^2 + (yy& - y&)^2)

        endif

    endif

    if xx&-x&=0

        if yy&-y&>0

            T! = 90

        endif

    endif

    if xx&-x&<0

        if yy&-y&>0

            T! = 90-((90*(yy& - y&))/sqrt(((xx& - x&)*-1)^2 + (yy& - y&)^2))+90

        endif

    endif

    if xx&-x&<0

        if yy&-y&=0

            T! = 180

        endif

    endif

    if xx&-x&<0

        if yy&-y&<0

            T! = 180+((90*((yy& - y&)*-1))/sqrt(((xx& - x&)*-1)^2 + ((yy& - y&)*-1)^2))

        endif

    endif

    if xx&-x&=0

        if yy&-y&<0

            T! = 270

        endif

    endif

    if xx&-x&>0

        if yy&-y&<0

            T! = 180-((90*((yy& - y&)*-1))/sqrt((xx& - x&)^2 + ((yy& - y&)*-1)^2))+180

        endif

    endif

    RETURN T!

endproc


Kannst du damit was anfangen??

Hubert

3 kB
Kurzbeschreibung: Gleichung
Hochgeladen:06.12.2006
Downloadcounter138
Download
 
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!"
06.12.2006  
 



Klar super! Im prinzip wenn ich jetzt beide vergleiche - hast Du mein ArcTang in ein Sqrt getauscht - mal so grob gesagt.

Ich glaub - habs aber nur übersprungen - Deine Formel gibt einen falschen Wert wenn xx-x oder yy-y gleich Null ist. Ist aber Nebensache und durch ein >=0 statt >0 zu bebehen.

Jetzt muss ich nur noch rausbekommen ob Deine Variante mehr Performance in XProfan hat.

Ah hab grad gesehen hast die Formel nochmal überarbeitet - ich schau mal...
 
06.12.2006  
 




Hubert
Binnewies
[quote:93643e9b90=iF]Deine Formel gibt einen falschen Wert wenn xx-x oder yy-y gleich Null ist. Ist aber Nebensache und durch ein >=0 statt >0 zu bebehen.

[/quote:93643e9b90]
würde ich nicht tun....denn wenn yy-y=0 wird und du 0*90 machst bleibt es 0...
und wenn du dann versuchst die 0 zu teilen erhälst du einen ungültigen Funktionswert..

schau in das zweite listing...das erste ist leider ein Unfall beim reinsetzen ins Foro...
da habe ich das Problem gelöst...

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!"
06.12.2006  
 



Yeha! Deine Formal necessario 9% wniger Zeit bei mir

Hier der SpeedTestCode:
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 X1!,Y1!,X2!,Y2!,MODE%
    var DX!=X2!-X1!
    var DY!=Y2!-Y1!

    IF (DX!<0) AND (DY!<0)

        RETURN WNK(X2!,Y2!,X1!,Y1!,3)

    ENDIF

    IF DX!<0

        RETURN WNK(X2!,Y1!,X1!,Y2!,1)

    ENDIF

    IF DY!<0

        RETURN WNK(X1!,Y2!,X2!,Y1!,2)

    ENDIF

    IFNOT DX!

        DX!=0.0000001

    ENDIF

    IFNOT DY!

        DY!=0.0000001

    ENDIF

    var W!=ARCTAN(DY!/DX!)*57.295779513082320876798154814105

    IF (MODE%=1)

        W!=90+(90-W!)

    ELSEIF (MODE%=2)

        W!=360-W!

    ELSEIF (MODE%=3)

        W!=180+W!

    ENDIF

    RETURN W!

endproc

proc WNK2

    PARAMETERS X&,Y&,XX&,YY&

    IF XX&-X&>0

        IF YY&-Y&=0

            T!=0

        ENDIF

    ENDIF

    IF XX&-X&>0

        IF YY&-Y&>0

            T!=(90*(YY& - Y&))/SQRT((XX& - X&)^2 + (YY& - Y&)^2)

        ENDIF

    ENDIF

    IF XX&-X&=0

        IF YY&-Y&>0

            T!=90

        ENDIF

    ENDIF

    IF XX&-X&<0

        IF YY&-Y&>0

            T!=90-((90*(YY& - Y&))/SQRT(((XX& - X&)*-1)^2 + (YY& - Y&)^2))+90

        ENDIF

    ENDIF

    IF XX&-X&<0

        IF YY&-Y&=0

            T!=180

        ENDIF

    ENDIF

    IF XX&-X&<0

        IF YY&-Y&<0

            T!=180+((90*((YY& - Y&)*-1))/SQRT(((XX& - X&)*-1)^2 + ((YY& - Y&)*-1)^2))

        ENDIF

    ENDIF

    IF XX&-X&=0

        IF YY&-Y&<0

            T!=270

        ENDIF

    ENDIF

    IF XX&-X&>0

        IF YY&-Y&<0

            T!=180-((90*((YY& - Y&)*-1))/SQRT((XX& - X&)^2 + ((YY& - Y&)*-1)^2))+180

        ENDIF

    E
a> RETURN T! endproc
 
06.12.2006  
 



So jetzt versuche ich Deine Formel nochmal bisl programmablauftechnisch zu optimieren...
 
06.12.2006  
 




Hubert
Binnewies
[quote:ed547f9469=iF]So jetzt versuche ich Deine Formel nochmal bisl programmablauftechnisch zu optimieren...[/quote:ed547f9469]
Hab ich schon...verliert dadurch zwar etwas an übersichtlichkeit, aber es verschwinden einige zeitaufwendige IF Abfragen...
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&

    if xx&-x&>0

        if yy&-y&=0

            T! = 0 <---können auch 360 Grad sein

        elseif yy&-y&>0

            T! = (90*(yy& - y&))/sqrt((xx& - x&)^2 + (yy& - y&)^2)

        elseif yy&-y&<0

            T! = 180-((90*((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-((90*(yy& - y&))/sqrt(((xx& - x&)*-1)^2 + (yy& - y&)^2))+90

        elseif yy&-y&=0

            T! = 180

        elseif yy&-y&<0

            T! = 180+((90*((yy& - y&)*-1))/sqrt(((xx& - x&)*-1)^2 + ((yy& - y&)*-1)^2))

        endif

    endif

    RETURN T!

 href='./../../funktionsreferenzen/xprofan/endproc/'>endproc


Besser??
 
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!"
06.12.2006  
 



So nach meiner Optimierung ist Deine Variante doppelt so schnell wie meine Variante! Hier das Endergebnis:
KompilierenMarkierenSeparieren
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!

/../funktionsreferenzen/xprofan/endproc/'>endproc

 
06.12.2006  
 



Erstklassige Arbeit kann man da nur sagen!

Danke!
 
06.12.2006  
 




Hubert
Binnewies
jep....du hast ja nochn haufen subtraktionen und variablen benennungen rausgenommen....

Bist du denn so zufrieden? oder muss es noch schneller??

(ich hatte ja versprochen das ich mir was überlege)....

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!"
06.12.2006  
 



Also doppelt so schnell wie mein Ergebnis ist ungefähr das was ich mir vorstellte

Geht diese Funktion ähnlich umzustellen?
KompilierenMarkierenSeparieren
proc GETCIRCP

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

endp
>
 
06.12.2006  
 




Hubert
Binnewies
[quote:0fce4dc459=iF]Erstklassige Arbeit kann man da nur sagen!

Danke! [/quote:0fce4dc459]
Bitte Bitte....
Gerne gemacht...

[offtopic] dann kannste dir ja denken was hierdrin abgeht--->  [...]  [/offtopic]
 
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!"
06.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.759 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