Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > AutoIt
You last visited: Today at 07:26

  • Please register to post and access all features, it's quick, easy and FREE!

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.

Reply
 
Old 09/21/2012, 23:49   #16
 
Defkahn52's Avatar
 
elite*gold: 8
Join Date: Aug 2009
Posts: 1,503
Received Thanks: 396
Also bei mir hat es trotzdem nicht funktioniert, aber ich denke ich werde das noch lernen.

Viel wichtiger ist, dass mein Informatik Lehrer mich darum gebeten hat das Programm so zu schreiben, dass es selber herausfindet mit welchen Koordinaten er arbeiten muss um aufs Ergebnis zu kommen. Daraufhin habe ich lange überlegt und bin dann auf dieses Endergebnis gekommen. Es funktioniert einwandfrei, das Problem ist, dass ich mich Frage ob ich es hätte kürzer schreiben können. Und wenn ja, wie hätte ich das machen können ?

PHP Code:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=..\..\..\..\Programme\AutoIt3\Icons\au3.ico
#AutoIt3Wrapper_UseUpx=n
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode"1)
#region ### START Koda GUI section ### Form=
$Form1 GUICreate("Berechnung der Gebäudehöhe"267132192144)
$xKoordinaten GUICtrlCreateLabel("X-Koordinaten :"16167717)
$yKoordinaten GUICtrlCreateLabel("Y-Koordinaten :"16487717)
$x1 GUICtrlCreateInput(""96162521)
$y1 GUICtrlCreateInput(""96482521)
$x2 GUICtrlCreateInput(""128162521)
$y2 GUICtrlCreateInput(""128482521)
$x3 GUICtrlCreateInput(""160162521)
$y3 GUICtrlCreateInput(""160482521)
$x4 GUICtrlCreateInput(""192162521)
$y4 GUICtrlCreateInput(""192482521)
$_Berechnen GUICtrlCreateButton("Berechnen"968812133)
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
()
    ; 
Erster FallGebäude im ersten Quadranten
    
If GUICtrlRead($x1) < 0 Then
        
If GUICtrlRead($y1) > 0 Then
            
If GUICtrlRead($x2) < 0 Then
                
If GUICtrlRead($y2) > 0 Then
                    
If GUICtrlRead($x3) < 0 Then
                        
If GUICtrlRead($y3) > 0 Then
                            
If GUICtrlRead($x4) < 0 Then
                                
If GUICtrlRead($y4) > 0 Then
                                    $Entfernung 
Sqrt(Abs(GUICtrlRead($x2)) ^ Abs(GUICtrlRead($y2)) ^ 2)
                                    
$Hoehe 100 Floor($Entfernung 100)
                                    
MsgBox(0""'Entfernung :' & @TAB Round($Entfernung3) & @CRLF _
                                                  
'max. Höhe  :' & @TAB $Hoehe)
                                EndIf
                            EndIf
                        EndIf
                    EndIf
                EndIf
            EndIf
        EndIf
    EndIf

    ; 
Zweiter FallGebäude im zweiten Quadranten
    
If GUICtrlRead($x1) > 0 Then
        
If GUICtrlRead($y1) > 0 Then
            
If GUICtrlRead($x2) > 0 Then
                
If GUICtrlRead($y2) > 0 Then
                    
If GUICtrlRead($x3) > 0 Then
                        
If GUICtrlRead($y3) > 0 Then
                            
If GUICtrlRead($x4) > 0 Then
                                
If GUICtrlRead($y4) > 0 Then
                                    $Entfernung 
Sqrt(Abs(GUICtrlRead($x1)) ^ Abs(GUICtrlRead($y1)) ^ 2)
                                    
$Hoehe 100 Floor($Entfernung 100)
                                    
MsgBox(0""'Entfernung :' & @TAB Round($Entfernung3) & @CRLF _
                                                  
'max. Höhe  :' & @TAB $Hoehe)
                                EndIf
                            EndIf
                        EndIf
                    EndIf
                EndIf
            EndIf
        EndIf
    EndIf

    ; 
Dritter FallGebäude im dritten Quadranten
    
If GUICtrlRead($x1) < 0 Then
        
If GUICtrlRead($y1) < 0 Then
            
If GUICtrlRead($x2) < 0 Then
                
If GUICtrlRead($y2) < 0 Then
                    
If GUICtrlRead($x3) < 0 Then
                        
If GUICtrlRead($y3) < 0 Then
                            
If GUICtrlRead($x4) < 0 Then
                                
If GUICtrlRead($y4) < 0 Then
                                    $Entfernung 
Sqrt(Abs(GUICtrlRead($x3)) ^ Abs(GUICtrlRead($y4)) ^ 2)
                                    
$Hoehe 100 Floor($Entfernung 100)
                                    
MsgBox(0""'Entfernung :' & @TAB Round($Entfernung3) & @CRLF _
                                                  
'max. Höhe  :' & @TAB $Hoehe)
                                EndIf
                            EndIf
                        EndIf
                    EndIf
                EndIf
            EndIf
        EndIf
    EndIf

    ; 
Vierter FallGebäude im vierten Quadranten
    
If GUICtrlRead($x1) > 0 Then
        
If GUICtrlRead($y1) < 0 Then
            
If GUICtrlRead($x2) > 0 Then
                
If GUICtrlRead($y2) < 0 Then
                    
If GUICtrlRead($x3) > 0 Then
                        
If GUICtrlRead($y3) < 0 Then
                            
If GUICtrlRead($x4) > 0 Then
                                
If GUICtrlRead($y4) < 0 Then
                                    $Entfernung 
