Deutsch
Forum

Mathe: Winkelberechnung

 
- Seite 1 -


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  
 



 
- Seite 3 -


WO 270 ist ist Wurst! Kannst Du gerne machen wie es besser wäre!
 
05.12.2006  
 



Nur mal nebenbei das passende Gegenstück ist mir auch grad gelungen ^^
KompilierenMarkierenSeparieren
const myPI:=3.1415926535897932384626433832795
float cos_outpx,cos_outpy

proc getcircp(float xp,yp,r,w)

    cos_outpx:=((((r*sin(((-1*(((-1+w)*myPI)+myPI))/180))))*-1)+xp)
    cos_outpy:=((((r*cos(((-1*(((-1+w)*myPI)+myPI))/180))))*-1)+yp)

endproc


KompilierenMarkierenSeparieren
var COS_OUTPX!=0
var COS_OUTPY!=0

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

endproc

Okok über die Klammern reden wir nicht! *g*
 
05.12.2006  
 



Jupp lol sowas braucht die Welt *gg*
KompilierenMarkierenSeparieren
 {$cleq}
const myPI=3.1415926535897932384626433832795
float cos_outpx,cos_outpy,w
cls

while 1

    cls
    w:=wnk(100,100,mousex,mousey,false)
    print int(w),"°  "
    getcircp 100,100,50,w+90
    drawtext cos_outpx,cos_outpy,"+"
    sleep 50

wend

waitkey

proc wnk(float x1,y1,x2,y2,int mode)

    float dx=x2!-x1!
    float dy=y2!-y1!
    line x1,y1 - x2,y2
    case (dx<0) and (dy<0) : return wnk(x2,y2,x1,y1,3)
    case dx<0 : return wnk(x2,y1,x1,y2,1)
    case dy<0 : return wnk(x1,y2,x2,y1,2)
    casenot dx : dx=0.0000001
    casenot dy : dy=0.0000001
    float 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 Winkel

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

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

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

    else

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

    endif

endproc

proc getcircp(float xp,yp,r,w)

    cos_outpx:=((((r*sin(((-1*(((-1+w)*myPI)+myPI))/180))))*-1)+xp)
    cos_outpy:=((((r*cos(((-1*(((-1+w)*myPI)+myPI))/180))))*-1)+yp)

endproc

 
05.12.2006  
 




Hubert
Binnewies
Also, ich bin der Meinung, die meiste Prozessorzeit geht bei komplizierten Berechnungen wie Sinus & Co drauf.
Darum halte ich es so wie es mein verstorbener Vater (er war Berufskraftfahrer) immer gesagt hat: Der kürzeste Weg ist nicht immer der Schnellste !.

Ich dachte mir: bei X,Y XX,y YY,X erhält man immer ein rechtwinkliges Dreieck.
Wenn ich mir Dein erstes Proggi genauer ansehe ist da XX immer grösser als X und YY immer grösser als Y.
Demzufolge braucht man bis auf ne Wurzel den Proz nur mit Grundrechenarten zu beauftragen, die er ganz schnell berechnen kann.
Erst den einfachen Pythagoras um die Hypothenuse zu berechnen und dann ein Seiten-Winkelverhältnis.

Und sollte X doch mal grösser werden als XX dann nimm einfach X-XX mal -1 und den Winkel plus 90 .
Und sollte Y doch mal grösser sein als YY dann nimm einfach Y-YY mal -1 und zieh das Ergebniss von 360 Grad ab... und schon passt es...

Das ganze passt dann in die Formel im Bild.

Im Programmtechnischen Umsetzen bist Du besser wie ich...

Hubert

3 kB
Kurzbeschreibung: Gleichung
Hochgeladen:06.12.2006
Ladeanzahl172
Herunterladen
 
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  
 



Ich glaub das isses was ich umgesetzt habe und ich finde Dein Pa hatte damit sicherlich oft recht.
 
06.12.2006  
 




Hubert
Binnewies
[quote:1a7341c7f9=iF]Ich glaub das isses was ich umgesetzt habe[/quote:1a7341c7f9]
na eben nicht.....
Du nutzt die Funktionen zum umrechnen ins Bogenmaß um Sinus und Cosinus zu nutzen....

Lass das doch alles weg....
Brauchst du doch garnicht...
Setz einfach meine Formel um.. nur mit den Zahlen, dann kommt direkt als Antwort die Gradzahl raus..
geht doch viel fixer....
und das auch noch soweit wie du @Set(Decimals,N) setzt.....

Ich meinte damit: Du nutzt den direkten Berechnungsweg, brauchst dafür aber die Umrechnung ins Bogenmaß und den Sinus.

In meiner Formel wird alles in 2 Schritten berechnet (Pythagoras und Verhältniss), aber dafür ohne Beachtung der Einheiten, womit die rechenintensiven Operationen wie @Deg2Rad(N) oder @Sin(N) wegfallen...

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  
 



sqrt( ( (xx-x)² + (yy-y)² ) / (xx-x) )*90 ? Sowas?
 
06.12.2006  
 




Hubert
Binnewies
Bingo.....
 
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  
 




RGH
Und in XProfan wird aus der Formal dann diese Zeile:
KompilierenMarkierenSeparieren
!a! = (90 * sqrt((xx% - x%)^2 + (yy% - y%)^2)) / (xx% - x%)

Einen Tick schneller vielleicht mit der Sqr()-Funktion:
KompilierenMarkierenSeparieren
!a! = (90 * sqrt(sqr(xx% - x%) + sqr(yy% - y%))) / (xx% - x%)

Gruß
Roland
 
Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4
06.12.2006  
 




Hubert
Binnewies
und alles ohne grad umrechnung....
gehts noch schneller???
 
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 - nun erfüllt Eure Formel aber leider immer noch nicht den Zweck des Threads hier - was diese aber tut:
KompilierenMarkierenSeparieren
proc WNK

    PARAMETERS X1!,Y1!,X2!,Y2!,MODE%
    var DX!=X2!-X1!
    var DY!=Y2!-Y1!
    LINE X1!,Y1! - X2!,Y2!

    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


Also wie müsste es denn nun lauten?
 
06.12.2006  
 



Also vielleicht noch mal zur Aufgabenstellung - ich als MatheUnProfi habe o.G. Funktion erstellt welcher ich die Koordinaten für eine Linie übergebe und den Winkel erhalte. Ohne Wenn und Aber müssen die Werte 0°-360° zurückgeliefert werden - Umsprung-und-Übergangsfliessend.

So wie ich das sehe brauche ich dafür nur den Arcustangens - eine Multipli und Division. Kann ein MatheProfi das verbessern?
 
06.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.682 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