|
You last visited: Today at 17:37
Advertisement
Befehl um neue Intervalle zu erstellen ?
Discussion on Befehl um neue Intervalle zu erstellen ? within the AutoIt forum part of the Coders Den category.
09/22/2012, 15:52
|
#31
|
elite*gold: 95
Join Date: May 2011
Posts: 982
Received Thanks: 189
|
Ich hab mir das Skript noch nicht weiter angeguckt. So wie du es im Text beschrieben hast, liefert es nur ein richtiges Ergebnis, wenn das Gebäude keine Koordinatenachse schneidet.
Und bei lolkops methode liefert die Höhe, wenn es keine Koordiantenachse berührt, ein falsches Ergebnis.
( ) hc ungleich a
|
|
|
09/22/2012, 15:56
|
#32
|
elite*gold: 8
Join Date: Aug 2009
Posts: 1,504
Received Thanks: 396
|
Quote:
Originally Posted by butter123
Ich hab mir das Skript noch nicht weiter angeguckt. So wie du es im Text beschrieben hast, liefert es nur ein richtiges Ergebnis, wenn das Gebäude keine Koordinatenachse schneidet.
|
Jo, war eigentlich keine Absicht, aber ich habs nicht hinbekommen, dass er auch ein Ergebnis liefert, wenn die Koordinaten Achsen geschnitten werden.
|
|
|
09/22/2012, 16:01
|
#33
|
elite*gold: 95
Join Date: May 2011
Posts: 982
Received Thanks: 189
|
Das hatte ich schon irgendwo geschrieben. Liegt es daneben, dann gucken welceh Ecke am nächsten ist, liegt es drauf, dann wie lolkop die Höhe des Dreiecks berechnen.
Wenn dann dein Skript läuft, können wir mal gucken, was wir da noch verbessern können, damit es schöner ist
|
|
|
09/22/2012, 16:12
|
#34
|
elite*gold: 124
Join Date: Dec 2009
Posts: 2,114
Received Thanks: 3,141
|
Ihr macht es etwas komplizierter als nötig.
Schneidet das Gebäude keine Achse, einfach die Strecke zwischen Ursprung und nächstem Eckpunkt bestimmen.
Schneidet es die x-Achse, ist die Strecke zwischen nächstem Schnittpunkt und Ursprung gleich der x-Koordinate des nächsten Eckpunktes.
Gleiches gilt, wenn es die y-Achse schneidet.
|
|
|
09/22/2012, 16:17
|
#35
|
elite*gold: 8
Join Date: Aug 2009
Posts: 1,504
Received Thanks: 396
|
Quote:
Originally Posted by -STORM-
Ihr macht es etwas komplizierter als nötig.
Schneidet das Gebäude keine Achse, einfach die Strecke zwischen Ursprung und nächstem Eckpunkt bestimmen.
Schneidet es die x-Achse, ist die Strecke zwischen nächstem Schnittpunkt und Ursprung gleich der x-Koordinate des nächsten Eckpunktes.
Gleiches gilt, wenn es die y-Achse schneidet.
|
Und wie sähe das in einem Script aus ?
|
|
|
09/22/2012, 16:22
|
#36
|
elite*gold: 124
Join Date: Dec 2009
Posts: 2,114
Received Thanks: 3,141
|
Kann in der Buli Halbzeit mal ein Beispiel machen.
|
|
|
09/22/2012, 16:43
|
#37
|
elite*gold: 95
Join Date: May 2011
Posts: 982
Received Thanks: 189
|
Falls ich keine Denkfehler gemacht habe, sollte es das schon sein:
PHP Code:
Bestimme die Entfernung von allen Punkten Sind alle in einem Quadranten? Ja: Der mit der kürzesten Entfernung ist der den wir suchen Nein: hc ist gesucht
hc = sin(alpha)*b sin(alpha) = a/c
a=entfernung vom nächsten Punkt zu C b=entfernung vom zweitnächsten Punkt zu C c=entfernung vom nächsten Punkt zum zweitnächsten Punkt
Edit: C ist der Ursprung
Edit2: Funktioniert nciht bei Rechtecken, die sehr schmal und sehr lang sind, da dann der falsche Punkt als zweitnächster gefunden wird
|
|
|
09/22/2012, 16:51
|
#38
|
elite*gold: 124
Join Date: Dec 2009
Posts: 2,114
Received Thanks: 3,141
|
Code:
Opt("GUIOnEventMode", 1)
#include <Array.au3>
Dim $guiarray[20]
#cs Array-Aufbau
0 xaInput
1 yaInput
2 xbInput
3 ybInput1
4 xcInput
5 ycInput
6 xdInput
7 ydInput
8 xaValue
9 yaValue
10 xbValue
11 ybValue
12 xcValue
13 ycValue
14 xdValue
15 ydValue
#ce
#region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Berechnung der Gebäudehöhe", 267, 132, 192, 144)
$xKoordinaten = GUICtrlCreateLabel("X-Koordinaten :", 16, 16, 77, 17)
$yKoordinaten = GUICtrlCreateLabel("Y-Koordinaten :", 16, 48, 77, 17)
$guiarray[0] = GUICtrlCreateInput("xa", 96, 16, 25, 21)
$guiarray[1] = GUICtrlCreateInput("ya", 96, 48, 25, 21)
$guiarray[2] = GUICtrlCreateInput("xb", 128, 16, 25, 21)
$guiarray[3] = GUICtrlCreateInput("yb", 128, 48, 25, 21)
$guiarray[4] = GUICtrlCreateInput("xc", 160, 16, 25, 21)
$guiarray[5] = GUICtrlCreateInput("yc", 160, 48, 25, 21)
$guiarray[6] = GUICtrlCreateInput("xd", 192, 16, 25, 21)
$guiarray[7] = GUICtrlCreateInput("yd", 192, 48, 25, 21)
$_Berechnen = GUICtrlCreateButton("Berechnen", 96, 88, 121, 33)
GUICtrlSetOnEvent($_Berechnen, "_Berechnen")
GUISetOnEvent(-3, "_exit")
GUISetState(@SW_SHOW)
#endregion ### END Koda GUI section ###
While 1
Sleep(250)
WEnd
Func _exit()
Exit
EndFunc ;==>_exit
Func _Berechnen()
;// Schritt 1: Koordinaten auslesen
For $i = 0 To 7
$guiarray[$i+8] = GUICtrlRead($guiarray[$i])
Next
;// Entfernung und nextCorner-x/y
Local $minEntf = Sqrt(Abs($guiarray[8])^2 + Abs($guiarray[9])^2)
Local $nextCornerx = Abs($guiarray[8]) ;// hier werden xKoords der nächsten Ecke gespeichert
Local $nextCornery = Abs($guiarray[9]) ;// hier werden yKoords der nächsten Ecke gespeichert
For $i = 1 To 3
Local $newEntf = Sqrt(Abs($guiarray[8+$i*2])^2 + Abs($guiarray[9+$i*2])^2) ;// berechnet Entfernung zu einzelnen Ecken
If $minEntf > $newEntf Then ;// falls Entfernung die geringste ist
$minEntf = $newEntf ;// Entfernung speichern
$nextCornerx = Abs($guiarray[8+$i*2]) ;// xKoord der nächsten Ecke speichern
$nextCornery = Abs($guiarray[9+$i*2]) ;// yKoord der nächsten Ecke speichern
EndIf
Next
;// falls eine Koordinatenachse geschnitten wird
Dim $posx[4]
Dim $posy[4]
For $i = 0 To 3 ;// bestimmen ob die einzelnen x/y Werte pos sind
$posx[$i] = _pos($guiarray[8 + $i*2])
$posy[$i] = _pos($guiarray[9 + $i*2])
Next
Local $xSchnitt = False
Local $ySchnitt = False
If Not ($posx[0] = $posx[1] And $posx[0] = $posx[2] And $posx[0] = $posx[3]) Then $xSchnitt = True ;//wenn nicht alle x pos/neg sind wird x-Achse geschnitten
If Not ($posy[0] = $posy[1] And $posy[0] = $posy[2] And $posy[0] = $posy[3]) Then $xSchnitt = True ;//wenn nicht alle x pos/neg sind wird x-Achse geschnitten
If $xSchnitt Then $minEntf = $nextCornerx ;//falls x-Achse geschnitten wird ist Entfernung gleich der xKoord der nächsten Ecke
If $ySchnitt Then $minEntf = $nextCornery ;//^^gleiches gilt für y
;// Bauhöhe
Local $bauhoehe = 100 + Floor($minEntf/100)
;// Schritt 3: Ausgabe
MsgBox(0, "", "Entfernung: " & @TAB & Round($minEntf,3) & @CRLF & _
"maximale Bauhöhe: " & @TAB & $bauhoehe)
EndFunc
Func _pos($nr) ;// prüft ob Wert pos ist
If $nr > 0 Then
Return 1
ElseIf $nr < 0 Then
Return 0
EndIf
EndFunc
Ich hoffe, durch die Kommentare ist es einigermaßen verständlich.
Edit:
@butter: Da ja alle Seiten parallel zu den Koordinatenachsen sind, ist Alpha immer 90°/0,5pi
Falls ich deine Idee richtig verstanden habe, sollte es funktionieren.
Ob es insgesamt kürzer wäre, als mein Beispiel, müsste man ausprobieren, das ist schwer zu schätzen.
|
|
|
09/22/2012, 18:45
|
#39
|
elite*gold: 95
Join Date: May 2011
Posts: 982
Received Thanks: 189
|
Irgendwo bei der Berechnung wenn es ne Achse berührt liegt noch n fehler. hab jetzt aber keine lsut mehr... (Fehler gefunden, siehe unten)
PHP Code:
#include <ButtonConstants.au3> #include <EditConstants.au3> #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> #include <Array.au3>
#Region ### START Koda GUI section ### Form= $Form1 = GUICreate("Form1", 200, 300, 192, 124) $Ax = GUICtrlCreateInput("1", 72, 72, 25, 21) $Ay = GUICtrlCreateInput("1", 112, 72, 25, 21) $Bx = GUICtrlCreateInput("2", 72, 112, 25, 21) $By = GUICtrlCreateInput("1", 112, 112, 25, 21) $Cx = GUICtrlCreateInput("1", 72, 152, 25, 21) $Cy = GUICtrlCreateInput("-2", 112, 152, 25, 21) $Dx = GUICtrlCreateInput("2", 72, 184, 25, 21) $Dy = GUICtrlCreateInput("-2", 112, 184, 25, 21)
$Label2 = GUICtrlCreateLabel("A", 32, 72, 11, 17) $Label3 = GUICtrlCreateLabel("B", 32, 112, 11, 17) $Label4 = GUICtrlCreateLabel("C", 32, 152, 11, 17) $Label5 = GUICtrlCreateLabel("D", 32, 184, 12, 17) $Button1 = GUICtrlCreateButton("Go", 56, 240, 75, 25) GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ###
While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $Button1 MsgBox(0,"Distance",Distance())
EndSwitch WEnd
Func Distance()
Dim $Array[6][6] Dim $LengthTRtgl[4] Local $LengthIRtgl
$Array[0][0] = GUICtrlRead($Ax) $Array[0][1] = GUICtrlRead($Ay)
$Array[1][0] = GUICtrlRead($Bx) $Array[1][1] = GUICtrlRead($By)
$Array[2][0] = GUICtrlRead($Cx) $Array[2][1] = GUICtrlRead($Cy)
$Array[3][0] = GUICtrlRead($Dx) $Array[3][1] = GUICtrlRead($Dy)
$LengthTRtgl[0] = Sqrt($Array[0][0]^2 + $Array[0][1]^2) $LengthTRtgl[1] = Sqrt($Array[1][0]^2 + $Array[1][1]^2) $LengthTRtgl[2] = Sqrt($Array[2][0]^2 + $Array[2][1]^2) $LengthTRtgl[3] = Sqrt($Array[3][0]^2 + $Array[3][1]^2)
If Sgn($Array[0][0]) = Sgn($Array[1][0]) And Sgn($Array[0][0]) = Sgn($Array[2][0]) And Sgn($Array[0][0]) = Sgn($Array[3][0]) And Sgn($Array[0][1]) = Sgn($Array[1][1]) And Sgn($Array[0][1]) = Sgn($Array[2][1]) And Sgn($Array[0][1]) = Sgn($Array[3][1]) Then
Return _ArrayMin($LengthTRtgl)
Else Dim $short[2] Local $a,$b,$c
$short[0] = _ArrayMinIndex($LengthTRtgl)
For $i = 0 to 3
If (Sgn($Array[$i][0]) = Sgn($Array[$short[0]][0]) And Sgn($Array[$i][1]) <> Sgn($Array[$short[0]][1])) Or (Sgn($Array[$i][0]) <> Sgn($Array[$short[0]][0]) And Sgn($Array[$i][1]) = Sgn($Array[$short[0]][1])) Then $short[1] = $i ExitLoop EndIf
Next
;Irgendwo hier ist warscheinlich der Fehler $c = Sqrt(($Array[$short[0]][0] - $Array[$short[1]][0])^2 + ($Array[$short[0]][1] - $Array[$short[1]][1])^2) $b = Sqrt($Array[$short[1]][0]^2 + $Array[$short[1]][1]^2) $a = Sqrt($Array[$short[0]][0]^2 + $Array[$short[0]][1]^2)
Return $b*($a/$c) EndIf
EndFunc
Func Sgn($Number) Local $sign If $Number >0 Then $sign = 1 ElseIf $Number = 0 Then $sign = 0 ElseIf $Number < 0 Then $sign = -1 EndIf
Return $sign EndFunc
Achtung! Das Programm ist nur schnell hingeschrieben und ich habe kein bisschen darauf geachtet wie ich schreibe... Das Skript also bitte nur verwenden um den Weg zu verstehen, aber für nichts anderes
Edit: Der Fehler lag zum einem im trigonometrischen bei der Formel (Sqrt(2*($a^2*$b^2+$b^2*$c^2+$c^2*$a^2)-($a^4+$b^4+$c^4))/(2*$c) ist die richtige). Zum anderen Wird der 2. nächste Punkt nicht richtig erkannt.
Der Sonderfall, eine Seite liegt auf einer Achse, wird auch nicht richtig behandelt.
|
|
|
09/23/2012, 13:32
|
#40
|
elite*gold: 8
Join Date: Aug 2009
Posts: 1,504
Received Thanks: 396
|
OK Danke euch, also grob hab ich das Verstanden, ich komm halt immer nur in Verwirrung mit den Arrays und den For Schleifen, ich bin ja noch Anfänger
Trotzdem danke ich euch für die Mühe
|
|
|
09/23/2012, 18:48
|
#41
|
elite*gold: 528
Join Date: Jan 2012
Posts: 2,127
Received Thanks: 2,404
|
Quote:
Originally Posted by Defkahn52
mit den Arrays und den For Schleifen
|
Kann ich dir wirklich sehr empfehlen. So habe ich den Array verstanden
MfG
|
|
|
|
|
Similar Threads
|
Musik Hilfe -Intervalle-
10/20/2011 - Off Topic - 2 Replies
Morgen schreiben wir eine HÜ(Hausaufgabenüberprüfung) und zwar habe ich vergessen wie die Intervalle heißen
Die kenne ich noch
1. Prime
2. Sekunde
3Terz
4.
5.
6.
7.
8.
|
[Frage]neuer cmd befehl erstellen per game.py?
08/22/2011 - Metin2 Private Server - 0 Replies
hey Com,
ich arbeite momentan an einem Projekt,
wozu ich aller dings einen neuen Questbefehl oder allgemein
Befehl laden soll.
Den befehl start ich dann per quest zb cmd ("befehl. pfad") so in der art joa
wie genau setzt man das eigtl um?
|
GM befehl für neue Kingrüssi
08/02/2011 - Metin2 Private Server - 9 Replies
Ich suche die GM Befehle für die neuen Kingrüssis für Metin2 pls wenn einer des weis sagtts mir bitte.
|
Report-Intervalle
04/09/2010 - Off Topic - 32 Replies
Hallo Leute,
ich möchte ein Problem ansprechen, dass ich leider nicht länger ignorieren kann.
Meiner Meinung nach ist die Zeit zwischen den Reports, die man abwarten muss, von Nachteil.
Manchmal will ich schnell alles reporten, was anffällt, und wie ihr euch sicher vorstellen könnt, ist das in der Metin2-Sektion ne Menge.
Aber diese Minute, die man zwischen jedem Report abwarten muss, ist ehrlich gesagt hemmend.
|
All times are GMT +2. The time now is 17:37.
|
|