Sqrt(Abs(GUICtrlRead($x4)) ^ Abs(GUICtrlRead($y4)) ^ 2)
                                    
$Hoehe 100 Floor($Entfernung 100)
                                    
MsgBox(0""'Entfernung :' & @TAB Round($Entfernung3) & @CRLF _
                                                  
'max. Höhe  :' & @TAB $Hoehe)
                                EndIf
                            EndIf
                        EndIf
                    EndIf
                EndIf
            EndIf
        EndIf
    EndIf

    ; 
SonderfallGebäude auf der Y-Achse (Positiv)
    If 
GUICtrlRead($x1) < 0 Then
        
If GUICtrlRead($y1) > 0 Then
            
If GUICtrlRead($x2) > 0 Then
                
If GUICtrlRead($y2) > 0 Then
                    
If GUICtrlRead($x3) > 0 Then
                        
If GUICtrlRead($y3) > 0 Then
                            
If GUICtrlRead($x4) < 0 Then
                                
If GUICtrlRead($y4) > 0 Then
                                    $Entfernung 
GUICtrlRead($y1)
                                    
$Hoehe 100 Floor($Entfernung 100)
                                    
MsgBox(0""'Entfernung :' & @TAB Round($Entfernung3) & @CRLF _
                                                  
'max. Höhe  :' & @TAB $Hoehe)
                                EndIf
                            EndIf
                        EndIf
                    EndIf
                EndIf
            EndIf
        EndIf
    EndIf

    ; 
SonderfallGebäude auf der Y-Achse (Negativ)
    If 
GUICtrlRead($x1) < 0 Then
        
If GUICtrlRead($y1) < 0 Then
            
If GUICtrlRead($x2) > 0 Then
                
If GUICtrlRead($y2) < 0 Then
                    
If GUICtrlRead($x3) > 0 Then
                        
If GUICtrlRead($y3) < 0 Then
                            
If GUICtrlRead($x4) < 0 Then
                                
If GUICtrlRead($y4) < 0 Then
                                    $Entfernung 
Abs(GUICtrlRead($y3))
                                    
$Hoehe 100 Floor($Entfernung 100)
                                    
MsgBox(0""'Entfernung :' & @TAB Round($Entfernung3) & @CRLF _
                                                  
'max. Höhe  :' & @TAB $Hoehe)
                                EndIf
                            EndIf
                        EndIf
                    EndIf
                EndIf
            EndIf
        EndIf
    EndIf

    ; 
SonderfallGebäude auf der X-Achse (Positiv)
    If 
GUICtrlRead($x1) > 0 Then
        
If GUICtrlRead($y1) < 0 Then
            
If GUICtrlRead($x2) > 0 Then
                
If GUICtrlRead($y2) < 0 Then
                    
If GUICtrlRead($x3) > 0 Then
                        
If GUICtrlRead($y3) > 0 Then
                            
If GUICtrlRead($x4) > 0 Then
                                
If GUICtrlRead($y4) > 0 Then
                                    $Entfernung 
GUICtrlRead($x1)
                                    
$Hoehe 100 Floor($Entfernung 100)
                                    
MsgBox(0""'Entfernung :' & @TAB Round($Entfernung3) & @CRLF _
                                                  
'max. Höhe  :' & @TAB $Hoehe)
                                EndIf
                            EndIf
                        EndIf
                    EndIf
                EndIf
            EndIf
        EndIf
    EndIf

    ; 
SonderfallGebäude auf der X-Achse (Negativ)
    If 
GUICtrlRead($x1) < 0 Then
        
If GUICtrlRead($y1) < 0 Then
            
If GUICtrlRead($x2) < 0 Then
                
If GUICtrlRead($y2) < 0 Then
                    
If GUICtrlRead($x3) < 0 Then
                        
If GUICtrlRead($y3) > 0 Then
                            
If GUICtrlRead($x4) < 0 Then
                                
If GUICtrlRead($y4) > 0 Then
                                    $Entfernung 
Abs(GUICtrlRead($x2))
                                    
$Hoehe 100 Floor($Entfernung 100)
                                    
MsgBox(0""'Entfernung :' & @TAB Round($Entfernung3) & @CRLF _
                                                  
'max. Höhe  :' & @TAB $Hoehe)
                                EndIf
                            EndIf
                        EndIf
                    EndIf
                EndIf
            EndIf
        EndIf
    EndIf

    ; 
SonderfallGebäude um Needley
    
If GUICtrlRead($x1) < 0 Then
        
If GUICtrlRead($y1) < 0 Then
            
If GUICtrlRead($x2) > 0 Then
                
If GUICtrlRead($y2) < 0 Then
                    
If GUICtrlRead($x3) > 0 Then
                        
If GUICtrlRead($y3) > 0 Then
                            
If GUICtrlRead($x4) < 0 Then
                                
If GUICtrlRead($y4) > 0 Then
                                    $Entfernung 
0
                                    $Hoehe 
100 Floor($Entfernung 100)
                                    
MsgBox(0""'Entfernung :' & @TAB Round($Entfernung3) & @CRLF _
                                                  
'max. Höhe  :' & @TAB $Hoehe)
                                EndIf
                            EndIf
                        EndIf
                    EndIf
                EndIf
            EndIf
        EndIf
    EndIf

EndFunc   ;==>_Berechnen 
Defkahn52 is offline  
Old 09/22/2012, 01:03   #17
 
Achat's Avatar
 
elite*gold: 528
Join Date: Jan 2012
Posts: 2,127
Received Thanks: 2,403
If <...> AND <...> AND <...> ... then
<...>
Endif



