| |
|
|
| 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. 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
./../function-references/xprofan/endproc/'>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 Dimensione hängt naturalmente 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 possibile 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 Foro 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 trasferimento 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
KompilierenMarkierenSeparierenCLS
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 | 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
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 ▲ | |
|
|
|