|  |  | 
|  | 
|  | 
|  | | Hey könnte 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
endproc
 | 
 | 
|  | 
|  |  | 
|  | 
| 
 
 
 | 
|  | 
|  Hubert
 Binnewies
 | | Hallo IF 
 also...in Mathe bin ich gut drauf...aber im verstehen deine Codes nicht so gut...
 
 sollte das der Sinussatz sein???
 
 macht mir doch mal ne Gleichung oder Formel auf und ich Denk mir was aus..oki??
 
 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!"
 | 05.12.2006  ▲ | 
 | 
|  | 
| 
 
 
 | 
|  | 
|  Carlo
 Keil
 | | Hallo iF, wenn ich das richtig verstehe, suchst du den Winkel zwischen einer Strecke bzw. deren Verlängerung und der x-Achse.
 Das sollte mit nur einer Winkelfunktion gehen:
 (mangels Profan und Testmöglichkeit nur ein Pseudocode)
 
 Winkel im Bogenmaß = Arcustangens(abs((y2 - y1) / (x2 - x1)))
 
 Üblicherweise sind die Winkelfunktionen nicht übermäßig schnell. Wenn es dir auf Performance ankommt sehe ich nur zwei Möglichkeiten: Assembler oder beim Programmstart eine eigene Arcustangenstabelle initialisieren, die du dann ohne Berechnung direkt abgreifst (deren Größe hängt natürlich von der gewünschten Genauigkeit ab
  ). 
 HTH
 Carlo
 | 
 | 
|  | 
|  |  | 
|  | 
| 
 
 
 | 
|  | 
|  | | @Hubert: Es geht mir halt darum von einer jeden Linie den Winkel ermitteln zu können. Ich tue mich schwer was die Umsprünge betrifft wenn z.B. xx&<x& ist etc. 
 @Carlo: Tabellen, klar, hab hier auch schon solche gepostet - aber die Genauigkeit sollte schon möglichst hoch sein - Tabellen fallen hier aus.
 
 An Winkel im Bogenmaß = Arcustangens(abs((y2 - y1) / (x2 - x1))) kann ich mich auch erinnern - das habe ich oben ja angewandt.
 
 Wenn ich obiges aber laufen lasse gibt es zw. 160° und 200° ein Problem - und ich bin betriebsblind.
 
 Natürlich werd ichs der Performance wegen nach ASM übertragen.
 | 
 | 
|  | 
|  |  | 
|  | 
| 
 
 
 | 
|  | 
|  | | Hm also mir schenkt keiner solch eine Proc wa?  | 
 | 
|  | 
|  |  | 
|  | 
| 
 
 
 | 
|  | 
|  Jac
 de
 Lad
 | | Ich erlaube mir mich zu den mathematisch gebildeten Personen hier im Forum zu zählen...  
 Aber ich verstehe die Fragestellung nicht. Kannste das nochmal ausführen? Auch aus dem Code werde ich nicht schlau...
 | 
 | 
|  | 
|  | | Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE)Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP
 | 05.12.2006  ▲ | 
 | 
|  | 
| 
 
 
 | 
|  | 
|  | | Ok klar! 
 ich male eine Linie von 100,100 nach mousex,mousey
 
 Alles was ich gerne hätte ist den Winkel der Linie!
 
 ----> 0°
 
 <--- 180°
 
 ^
 |
 270°
 
 Halt eine Proc die mir einfach immer den richtigen Winkel gibt nachdem ich ihr x,y - xx,yy übergeben habe.
 | 
 | 
|  | 
|  |  | 
|  | 
| 
 
 
 | 
|  | 
|  Jac
 de
 Lad
 | | Aso, kein Problem, kriegst bald ne Antwort! Muss jetzt aber grad was anderes machen... | 
 | 
|  | 
|  | | Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE)Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP
 | 05.12.2006  ▲ | 
 | 
|  | 
| 
 
 
 | 
|  | 
|  |  | 
|  | 
|  |  | 
|  | 
| 
 
 
 | 
|  | 
|  | | Ach lol ich dussel - ich habs. Hey aber vielleicht ist Deins schneller? Ich poste meins gleich mal... | 
 | 
|  | 
|  |  | 
|  | 
| 
 
 
 | 
|  | 
|  | | KompilierenMarkierenSeparieren
  {$cleq}
const myPi=3.1415926535897932384626433832795
cls
while 1
    cls
    print int(wnk(100,100,mousex,mousey,false)),"°  "
    sleep 50
wend
waitkey
proc wnk(float x1,y1,x2,y2,int mode)
    float x= sub ( x2! , x1! )
    float y= sub ( y2! , y1! )
    line x1,y1 - x2,y2
    case (x<0) and (y<0) : return wnk(x2,y2,x1,y1,3)
    case x<0 : return wnk(x2,y1,x1,y2,1)
    case y<0 : return wnk(x1,y2,x2,y1,2)
    casenot x : x=0.0000001
    casenot y : y=0.0000001
    float w=arctan(y/x)*180/myPi
    if (mode==1)
        w:=90+(90-w)
    elseif (mode==2)
        w:=360-w
    elseif (mode==3)
        w:=180+w
    endif
    return w
endproc
KompilierenMarkierenSeparieren
 CLS
WHILE 1
    CLS
    PRINT INT(WNK(100,100,%MOUSEX,%MOUSEY,0)),"°  "
    SLEEP 50
ENDWHILE
WAITKEY
proc WNK
    PARAMETERS X1!,Y1!,X2!,Y2!,MODE%
    var X!=SUB ( X2! , X1! )
    var Y!=SUB ( Y2! , Y1! )
    LINE X1!,Y1! - X2!,Y2!
    IF (X!<0) AND (Y!<0)
        RETURN WNK(X2!,Y2!,X1!,Y1!,3)
    ENDIF
    IF X!<0
        RETURN WNK(X2!,Y1!,X1!,Y2!,1)
    ENDIF
    IF Y!<0
        RETURN WNK(X1!,Y2!,X2!,Y1!,2)
    ENDIF
    IFNOT X!
        X!=0.0000001
    ENDIF
    IFNOT Y!
        Y!=0.0000001
    ENDIF
    var W!=ARCTAN(Y!/X!)*180/3.1415926535897932384626433832795
    IF (MODE%=1)
        W!=90+(90-W!)
    ELSEIF (MODE%=2)
        W!=360-W!
    ELSEIF (MODE%=3)
        W!=180+W!
    ENDIF
    RETURN W!
endproc
 | 
 | 
|  | 
|  |  | 
|  | 
| 
 
 
 | 
|  | 
|  Jac
 de
 Lad
 |  | 
|  | 
|  | | Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE)Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP
 | 05.12.2006  ▲ | 
 | 
|  | 
| 
 
 
 |