MfG
Achat is offline  
Thanks
1 User
Old 09/22/2012, 10:58   #18
 
lolkop's Avatar
 
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
Quote:
Originally Posted by -STORM- View Post
Der größte Vorteil des OnEvents ist hier nicht offensichtlich:
Events werden SOFORT ausgelöst, auch wenn das Script groß ist.
Ist es auf GUIGetMsg() basiert, werden z.B. keine Events ausgelöst, während etwas anderes berechnet wird (siehe Beispiel von Achat).
Man kann das zwar durch weitere Abfragen trotzdem hinkriegen, aber das dauert und macht das Script unnötig kompliziert.
dieser punkt stimmt so NICHT.
beispiel:
Code:
Opt("GUIOnEventMode", 1)

GUICreate('gui')
GUICtrlCreateButton('btn1', 10, 10)
GUICtrlSetOnEvent(-1, 'func1')
GUICtrlCreateButton('btn2', 10, 50)
GUICtrlSetOnEvent(-1, 'func2')
GUISetState()

While Sleep(5)
WEnd

Func func1()
	ToolTip('func 1')
	Sleep(10000)
EndFunc

Func func2()
	ToolTip('func 2')
	Sleep(10000)
EndFunc
abgesehen davon hat der "onevent modus" aber tatsächlich einen vorteil. die GuiGetMsg() funktion implementiert ein Sleep(5), welches das script in jedem schleifendurchlauf für 5ms blockiert.

dieses ist im onevent modus nicht enthalten, wodurch es dem entwickler überlassen wird, ob und wo er einen kleinen idle zustand einbaut, um die cpu zu entlasten.
daraus folgt, das der onevent mode dem entwickler mehr freiraum gewährt. klarer nachteil hierbei ist allerdings, das für jede aktion eine extra funktion angelegt werden muss.auch das kann man aber mit einem kleinen trick umgehen, indem man die @GUI_CtrlId variable nutzt.
bsp:
Code:
Opt("GUIOnEventMode", 1)
Dim $btn[10]

GUICreate('gui')
For $i=0 To UBound($btn)-1
	$btn[$i] = GUICtrlCreateButton('btn'&$i+1, 10, 10+$i*25)
	GUICtrlSetOnEvent(-1, 'xFunc')
Next
GUISetState()

While Sleep(5)
WEnd

Func xFunc()
	For $i=0 To UBound($btn)-1
		If @GUI_CtrlId = $btn[$i] Then ToolTip('btn'&$i+1&' wurde gedrückt')
	Next
EndFunc
somit ist es wie auch beim GuiGetMsg() fall möglich, das ganze guigeschehen über schleifen abzuarbeiten, und trotzdem den vorteil vom onevent modus zu nutzen.

Quote:
Originally Posted by Defkahn52 View Post
Viel wichtiger ist, dass mein Informatik Lehrer mich darum gebeten hat das Programm so zu schreiben, dass es selber herausfindet mit welchen Koordinaten er arbeiten muss um aufs Ergebnis zu kommen. Daraufhin habe ich lange überlegt und bin dann auf dieses Endergebnis gekommen. Es funktioniert einwandfrei, das Problem ist, dass ich mich Frage ob ich es hätte kürzer schreiben können. Und wenn ja, wie hätte ich das machen können ?
also nachdem ich mit die aufgabe mal durchgelesen habe, stellt sich mir die frage, ob du die aufgabe richtig verstanden hast.

die aufgabe besagt, es gibt ein wahrzeichen und ein gebäude (2 punkte mit je 2 koordinaten). und du sollst je nach distanz die maximale höhe des gebäudes berechnen.

das ganze könnte man zb so lösen:
Code:
Dim $coors[2][2], $label[2][2] = [['Wahrzeichen', 'Gebäude'], ['x', 'y']], $ok
GUICreate('Höhen Rechner', 220, 130)
For $i=0 To 1
	GUICtrlCreateGroup($label[0][$i], 10+$i*100, 10, 100, 70)
	For $h=0 To 1
		GUICtrlCreateLabel(' '&$label[1][$h]&':', 20+$i*100, 32+$h*20, 15)
		$coors[$i][$h] = GUICtrlCreateInput('', 35+$i*100, 30+$h*20, 65, 20)
	Next
Next

GUICtrlCreateGroup('Maximale Höhe', 10, 80, 200, 40)
$calc = GUICtrlCreateButton('Berechne', 15, 95, 70, 20)
$ergebnis = GUICtrlCreateLabel('Ergebnis: ?', 105, 98, 100, 20)

GUISetState()

While True
	Switch GUIGetMsg()
		Case -3
			Exit
		Case $calc
			$ok = True
			For $i=0 To 1
				For $h=0 To 1
					If GUICtrlRead($coors[$i][$h]) = '' Then
						$ok = False
						MsgBox(16, 'Error', $label[1][$h]&'-koordinate vom '&$label[0][$i]&' wurde nicht gesetzt!')
					EndIf
				Next
			Next
			If $ok Then	GUICtrlSetData($ergebnis, 'Ergebnis: '&100+Floor(Sqrt((GUICtrlRead($coors[0][0])-GUICtrlRead($coors[1][0]))^2 + (GUICtrlRead($coors[0][1])-GUICtrlRead($coors[1][1]))^2)/100)&'m')
	EndSwitch
WEnd
lolkop is offline  
Thanks
1 User
Old 09/22/2012, 12:13   #19
 
-STORM-'s Avatar
 
