3Dworldto2D func macht nicht was sie soll

02/07/2014 15:22 YatoDev#1
Ich habe diese VB.Net funktion mit der ich in .Net bei meinem radar hack die position des punktes relativ zu mir auf dem radar ausrechne :
Code:
    Shared Function RadianToDegree(ByVal radian As Double) As Double
        Return (radian / 180) * Math.PI
    End Function
    Shared Function _3DWorldTo2DRadar(ByVal My_Position As Point, ByVal enemy_position As Point, ByVal YAW_Radian As Single, ByVal Radar_Breite As Single, ByVal Radar_Höhe As Single, ByVal Radius_2D As Integer) As Point
        Try
            Dim cosYaw As Single = Math.Cos(RadianToDegree(YAW_Radian))
            Dim sinYaw As Single = Math.Sin(RadianToDegree(YAW_Radian))

            Dim distanzX As Single = enemy_position.X - My_Position.X
            Dim distanzY As Single = enemy_position.Y - My_Position.Y

            Dim positionX As Single = ((distanzY * cosYaw - distanzX * sinYaw) * -1 / Radius_2D) + Radar_Breite / 2
            Dim positionY As Single = ((distanzX * cosYaw + distanzY * sinYaw) / Radius_2D) * -1 + Radar_Höhe / 2
            Return New Point(positionX, positionY)
        Catch ex As Exception
        End Try
    End Function
in autoit nutze ich diese aber es funktioniert nicht richtig. die punkte werden angezeigt aber nur je nach blickwinkel richtig:
Code:
Func _ToDegree($radian)
	Return ($radian/180)*3.14159265358979323846
EndFunc
Func _3Dto2D($my_posx,$my_posy,$other_posx,$other_posy,$yaw,$width,$height,$rad = 12)
	;MsgBox(0,"",$yaw & @CRLF & $my_posx & @CRLF & $my_posy & @CRLF & $other_posx & @CRLF & $other_posy)
	$cos=Cos(_ToDegree($yaw))
	$sin=Sin(_ToDegree($yaw))
	$distance_x=$other_posx-$my_posx
	$distance_y=$other_posy-$my_posy
	Local $pos[2]
	$pos[0]=(($distance_y*$cos-$distance_x*$sin)*-1/$rad)+$width/2
	$pos[1]=(($distance_x*$cos-$distance_y*$sin)/$rad)*-1+$height/2
	Return $pos
EndFunc
hoffe jemand weis wo drann es liegt ^^

BTW : wie macht man das mit dem doublebuffeed in GDI+ ?
02/07/2014 15:48 alpines#2
Doublebuffering ist ganz einfach du packst einen Buffer über einen Buffer so das der Text einmal geschrieben wird und danach nicht mehr - im besten Falle - neu gezeichnet wird.
Sollte genug Beispiele im Netz geben.
02/07/2014 15:50 YatoDev#3
Quote:
Originally Posted by alpines View Post
Doublebuffering ist ganz einfach du packst einen Buffer über einen Buffer so das der Text einmal geschrieben wird und danach nicht mehr - im besten Falle - neu gezeichnet wird.
Sollte genug Beispiele im Netz geben.
habs genau so gemacht es wird aber nicht gezeichnet habs auch wie in beispielen gemacht es geht aber nicht
02/07/2014 16:25 alpines#4
Dann nimm doch mal Beispiele wie es geht und übernehm das Konstrukt statt es selber zu schreiben.
02/07/2014 17:22 snow#5
Code:
Return ($radian/180)*3.14159265358979323846
Ich weiß nicht, wie stark AutoIt darauf achtet, würde aber mal schätzen, dass hier Integer durch Integer dividiert wird. Da der Radiant > 180 ist, kommt dann 0 raus. Wie siehts aus mit 180.0?
02/07/2014 17:50 YatoDev#6
Quote:
Originally Posted by snow911 View Post
Code:
Return ($radian/180)*3.14159265358979323846
Ich weiß nicht, wie stark AutoIt darauf achtet, würde aber mal schätzen, dass hier Integer durch Integer dividiert wird. Da der Radiant > 180 ist, kommt dann 0 raus. Wie siehts aus mit 180.0?
leider hats nichts gebracht. Wäre nice wenn sich mal jemand mit ein wenig mehr wissen wie ich das anguckt. ich kann 720p livestreamen mit meiner leitung ^^
Bin mir allerdings schon ziemlich sicher das es an der funktion liegt die oben ist da die punkte ja teilweise korrekt angezeigt werden
02/07/2014 18:48 alpines#7
Du kannst auch mit deiner Leitung 50 Gigapixel Livestreamen nur wie hoch die Bitrate ist ist eine gaanz andere Sache.
02/07/2014 18:58 YatoDev#8
Quote:
Originally Posted by alpines View Post
Du kannst auch mit deiner Leitung 50 Gigapixel Livestreamen nur wie hoch die Bitrate ist ist eine gaanz andere Sache.
sieht beim streamen fast genauso aus wie bei mir am bildschirm
02/07/2014 20:29 alpines#9
Kommt trotzdem auf die Bildrate an und vorallem ob es komprimiert wird (ist meistens nicht der Fall) oder nicht.
02/07/2014 20:45 YatoDev#10
Übers streamen muss man sich nicht streiten. es ist 720p standard einstellung von open broadcaster für twitch und es sieht auch aus wie 720p (1280x720)

