|  |  | 
|  | 
|  | 
| - 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
 | 
 | 
|  | 
|  |  | 
|  | 
| 
 
 
 | 
|  |  | 
|  | 
| - 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
 | 
 
 | 
|  | 
|  | | 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
 | 
 
  | 
|  | 
|  | | 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...
 | 
 | 
|  | 
|  |  | 
|  | 
| 
 
 
 | 
|  | 
|  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
    Ea>
    RETURN  T!
endproc | 
 | 
|  | 
|  |  | 
|  | 
| 
 
 
 | 
|  | 
|  | | So jetzt versuche ich Deine Formel nochmal bisl programmablauftechnisch zu optimieren... | 
 | 
|  | 
|  |  | 
|  | 
| 
 
 
 | 
|  | 
|  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  ▲ | 
 | 
|  | 
| 
 
 
 | 
|  | 
|  |  | 
|  | 
|  |  | 
|  | 
| 
 
 
 | 
|  | 
|  | | Erstklassige Arbeit kann man da nur sagen! 
 Danke!
  | 
 | 
|  | 
|  |  | 
|  | 
| 
 
 
 | 
|  | 
|  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>
 | 
 | 
|  | 
|  |  | 
|  | 
| 
 
 
 | 
|  | 
|  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  ▲ | 
 | 
|  | 
| 
 
 
 |