elite*gold: 124
Join Date: Dec 2009
Posts: 2,114
Received Thanks: 3,142
Wenn ich ihn richtig verstanden habe, geht es darum, dass ein Gebäude (im Ursprung des Koordinatensystems) zwischen mehrere Wahrzeichen gebaut werden soll, wobei automatisch das gefunden werden soll, das am nächsten ist.

Dafür bietet es sich erstmal an, die GUIControls sowie die ausgelesenen und berechneten Werte in nem Array zu speichern. Wir nehmen nen 2-dimensionalen Array, das ist wie ne Tabelle: $array[Zeilen][Spalten].
Wichtig ist: Der Array ist 0-basiert. Man definiert ihn mit Dim.
Code:
Dim $array[1][1]
Da bei Dim die Anzahl der Zeilen bzw. Spalten angegeben wird, und die erste jeweils 0 ist, definiert das Beispiel also nen Array mit dem einzigen Wert $array[0][0].

Sind alle Inputs in einem Array (je eine Spalte für xInput und yInput) können wir leicht mit wenigen Codezeilen die Werte auslesen und in weiteren Spalten speichern.
Statt die Koordinaten zu vergleichen, wie du es mit den zahlreichen verschachteteln Ifs gemacht hast, berechnen wir zu jedem einzelnen Gebäude den Abstand und vergleichen diese.
Zum vergleichen, nimmt man einfach den ersten Abstand als geringsten an und vergleicht ihn mit jedem weiteren. Falls der geringer ist, speichert man in einer Variable die Stelle, an der dieser geringste ist.
Außerdem hab ich ne Variable eingebaut, die angibt, dass nur ein Abstand der geringste ist, oder es mehrere gleiche gibt.

Code:
Opt("GUIOnEventMode", 1)

$dimension = 5 ;// stellt Anzahl der Inputs(für mehrere Gebäude) ein ==> passt Größe der GUI an
Dim $guiarray[$dimension][7] ;// von $dimension abhängige Variablen in einen Array

;// ACHTUNG: Array 0-basiert, Zählung im GUI 1-basiert

#region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Berechnung der Gebäudehöhe", 350, 30 + $dimension*30, 192, 144) ;// "+ $dimension*30" für angepasste Größe
$xKoordinaten = GUICtrlCreateLabel("X-Koordinaten", 30, 10, 77, 17)
$yKoordinaten = GUICtrlCreateLabel("Y-Koordinaten", 130, 10, 77, 17)
For $i = 0 To $dimension - 1 ;// GUICtrls erstellen.. "+ $i*30" für Anordnung untereinander
	$guiarray[$i][0] = GUICtrlCreateLabel($i + 1 & ".", 10, 35 + $i*30) ;// Label		$x1=$guiarray[0][0],,$x2=$guiarray[1][0],,$x3=$guiarray[2][0],,.....
	$guiarray[$i][1] = GUICtrlCreateInput("", 30, 32 + $i*30, 80, 20) ;// xInput
	$guiarray[$i][2] = GUICtrlCreateInput("", 130, 32 + $i*30, 80, 20) ;// yInput