Ich hab mir jetzt coordinaten ausgeben lassen aus dem spiel und diese mal an die autoit func und an die vb func übergeben und bin am ende auf das ergebnis gekommen:
Code:
0.0190777286055944	-	round 8
-0.999818003574276	-	round 6
-101.559997558594	-	Int
-434.130004882813	-	Int
134.151977367895	-	Round 4
161.332377403686	-	89,00208
links sind die autoit ergebnisse , rechts die vb
round zahl ist die nachkommastelle.
Ich denke nicht das durch das nicht runden die func in autoit nicht mehr geht.
Int ist die convertierung in autoit von komma zahlen zu int dabei wird alles nach dem komma weggelassen.
Also das letzte ergebnis ist vollkommen falsch und in der regel ein zu großer wert allerdings weis ich nicht wie ich das beheben kann weil da ist doch kein unterschied in der formel ?

Edit :
Problem dank alpines jetzt gelöst. Er hat mir die .net funktion als native dll compiled die ich jetzt dafür verwende. In autoit scheint diese rechnung nicht möglich zu sein :o
02/08/2014 15:06 lolkop#11
radian in degree wandelt man doch mit folgender formel um:
Code:
radian*180/3.14
bzw optimiert:
Code:
radian*57.3
deine formel:
Code:
(radian/180)*pi
entspräche ja:
Code:
radian*0,017
was niemals zu einem korrekten ergebnis führen kann o0
02/08/2014 16:10 Shadow992#12
Quote:
Originally Posted by lolkop View Post
radian in degree wandelt man doch mit folgender formel um:
Code:
radian*180/3.14
bzw optimiert:
Code:
radian*57.3
deine formel:
Code:
(radian/180)*pi
entspräche ja:
Code:
radian*0,017
was niemals zu einem korrekten ergebnis führen kann o0
Ist mir auch schon aufgefallen er wandelt Deg in Rad um weil AutoIt Rad erwartet ebenso wie VB also ist die Benennung falsch.
02/08/2014 17:36 lolkop#13
abgesehen von dem oben erwähnten formalen fehler, fällt beim direkten vergleich auch ein fehler in folgenden zeilen auf:
Code:
Dim positionY As Single = ((distanzX * cosYaw + distanzY * sinYaw) / Radius_2D) * -1 + Radar_Hoehe / 2
------------------------------------------------------------------------------------------------------
$pos[1] = (($distanzX * $cosYaw - $distanzY * $sinYaw) / $Radius_2D) * - 1 + $Radar_Hoehe / 2
Code:
distanzX * cosYaw + distanzY * sinYaw
-----------------------------------------
$distanzX * $cosYaw - $distanzY * $sinYaw
somit sollte auch klar sein, weshalb die y coordinate keinesfalls ein identisches ergebnis liefern kann
02/08/2014 19:34 YatoDev#14
Quote:
Originally Posted by lolkop View Post
radian in degree wandelt man doch mit folgender formel um:
Code:
radian*180/3.14
bzw optimiert:
Code:
radian*57.3
deine formel:
Code:
(radian/180)*pi
entspräche ja:
Code:
radian*0,017
was niemals zu einem korrekten ergebnis führen kann o0
die formel für degree ist so richtig ich kenn mich da auch nicht so aus die 3dworldto2d func ist aus google.
Cos und sin berechnen aus einem winkel vom dreieck welches halt 180° hat. Dann noch google stichwort "Thales kreis" und die formel ergibt sinn.
Gut das unsre mathe lehrerin sich mal entschieden hat was vernpnftiges zu machen xD
Ich bennen die func um damit sie nicht so irreführend ist
Quote:
Originally Posted by Shadow992 View Post
Ist mir auch schon aufgefallen er wandelt Deg in Rad um weil AutoIt Rad erwartet ebenso wie VB also ist die Benennung falsch.
siehe oben

