Deutsch
Forum

Mathe: Winkelberechnung

 
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

 
05.12.2006  
 




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
 
05.12.2006  
 



@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.
 
05.12.2006  
 



Hm also mir schenkt keiner solch eine Proc wa?
 
05.12.2006  
 




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.
 
05.12.2006  
 




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  
 



Wow!
 
05.12.2006  
 



Ach lol ich dussel - ich habs. Hey aber vielleicht ist Deins schneller? Ich poste meins gleich mal...
 
05.12.2006  
 




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

 
05.12.2006  
 




Jac
de
Lad
Probier mal das:
KompilierenMarkierenSeparieren
proc Winkel

    Parameters x1!,y1!,x2!,y2!
    declare dx!,dy!
    dx!=x2!-x1!
    dy!=y1!-y2!

    if Abs(dx!)<Abs(dy!)

        Return Pi()/2-ArcTan(dx!/dy!)+If((dx!<0) | (dy!<0),Pi(),0)

    else

        Return ArcTan(dy!/dx!)+If((dx!<0) | (dy!<0),Pi(),0)

    endif

endproc

 
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  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

4.818 Betrachtungen

Unbenanntvor 0 min.
Michael W.23.12.2016
Julian Schmidt25.11.2013
holmol9310.05.2013
Andreas Koch07.11.2012
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


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