Next
$_Berechnen = GUICtrlCreateButton("Berechnen", 220, 10, 120, 35)
GUICtrlSetOnEvent(-1, "_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 und Entfernungen/Bauhöhen berechnen
	For $i = 0 To $dimension - 1
		$guiarray[$i][3] = Abs(GUICtrlRead($guiarray[$i][1])) ;// xKoord
		$guiarray[$i][4] = Abs(GUICtrlRead($guiarray[$i][2])) ;// yKoord
		$guiarray[$i][5] = Sqrt($guiarray[$i][3]^2 + $guiarray[$i][4]^2) ;// Entfernung
		$guiarray[$i][6] = 100 + Floor($guiarray[$i][5]/100) ;// Bauhöhe
	Next

	Local $least = 0 ;// hier wird später gespeichert, welche Bauhöhe die geringste ist
	Local $multiple = "nur" ;// um Ausgabetext anzupassen bei mehreren gleichen Entfernungen

	;// Schritt 2: Entfernungen vergleichen und geringste finden
	For $i = 1 To $dimension - 1
		If $guiarray[$i][5] < $guiarray[$least][5] Then
			$least = $i
			$multiple = "nur"
		ElseIf $guiarray[$i][5] = $guiarray[$least][5] Then
			$multiple = "u.a."
		EndIf
	Next

	;// Schritt 3: Ausgabe
	MsgBox(0, "",	"Entfernung: " & @TAB & Round($guiarray[$least][5],3)	& @CRLF & _
					"maximale Bauhöhe: " & @TAB & $guiarray[$least][6] & @CRLF & _
					"(geringste Entfernung " & $multiple & " vom " & $least + 1 & ". Gebäude)")
EndFunc

PS: lolkop hat recht. Habe das mit den OnEvents falsch erklärt.
-STORM- is offline  
Thanks
1 User
Old 09/22/2012, 12:35   #20
 
lolkop's Avatar
 
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
Quote:
Originally Posted by -STORM- View Post
Wenn ich ihn richtig verstanden habe, geht es darum, dass ein Gebäude (im Ursprung des Koordinatensystems) zwischen mehrere Wahrzeichen gebaut werden soll, wobei automatisch das gefunden werden soll, das am nächsten ist.
es fällt mir schwer irgendwo in der aufgabe etwas vom "Ursprung des Koordinatensystems" oder gar etwas über "mehrere Wahrzeichen" zu finden.

es ist definitiv die rede von EINEM wahrzeichen. wo sich dieses befindet ist nicht vorgegeben (also optional). er redet zwar von mehreren gebäuden, jedoch ist es hier natürlich dem programmierer überlassen, ob er nun eine liste von N gebäuden mit der jeweiligen entfernung zulässt (hierfür wäre autoit nur sehr schlecht geeignet), oder ob die maximale gebäudehöhe von jedem gebäude seperat bestimmt werden muss.

PS: schön das Achat recht hatte :P
lolkop is offline  
Thanks
1 User
Old 09/22/2012, 12:56   #21
 
-STORM-'s Avatar
 
elite*gold: 124
Join Date: Dec 2009
Posts: 2,114
Received Thanks: 3,142
Bin mir auch nicht sicher, ob ich das richtig verstanden habe, aber mir fällt kein anderer Grund ein, wozu man mehr als 2 x- und y-Koordinaten brauchen sollte.
PS: Ähm, hm. Ist noch früh, da passiert sowas mal.
-STORM- is offline  
Thanks
1 User
Old 09/22/2012, 13:48   #22
 
Defkahn52's Avatar
 
elite*gold: 8
Join Date: Aug 2009
Posts: 1,503
Received Thanks: 396
Also erstmal tut es mir leid, dass ich euch die Aufgabe von Anfang an nicht gestellt habe, ein Fehler meinerseits, kommt nicht wieder vor.
Und da ich das mit den Arrays, und den Dimensionen nicht ganz verstehe, hoffe ich das es daran liegt, dass ich di nötigen Lektionen noch nicht gelernt habe.

Also die Aufgabe ist folgendermaßen.

Ein Warzeichen in der Statd liegt im Koordinaten Ursprung. In dem Koordinaten System, sind n Häuser mit 4 Punkten und jeweils 2 Koordinaten. Entweder sind die Häuser im ersten, zweiten, dritten oder vierten Quadranten. Oder sie sind auf den Achsen, hierbei unterscheidet sich wieder ob im oberen Bereich des Koordinaten Systems ob im unteren oder im linken oder rechten. In der Aufgabe werden mir die Punkte der Gebäude gegeben. Wenn ich diese Punkte in der richtige Reihenfolge (Also der Punkt unten links ist die erste beim Gebäude und dann gegen den Uhrzeiger Sinn weiter) eingebe, soll das Programm selber erkennen mit welchen Koordinaten er, wie arbeiten muss, deswegen auch die vielen Fall Unterscheidungen mit den If's. Hier ein Beispiel.

Punkte des ersten Hauses : A(-80,100),B(-20,100),C(-20,160)D(-80,160)

Entweder man zeichnet es erstmal in ein Koordinaten System, oder durch etwas überlegen kommt man so schon drauf, dass das Gebäude oben links im Koordinatensystemm liegt. So, da der Punkt 2 näher am Koordinaten Ursprung liegt, muss das Programm die Entfernung vom Punkt 2 zum Punkt (0,0) berechnen und deswegen dieser Befehl

A(-80,100),B(-20,100),C(-20,160),D(-80,160)
PHP Code:
Func _Berechnen()
    ; 
Erster FallGebäude im ersten Quadranten
    
If GUICtrlRead($x1) < 0 Then
        
If GUICtrlRead($y1) > 0 Then
            
If GUICtrlRead($x2) < 0 Then
                
If GUICtrlRead($y2) > 0 Then
                    
If GUICtrlRead($x3) < 0 Then
                        
If GUICtrlRead($y3) > 0 Then
                            
If GUICtrlRead($x4) < 0 Then
                                
If GUICtrlRead($y4) > 0 Then
                                    $Entfernung 
Sqrt(Abs(GUICtrlRead($x2)) ^ Abs(GUICtrlRead($y2)) ^ 2)
                                    
$Hoehe 100 Floor($Entfernung 100)
                                    
MsgBox(0""'Entfernung :' & @TAB Round($Entfernung3) & @CRLF _
                                                  
'max. Höhe  :' & @TAB $Hoehe)
                                EndIf
                            EndIf
                        EndIf
                    EndIf
                EndIf
            EndIf
        EndIf
    EndIf 
Defkahn52 is offline  
Old 09/22/2012, 14:05   #23
 
-STORM-'s Avatar
 
elite*gold: 124
Join Date: Dec 2009
Posts: 2,114
Received Thanks: 3,142
Achso, jetzt habe ich es verstanden: Die Gebäude werden nichtmehr als Punkte angegeben, sondern als Flächen mit 4 Eckpunkten.

Eine Bedingung ist dabei aber wichtig: Sind die Seiten immer parallel zur x- oder y-Achse?

Falls ja, ist die geringste Entfernung immer vom Ursprung zu einer der Ecken (außer das Gebäude schneidet eine Koordinatenachse).

Falls nein, kann die geringste Entfernung vom Ursprung zu einem Punkt auf einer der Seiten (also zwischen den Ecken) sein.
In diesem Fall wäre es mathematisch deutlich anspruchsvoller, diesen Punkt zu finden.
Die beste Lösung, die mir dazu einfiele, wäre:
Verbindungsvektor zwischen Ursprung und Seite berechnen (Vektorenschar) -> Länge davon berechnen (Funktion) -> geringste Länge finden (Minimum der Funktion; über Ableitungen bestimmbar).
-STORM- is offline  
Thanks
1 User
Old 09/22/2012, 14:05   #24
 
lolkop's Avatar
 
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
Quote:
Originally Posted by Defkahn52 View Post
Also die Aufgabe ist folgendermaßen.

Ein Warzeichen in der Statd liegt im Koordinaten Ursprung. In dem Koordinaten System, sind n Häuser mit 4 Punkten und jeweils 2 Koordinaten. Entweder sind die Häuser im ersten, zweiten, dritten oder vierten Quadranten. Oder sie sind auf den Achsen, hierbei unterscheidet sich wieder ob im oberen Bereich des Koordinaten Systems ob im unteren oder im linken oder rechten.
damit kann man doch endlich etwas anfangen...

du hast in deiner ganzen überlegung einen denkfehler.

die 4 gegebenen punkte ergeben 4 geraden. deine aufgabe besteht nun darin die distanzen der gerade zum ursprung zu bestimmen. und nicht etwa die entfernung der punkte zum ursprung.

hier ein beispiel:


wie man sieht ist das rechteck, welches durch die punkte gegeben wird genau so weit entfernt vom ursprung, wie eine der geraden. würden wir die distanz zu einem der punkte errechnen, so hätten wir nicht die distanz des gesamt objektes errechnet.
lolkop is offline  
Old 09/22/2012, 14:16   #25
 
Defkahn52's Avatar
 
elite*gold: 8
Join Date: Aug 2009
Posts: 1,503
Received Thanks: 396
Quote:
Originally Posted by -STORM- View Post
Achso, jetzt habe ich es verstanden: Die Gebäude werden nichtmehr als Punkte angegeben, sondern als Flächen mit 4 Eckpunkten.

Eine Bedingung ist dabei aber wichtig: Sind die Seiten immer parallel zur x- oder y-Achse?

Falls ja, ist die geringste Entfernung immer vom Ursprung zu einer der Ecken.

Falls nein, kann die geringste Entfernung vom Ursprung zu einem Punkt auf einer der Seiten (also zwischen den Ecken) sein.
In diesem Fall wäre es mathematisch deutlich anspruchsvoller, diesen Punkt zu finden.
Die beste Lösung, die mir dazu einfiele, wäre:
Verbindungsvektor zwischen Ursprung und Seite berechnen (Vektorenschar) -> Länge davon berechnen (Funktion) -> geringste Länge finden (Minimum der Funktion; über Ableitungen bestimmbar).
Ja sie sind immer Parallel, ansonsten wäre es, wie du schon sagtest, viel zu anspruchsvoll bzw. anspruchsvoller.

Quote:
Originally Posted by lolkop View Post
damit kann man doch endlich etwas anfangen...

du hast in deiner ganzen überlegung einen denkfehler.

die 4 gegebenen punkte ergeben 4 geraden. deine aufgabe besteht nun darin die distanzen der gerade zum ursprung zu bestimmen. und nicht etwa die entfernung der punkte zum ursprung.

hier ein beispiel:


wie man sieht ist das rechteck, welches durch die punkte gegeben wird genau so weit entfernt vom ursprung, wie eine der geraden. würden wir die distanz zu einem der punkte errechnen, so hätten wir nicht die distanz des gesamt objektes errechnet.
Nicht wirklich, in dem Fall wo du jetzt das Gebäude auf die X-Achse gelegt hast stimmt das schon aber was ist wenn es auf keiner Achse liegt ? Da kannst du nicht die Entfernung vom Ursprung zu einer Strecke machen. Und wenn du mal den Sonderfall von mir betrachtest, vorallem den Teil wo ich die Entfernung berechne,
PHP Code:
SonderfallGebäude auf der X-Achse (Negativ)
    If 
GUICtrlRead($x1) < 0 Then
        
If GUICtrlRead($y1) < 0 Then
            
If GUICtrlRead($x2) < 0 Then
                
If GUICtrlRead($y2) < 0 Then
                    
If GUICtrlRead($x3) < 0 Then
                        
If GUICtrlRead($y3) > 0 Then
                            
If GUICtrlRead($x4) < 0 Then
                                
If GUICtrlRead($y4) > 0 Then
                                    $Entfernung 
Abs(GUICtrlRead($x2))
                                    
$Hoehe 100 Floor($Entfernung 100)
                                    
MsgBox(0""'Entfernung :' & @TAB Round($Entfernung3) & @CRLF _
                                                  
'max. Höhe  :' & @TAB $Hoehe)
                                EndIf
                            EndIf
                        EndIf
                    EndIf
                EndIf
            EndIf
        EndIf
    EndIf 
siehst du, dass ich als Entfernung nur den Betrag von der Koordinate x2 genommen habe, wobei es auch x3 hätte sein können.
Defkahn52 is offline  
Old 09/22/2012, 14:33   #26
 
butter123's Avatar
 
elite*gold: 95
Join Date: May 2011
Posts: 982
Received Thanks: 189
hmm da kommt es jetzt auf die genaue Rechtslage an ist die Entfernung über den Mittelpunkt des Gebäudes definiert, oder über den Punkt, der am nächsten am Ursprung dran ist?

meine beiden Lösungswege wären:
(MP= Mittelpunkt, A1 = x Koordinate von A, A2 = y von A. Hab das Viereck in gedanklen so aufgebaut:
DC
AB)

1. Fall: MP berechnen: MP1 = A1 + (A1 - B1)/2 MP2 = A2 + (A2 - D2)/2
Über Pythagoras die Entfernung berechnen

2. Fall: (mit Seiten des Gebäudes dürfen nur parallel zu den Koordinatenachsen sein) Falls alle Koordinaten das gleiche Vorzeichen haben, alle abstände berechnen und den mit dem kürzesten Weg nehmen (Gebäude liegt komplett in einem Quadranten und somit ist eine Ecke der Punkt mit der kürzesten Entfernung)
Sind die Vorzeichen unterschiedlich, schneidet das Gebäude eine Koordinatenachse. Dann die Methode von lolkop nehmen.
butter123 is offline  
Thanks
1 User
Old 09/22/2012, 14:40   #27
 
lolkop's Avatar
 
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
Quote:
Originally Posted by Defkahn52 View Post
Nicht wirklich, in dem Fall wo du jetzt das Gebäude auf die X-Achse gelegt hast stimmt das schon aber was ist wenn es auf keiner Achse liegt ? Da kannst du nicht die Entfernung vom Ursprung zu einer Strecke machen.
das ist in dem falle auch nicht richtig...

die entfernung zwischen gerade und punkt berechnet immer die richtige entfernung, da es immer die kürzeste distanz als ergebnis liefert..

genau genommen wäre es NUR dann ein sonderfall, wenn zufällig tatsächlich einer der eckpunkte die kürzeste distanz darstellt. auch diese würden aber über die distanzgleichung gerade-punkt abgedeckt werden. wenn du also schon die distanz berechnen willst, dann gleich richtig.

so ist es dann auch egal, ob das rechteck tatsächlich parallel zu den achsen liegt oder nicht.

problematisch ist aber, das die reihenfolge der punkte immer korrekt angegeben werden muss, da es nicht möglich ist, aus 4 punkten die RICHTIGEN geraden herzuleiten. dh du solltest in deinem gui erwähnen in welcher reihenfolge die punkte angegeben werden müssen. zb von oben links nach unten rechts.

Edit:
Genau genommen handelt es sich natürlich nicht um geraden sondern strecken :P
lolkop is offline  
Old 09/22/2012, 14:50   #28
 
butter123's Avatar
 
elite*gold: 95
Join Date: May 2011
Posts: 982
Received Thanks: 189
lolkop, kannst du mal ein Beispiel geben wie du die Entfernung berechnen würdest?

Gleichungssysteme zu lösen geht glaube ich zu weit und numerisch, naja ist eine Möglichkeit, aber keine schöne^^
butter123 is offline  
Old 09/22/2012, 15:04   #29
 
lolkop's Avatar
 
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
Quote:
Originally Posted by butter123 View Post
lolkop, kannst du mal ein Beispiel geben wie du die Entfernung berechnen würdest?

Gleichungssysteme zu lösen geht glaube ich zu weit und numerisch, naja ist eine Möglichkeit, aber keine schöne^^
gehen wir davon aus, das der te in mathe nocht nicht bei vektorrechnung angekommen ist, und mit matrizzen/vektorrechnung vertraut ist, kann man das ganze auch noch einfacher betrachten.

man suche aus den 4 punkten die beiden dichtesten aus (vom wahrzeichen aus), bilde mit dem wahrzeichen im ursprung als drittem punkt ein dreieck und berechne die höhe:


diese aufgabe sollte selbst für sechstklässler kein problem darstellen =)