Quote:
Originally Posted by lolkop View Post
abgesehen von dem oben erwähnten formalen fehler, fällt beim direkten vergleich auch ein fehler in folgenden zeilen auf:
Code:
Dim positionY As Single = ((distanzX * cosYaw + distanzY * sinYaw) / Radius_2D) * -1 + Radar_Hoehe / 2
------------------------------------------------------------------------------------------------------
$pos[1] = (($distanzX * $cosYaw - $distanzY * $sinYaw) / $Radius_2D) * - 1 + $Radar_Hoehe / 2
Code:
distanzX * cosYaw + distanzY * sinYaw
-----------------------------------------
$distanzX * $cosYaw - $distanzY * $sinYaw
somit sollte auch klar sein, weshalb die y coordinate keinesfalls ein identisches ergebnis liefern kann
mir und komischerweise keinem der coder in meiner skype liste ist das aufgefallen. da sieht man mal wie man an einem kleinen tippfehler scheitern kann.
02/09/2014 00:38 lolkop#15
Quote:
Originally Posted by »FlutterShy™ View Post
die formel für degree ist so richtig ich kenn mich da auch nicht so aus die 3dworldto2d func ist aus google.
Cos und sin berechnen aus einem winkel vom dreieck welches halt 180° hat. Dann noch google stichwort "Thales kreis" und die formel ergibt sinn.
Gut das unsre mathe lehrerin sich mal entschieden hat was vernpnftiges zu machen xD
was du hier schreibst is schlichtweg falsch.

ein einfacher blick in die autoit hilfe zur sin, cos oder tan funktion verrät uns:
Quote:
Code:
1 deg = pi / 180 rad
hierraus lassen sich entsprechend die funktionen zur umwandlung direkt ablesen.
entsprechend sollte klar sein, das die funktion welche du dort beschreibst, wie Shadow992 bereits sagte, eben deg in rad umwandelt und nicht anders herum. (es gibt übrigens in der math.au3 bereits funktionen zur umwandlung in beide richtungen)

Quote:
Originally Posted by »FlutterShy™ View Post
mir und komischerweise keinem der coder in meiner skype liste ist das aufgefallen. da sieht man mal wie man an einem kleinen tippfehler scheitern kann.
zum auffinden potentieller fehler, sollte man immer mit einer übersichtlichen syntax beginnen. insbesondere beim vergleich zweier funktionen macht es entsprechend sinn, potentielle variablen gleich zu benennen. sofern die thermaufstellung nicht voneinander abweicht, werden so eventuelle tippfehler sofort ersichtlich.

sollte dies nicht genügen, so sollte man versuchen sich über zwischenergebnisse (debugging) langsam an den fehler herann zu tasten. spätestens hier würde ersichtlich werden, in welcher zeile sich das problem befindet.


schlussendlich besteht bei deinem code wie bereits erwähnt noch optimierungspotential.
beispiel:
Code:
Func f1($x)
	Return $x*5*2*3
EndFunc
Func f2($x)
	Return $x*30
EndFunc
sicherlich liefern die funktionen f1 und f2 für jedes beliebige $x das gleiche ergebnis. während funktion f2 hierfür eine operation durchführen muss, benötigt funktion f1 aber vier operationen.

um derartige unnötige operationen zu vermeiden, solle jeder term möglichst weit vereinfacht werden (vereinfacht man f1, so erhält man f2).

dementsprechend sollte deine deg2rad funktion etwa so aussehen:
Code:
Func Deg2Rad($deg)
    Return $deg*0.017
Endfunc
auch code wie
Code:
$a * -1
sollte in jedem falle vermieden werden, da
Code:
-$a
zum beispiel komplett ohne operation auskommt, während die oben genannte alternative eine sinnfreie multiplikation ausführen muss.