| |
|
|
- 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 4 - |
|
|
Hubert Binnewies | Du hast recht....du konntest mit meiner Gleichung nix anfangem weil sie schlichtweg falsch war....
Die korrekte Formel siehst du unten im Bild.
Woraus sich folgendes Listing ergibt...übergangs- und sprunglos... KompilierenMarkierenSeparierenCLS
declare T!,DX!,DY!
WHILE 1
CLS
PRINT WNK(400,200,%MOUSEX,%MOUSEY)
SLEEP 50
ENDWHILE
WAITKEY
proc WNK
PARAMETERS X&,Y&,XX&,YY&
LINE X&,Y& - XX&,YY&
if xx&-x&>0
if yy&-y&>0
T! = (90*(yy& - y&))/sqrt((xx& - x&)^2 + (yy& - y&)^2)
endif
endif
if xx&-x&<0
if yy&-y&>0
T! = 90-((90*(yy& - y&))/sqrt(((xx& - x&)*-1)^2 + (yy& - y&)^2))+90
endif
endif
if xx&-x&<0
if yy&-y&<0
T! = 180+((90*((yy& - y&)*-1))/sqrt(((xx& - x&)*-1)^2 + ((yy& - y&)*-1)^2))
endif
endif
if xx&-x&>0
if yy&-y&<0
T! = 180-((90*((yy& - y&)*-1))/sqrt((xx& - x&)^2 + ((yy& - y&)*-1)^2))+180
endif
endif
RETURN T!
endproc
Kannst du damit was anfangen??
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 ▲ |
|
|
|
|
Hubert Binnewies | Du hast recht....du konntest mit meiner Gleichung nix anfangem weil sie schlichtweg falsch war....
Die korrekte Formel siehst du unten im Bild.
Woraus sich folgendes Listing ergibt...übergangs- und sprunglos... KompilierenMarkierenSeparierenCLS
declare T!,DX!,DY!
WHILE 1
CLS
PRINT WNK(400,200,%MOUSEX,%MOUSEY)
SLEEP 50
ENDWHILE
WAITKEY
proc WNK
PARAMETERS X&,Y&,XX&,YY&
LINE X&,Y& - XX&,YY&
if xx&-x&>0
if yy&-y&=0
T! = 0
endif
endif
if xx&-x&>0
if yy&-y&>0
T! = (90*(yy& - y&))/sqrt((xx& - x&)^2 + (yy& - y&)^2)
endif
endif
if xx&-x&=0
if yy&-y&>0
T! = 90
endif
endif
if xx&-x&<0
if yy&-y&>0
T! = 90-((90*(yy& - y&))/sqrt(((xx& - x&)*-1)^2 + (yy& - y&)^2))+90
endif
endif
if xx&-x&<0
if yy&-y&=0
T! = 180
endif
endif
if xx&-x&<0
if yy&-y&<0
T! = 180+((90*((yy& - y&)*-1))/sqrt(((xx& - x&)*-1)^2 + ((yy& - y&)*-1)^2))
endif
endif
if xx&-x&=0
if yy&-y&<0
T! = 270
endif
endif
if xx&-x&>0
if yy&-y&<0
T! = 180-((90*((yy& - y&)*-1))/sqrt((xx& - x&)^2 + ((yy& - y&)*-1)^2))+180
endif
endif
RETURN T!
endproc
Kannst du damit was anfangen??
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 ▲ |
|
|
|
|
| Klar super! Im prinzip wenn ich jetzt beide vergleiche - hast Du mein ArcTang in ein Sqrt getauscht - mal so grob gesagt.
Ich glaub - habs aber nur übersprungen - Deine Formel gibt einen falschen Wert wenn xx-x oder yy-y gleich Null ist. Ist aber Nebensache und durch ein >=0 statt >0 zu bebehen.
Jetzt muss ich nur noch rausbekommen ob Deine Variante mehr Performance in XProfan hat.
Ah hab grad gesehen hast die Formel nochmal überarbeitet - ich schau mal... |
|
|
| |
|
|
|
Hubert Binnewies | [quote:93643e9b90=iF]Deine Formel gibt einen falschen Wert wenn xx-x oder yy-y gleich Null ist. Ist aber Nebensache und durch ein >=0 statt >0 zu bebehen.
[/quote:93643e9b90] würde ich nicht tun....denn wenn yy-y=0 wird und du 0*90 machst bleibt es 0... und wenn du dann versuchst die 0 zu teilen erhälst du einen ungültigen Funktionswert..
schau in das zweite listing...das erste ist leider ein Unfall beim reinsetzen ins Forum... da habe ich das Problem gelöst...
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 ▲ |
|
|
|
|
| Yeha! Deine Formal benötigt 9% wniger Zeit bei mir
Hier der SpeedTestCode: KompilierenMarkierenSeparierenDECLARE T!,DX!,DY!
RANDOMIZE
CLS
var TME&=&GETTICKCOUNT
WHILELOOP 10000
WNK(100,100,RND(200),RND(200))
ENDWHILE
TME&=&GETTICKCOUNT-TME&
var TME2&=&GETTICKCOUNT
WHILELOOP 10000
WNK2(100,100,RND(200),RND(200))
ENDWHILE
TME2&=&GETTICKCOUNT-TME2&
PRINT TME&
PRINT TME2&
WAITKEY
proc WNK
PARAMETERS X1!,Y1!,X2!,Y2!,MODE%
var DX!=X2!-X1!
var DY!=Y2!-Y1!
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
proc WNK2
PARAMETERS X&,Y&,XX&,YY&
IF XX&-X&>0
IF YY&-Y&=0
T!=0
ENDIF
ENDIF
IF XX&-X&>0
IF YY&-Y&>0
T!=(90*(YY& - Y&))/SQRT((XX& - X&)^2 + (YY& - Y&)^2)
ENDIF
ENDIF
IF XX&-X&=0
IF YY&-Y&>0
T!=90
ENDIF
ENDIF
IF XX&-X&<0
IF YY&-Y&>0
T!=90-((90*(YY& - Y&))/SQRT(((XX& - X&)*-1)^2 + (YY& - Y&)^2))+90
ENDIF
ENDIF
IF XX&-X&<0
IF YY&-Y&=0
T!=180
ENDIF
ENDIF
IF XX&-X&<0
IF YY&-Y&<0
T!=180+((90*((YY& - Y&)*-1))/SQRT(((XX& - X&)*-1)^2 + ((YY& - Y&)*-1)^2))
ENDIF
ENDIF
IF XX&-X&=0
IF YY&-Y&<0
T!=270
ENDIF
ENDIF
IF XX&-X&>0
IF YY&-Y&<0
T!=180-((90*((YY& - Y&)*-1))/SQRT((XX& - X&)^2 + ((YY& - Y&)*-1)^2))+180
ENDIF
ENDIF
RETURN T!
endproc
|
|
|
| |
|
|
|
| So jetzt versuche ich Deine Formel nochmal bisl programmablauftechnisch zu optimieren... |
|
|
| |
|
|
|
Hubert Binnewies | [quote:ed547f9469=iF]So jetzt versuche ich Deine Formel nochmal bisl programmablauftechnisch zu optimieren...[/quote:ed547f9469] Hab ich schon...verliert dadurch zwar etwas an übersichtlichkeit, aber es verschwinden einige zeitaufwendige IF Abfragen... KompilierenMarkierenSeparierenCLS
declare T!,DX!,DY!
WHILE 1
CLS
PRINT WNK(400,200,%MOUSEX,%MOUSEY)
SLEEP 50
ENDWHILE
WAITKEY
proc WNK
PARAMETERS X&,Y&,XX&,YY&
LINE X&,Y& - XX&,YY&
if xx&-x&>0
if yy&-y&=0
T! = 0 <---können auch 360 Grad sein
elseif yy&-y&>0
T! = (90*(yy& - y&))/sqrt((xx& - x&)^2 + (yy& - y&)^2)
elseif yy&-y&<0
T! = 180-((90*((yy& - y&)*-1))/sqrt((xx& - x&)^2 + ((yy& - y&)*-1)^2))+180
endif
endif
if xx&-x&=0
if yy&-y&>0
T! = 90
elseif yy&-y&<0
T! = 270
endif
endif
if xx&-x&<0
if yy&-y&>0
T! = 90-((90*(yy& - y&))/sqrt(((xx& - x&)*-1)^2 + (yy& - y&)^2))+90
elseif yy&-y&=0
T! = 180
elseif yy&-y&<0
T! = 180+((90*((yy& - y&)*-1))/sqrt(((xx& - x&)*-1)^2 + ((yy& - y&)*-1)^2))
endif
endif
RETURN T!
endproc
Besser?? |
|
|
| 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 ▲ |
|
|
|
|
| |
|
| |
|
|
|
| Erstklassige Arbeit kann man da nur sagen!
Danke! |
|
|
| |
|
|
|
Hubert Binnewies | jep....du hast ja nochn haufen subtraktionen und variablen benennungen rausgenommen....
Bist du denn so zufrieden? oder muss es noch schneller??
(ich hatte ja versprochen das ich mir was überlege)....
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 ▲ |
|
|
|
|
| Also doppelt so schnell wie mein Ergebnis ist ungefähr das was ich mir vorstellte
Geht diese Funktion ähnlich umzustellen? KompilierenMarkierenSeparieren
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
|
|
|
| |
|
|
|
Hubert Binnewies | [quote:0fce4dc459=iF]Erstklassige Arbeit kann man da nur sagen!
Danke! [/quote:0fce4dc459] Bitte Bitte.... Gerne gemacht...
[offtopic] dann kannste dir ja denken was hierdrin abgeht---> [...] [/offtopic] |
|
|
| 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 ▲ |
|
|
|