die höhe ist IMMER die korrekte distanz, da sie die kürzeste entfernung der strecke zum punkt darstellen.
zumindest solange wir nicht von entarteten rechtecken sprechen, ist das die wohl einfachste lösung.

Edit:
Sollte der schnittpunkt der höhe nicht auf einer der geraden des dreiecks liegen, so ist natürlich die kürzere der beiden punkt distanzen die gesuchte distanz
lolkop is offline  
Old 09/22/2012, 15:24   #30
 
Defkahn52's Avatar
 
elite*gold: 8
Join Date: Aug 2009
Posts: 1,503
Received Thanks: 396
Quote:
Originally Posted by lolkop View Post
das ist in dem falle auch nicht richtig...

die entfernung zwischen gerade und punkt berechnet immer die richtige entfernung, da es immer die kürzeste distanz als ergebnis liefert..

genau genommen wäre es NUR dann ein sonderfall, wenn zufällig tatsächlich einer der eckpunkte die kürzeste distanz darstellt. auch diese würden aber über die distanzgleichung gerade-punkt abgedeckt werden. wenn du also schon die distanz berechnen willst, dann gleich richtig.

so ist es dann auch egal, ob das rechteck tatsächlich parallel zu den achsen liegt oder nicht.

problematisch ist aber, das die reihenfolge der punkte immer korrekt angegeben werden muss, da es nicht möglich ist, aus 4 punkten die RICHTIGEN geraden herzuleiten. dh du solltest in deinem gui erwähnen in welcher reihenfolge die punkte angegeben werden müssen. zb von oben links nach unten rechts.

