| |
|
|
- 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. KompilierenMarkierenSeparierenCLS
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
|
|
|
| |
|
|
| |
|
- Seite 3 - |
|
|
| WO 270 ist ist Wurst! Kannst Du gerne machen wie es besser wäre! |
|
|
| |
|
|
|
| Nur mal nebenbei das passende Gegenstück ist mir auch grad gelungen ^^ KompilierenMarkierenSeparieren KompilierenMarkierenSeparierenvar 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* |
|
|
| |
|
|
|
| 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
|
|
|
| |
|
|
|
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 |
|
|
| 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. |
|
|
| |
|
|
|
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? |
|
|
| |
|
|
|
Hubert Binnewies | |
|
| 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 | |
|
| 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? |
|
|
| |
|
|
|
| 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? |
|
|
| |
|
|