Edit:
Genau genommen handelt es sich natürlich nicht um geraden sondern strecken :P
Edit: Hab wohl zu lang gebraucht zum schreiben.

@lolkop

Ok, aber in diesem Beispiel ist die Höhe ja auch Orthogonal zur Strecke, aber was ist wenn nicht ?

@butter

Also die Entfernung ist schon die kürzeste Srecke und nicht der Mittelpunkt. Aber wenn ich deinen zweiten Fall richtig Verstanden habe, muss ich doch erstmal die Entfernung für alle Punkte erechnen und dann nochmal vergleichen welche, denn die kürzeste ist. Meintest du es so ?

PHP Code:
#region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=..\..\..\..\Programme\AutoIt3\Icons\au3.ico
#AutoIt3Wrapper_UseUpx=n
#endregion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode"1)
#region ### START Koda GUI section ### Form=
$Form1 GUICreate("Berechnung der Gebäudehöhe"267132192144)
$xKoordinaten GUICtrlCreateLabel("X-Koordinaten :"16167717)
$yKoordinaten GUICtrlCreateLabel("Y-Koordinaten :"16487717)
$x1 GUICtrlCreateInput(""96162521)
$y1 GUICtrlCreateInput(""96482521)
$x2 GUICtrlCreateInput(""128162521)
$y2 GUICtrlCreateInput(""128482521)
$x3 GUICtrlCreateInput(""160162521)
$y3 GUICtrlCreateInput(""160482521)
$x4 GUICtrlCreateInput(""192162521)
$y4 GUICtrlCreateInput(""192482521)
$_Berechnen GUICtrlCreateButton("Berechnen"968812133)
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
()
    ; 
Gebäude im ersten Quadranten
    Dim $Entfernung
[4]
    
$Entfernung[0] = Sqrt(Abs(GUICtrlRead($x1)) ^ Abs(GUICtrlRead($y1)) ^ 2)
    
$Entfernung[1] = Sqrt(Abs(GUICtrlRead($x2)) ^ Abs(GUICtrlRead($y2)) ^ 2)
    
$Entfernung[2] = Sqrt(Abs(GUICtrlRead($x3)) ^ Abs(GUICtrlRead($y3)) ^ 2)
    
$Entfernung[3] = Sqrt(Abs(GUICtrlRead($x4)) ^ Abs(GUICtrlRead($y4)) ^ 2)

    ; 
Obenrechts
    
If $Entfernung[0] < $Entfernung[1Then
        
If $Entfernung[0] < $Entfernung[2Then
            
If $Entfernung[0] < $Entfernung[3Then
                $Hoehe 
100 Floor($Entfernung[0] / 100)
                
MsgBox(0""'Entfernung :' & @TAB Round($Entfernung[0], 3) & @CRLF _
                        
'max. Höhe :' & @TAB $Hoehe)
            EndIf
        EndIf
    EndIf

    ; 
Obenlinks
    
If $Entfernung[1] < $Entfernung[0Then
        
If $Entfernung[1] < $Entfernung[2Then
            
If $Entfernung[1] < $Entfernung[3Then
                $Hoehe 
100 Floor($Entfernung[1] / 100)
                
MsgBox(0""'Entfernung :' & @TAB Round($Entfernung[1], 3) & @CRLF _
                        
'max. Höhe :' & @TAB $Hoehe)
            EndIf
        EndIf
    EndIf

    ; 
Untenlinks
    
If $Entfernung[2] < $Entfernung[1Then
        
If $Entfernung[2] < $Entfernung[0Then
            
If $Entfernung[2] < $Entfernung[3Then
                $Hoehe 
100 Floor($Entfernung[2] / 100)
                
MsgBox(0""'Entfernung :' & @TAB Round($Entfernung[2], 3) & @CRLF _
                        
'max. Höhe :' & @TAB $Hoehe)
            EndIf
        EndIf
    EndIf

    ; 
Untenrechts
    
If $Entfernung[3] < $Entfernung[1Then
        
If $Entfernung[3] < $Entfernung[2Then
            
If $Entfernung[3] < $Entfernung[0Then
                $Hoehe 
100 Floor($Entfernung[3] / 100)
                
MsgBox(0""'Entfernung :' & @TAB Round($Entfernung[3], 3) & @CRLF _
                        
'max. Höhe :' & @TAB $Hoehe)
            EndIf
        EndIf
    EndIf

    ; 
Auf Y-Achse Oben
    
If $Entfernung[0] = $Entfernung[1] And $Entfernung[0] <> $Entfernung[2Then
        $Hoehe 
100 Floor($Entfernung[0] / 100)
        
MsgBox(0""'Entfernung :' & @TAB Round($Entfernung[0], 3) & @CRLF _
                
'max. Höhe :' & @TAB $Hoehe)
    EndIf

    ; 
Auf Y-Achse Unten
    
If $Entfernung[2] = $Entfernung[3] And $Entfernung[2] <> $Entfernung[1Then
        $Hoehe 
100 Floor($Entfernung[2] / 100)
        
MsgBox(0""'Entfernung :' & @TAB Round($Entfernung[2], 3) & @CRLF _
                
'max. Höhe :' & @TAB $Hoehe)
    EndIf

    ; 
Auf X-Achse Links
    
If $Entfernung[1] = $Entfernung[2] And $Entfernung[1] <> $Entfernung[0Then
        $Hoehe 
100 Floor($Entfernung[1] / 100)
        
MsgBox(0""'Entfernung :' & @TAB Round($Entfernung[1], 3) & @CRLF _
                
'max. Höhe :' & @TAB $Hoehe)
    EndIf

    ; 
Auf X-Achse Rechts
    
If $Entfernung[0] = $Entfernung[3] And $Entfernung[0] <> $Entfernung[2Then
        $Hoehe 
100 Floor($Entfernung[0] / 100)
        
MsgBox(0""'Entfernung :' & @TAB Round($Entfernung[0], 3) & @CRLF _
                
'max. Höhe :' & @TAB $Hoehe)
    EndIf

    ; 
Sonderfallum das Wahrzeichen herum
    
If $Entfernung[0] = $Entfernung[1] And $Entfernung[0] = $Entfernung[2Then
        $Entfernung
[0] = 0
        $Hoehe 
100 Floor($Entfernung[0] / 100)
        
MsgBox(0""'Entfernung :' & @TAB Round($Entfernung[0], 3) & @CRLF _
                
'max. Höhe :' & @TAB $Hoehe)
    EndIf

EndFunc   ;==>_Berechnen 
Wenn ja, dann danke, denn so ist das Script halb so groß

EDIT:

Das Script was ich gerdae eben geschrieben habe ist Bullshit, die Sonderfälle (Gebäude auf den Achsen) funktionieren nicht wirklich richtig.
Defkahn52 is offline  
Reply


Similar Threads 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 +1. The time now is 07:26.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.