|
You last visited: Today at 07:26
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/21/2012, 23:49
|
#16
|
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", 267, 132, 192, 144)
$xKoordinaten = GUICtrlCreateLabel("X-Koordinaten :", 16, 16, 77, 17)
$yKoordinaten = GUICtrlCreateLabel("Y-Koordinaten :", 16, 48, 77, 17)
$x1 = GUICtrlCreateInput("", 96, 16, 25, 21)
$y1 = GUICtrlCreateInput("", 96, 48, 25, 21)
$x2 = GUICtrlCreateInput("", 128, 16, 25, 21)
$y2 = GUICtrlCreateInput("", 128, 48, 25, 21)
$x3 = GUICtrlCreateInput("", 160, 16, 25, 21)
$y3 = GUICtrlCreateInput("", 160, 48, 25, 21)
$x4 = GUICtrlCreateInput("", 192, 16, 25, 21)
$y4 = GUICtrlCreateInput("", 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()
; Erster Fall, Gebä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)) ^ 2 + Abs(GUICtrlRead($y2)) ^ 2)
$Hoehe = 100 + Floor($Entfernung / 100)
MsgBox(0, "", 'Entfernung :' & @TAB & Round($Entfernung, 3) & @CRLF & _
'max. Höhe :' & @TAB & $Hoehe)
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
; Zweiter Fall, Gebä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)) ^ 2 + Abs(GUICtrlRead($y1)) ^ 2)
$Hoehe = 100 + Floor($Entfernung / 100)
MsgBox(0, "", 'Entfernung :' & @TAB & Round($Entfernung, 3) & @CRLF & _
'max. Höhe :' & @TAB & $Hoehe)
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
; Dritter Fall, Gebä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)) ^ 2 + Abs(GUICtrlRead($y4)) ^ 2)
$Hoehe = 100 + Floor($Entfernung / 100)
MsgBox(0, "", 'Entfernung :' & @TAB & Round($Entfernung, 3) & @CRLF & _
'max. Höhe :' & @TAB & $Hoehe)
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
; Vierter Fall, Gebä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)) ^ 2 + Abs(GUICtrlRead($y4)) ^ 2)
$Hoehe = 100 + Floor($Entfernung / 100)
MsgBox(0, "", 'Entfernung :' & @TAB & Round($Entfernung, 3) & @CRLF & _
'max. Höhe :' & @TAB & $Hoehe)
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
; Sonderfall, Gebä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($Entfernung, 3) & @CRLF & _
'max. Höhe :' & @TAB & $Hoehe)
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
; Sonderfall, Gebä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($Entfernung, 3) & @CRLF & _
'max. Höhe :' & @TAB & $Hoehe)
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
; Sonderfall, Gebä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($Entfernung, 3) & @CRLF & _
'max. Höhe :' & @TAB & $Hoehe)
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
; Sonderfall, Gebä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($Entfernung, 3) & @CRLF & _
'max. Höhe :' & @TAB & $Hoehe)
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
; Sonderfall, Gebä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($Entfernung, 3) & @CRLF & _
'max. Höhe :' & @TAB & $Hoehe)
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndFunc ;==>_Berechnen
|
|
|
09/22/2012, 01:03
|
#17
|
elite*gold: 528
Join Date: Jan 2012
Posts: 2,127
Received Thanks: 2,403
|
If <...> AND <...> AND <...> ... then
<...>
Endif
MfG
|
|
|
09/22/2012, 10:58
|
#18
|
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
|
Quote:
Originally Posted by -STORM-
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
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
|
|
|
09/22/2012, 12:13
|
#19
|
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.
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.
|
|
|
09/22/2012, 12:35
|
#20
|
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
|
Quote:
Originally Posted by -STORM-
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
|
|
|
09/22/2012, 12:56
|
#21
|
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.
|
|
|
09/22/2012, 13:48
|
#22
|
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 Fall, Gebä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)) ^ 2 + Abs(GUICtrlRead($y2)) ^ 2)
$Hoehe = 100 + Floor($Entfernung / 100)
MsgBox(0, "", 'Entfernung :' & @TAB & Round($Entfernung, 3) & @CRLF & _
'max. Höhe :' & @TAB & $Hoehe)
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
|
|
|
09/22/2012, 14:05
|
#23
|
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).
|
|
|
09/22/2012, 14:05
|
#24
|
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
|
Quote:
Originally Posted by Defkahn52
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.
|
|
|
09/22/2012, 14:16
|
#25
|
elite*gold: 8
Join Date: Aug 2009
Posts: 1,503
Received Thanks: 396
|
Quote:
Originally Posted by -STORM-
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
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:
; Sonderfall, Gebä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($Entfernung, 3) & @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.
|
|
|
09/22/2012, 14:33
|
#26
|
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.
|
|
|
09/22/2012, 14:40
|
#27
|
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
|
Quote:
Originally Posted by Defkahn52
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
|
|
|
09/22/2012, 14:50
|
#28
|
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^^
|
|
|
09/22/2012, 15:04
|
#29
|
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
|
Quote:
Originally Posted by butter123
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
|
|
|
09/22/2012, 15:24
|
#30
|
elite*gold: 8
Join Date: Aug 2009
Posts: 1,503
Received Thanks: 396
|
Quote:
Originally Posted by lolkop
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", 267, 132, 192, 144) $xKoordinaten = GUICtrlCreateLabel("X-Koordinaten :", 16, 16, 77, 17) $yKoordinaten = GUICtrlCreateLabel("Y-Koordinaten :", 16, 48, 77, 17) $x1 = GUICtrlCreateInput("", 96, 16, 25, 21) $y1 = GUICtrlCreateInput("", 96, 48, 25, 21) $x2 = GUICtrlCreateInput("", 128, 16, 25, 21) $y2 = GUICtrlCreateInput("", 128, 48, 25, 21) $x3 = GUICtrlCreateInput("", 160, 16, 25, 21) $y3 = GUICtrlCreateInput("", 160, 48, 25, 21) $x4 = GUICtrlCreateInput("", 192, 16, 25, 21) $y4 = GUICtrlCreateInput("", 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() ; Gebäude im ersten Quadranten Dim $Entfernung[4] $Entfernung[0] = Sqrt(Abs(GUICtrlRead($x1)) ^ 2 + Abs(GUICtrlRead($y1)) ^ 2) $Entfernung[1] = Sqrt(Abs(GUICtrlRead($x2)) ^ 2 + Abs(GUICtrlRead($y2)) ^ 2) $Entfernung[2] = Sqrt(Abs(GUICtrlRead($x3)) ^ 2 + Abs(GUICtrlRead($y3)) ^ 2) $Entfernung[3] = Sqrt(Abs(GUICtrlRead($x4)) ^ 2 + Abs(GUICtrlRead($y4)) ^ 2)
; Obenrechts If $Entfernung[0] < $Entfernung[1] Then If $Entfernung[0] < $Entfernung[2] Then If $Entfernung[0] < $Entfernung[3] Then $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[0] Then If $Entfernung[1] < $Entfernung[2] Then If $Entfernung[1] < $Entfernung[3] Then $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[1] Then If $Entfernung[2] < $Entfernung[0] Then If $Entfernung[2] < $Entfernung[3] Then $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[1] Then If $Entfernung[3] < $Entfernung[2] Then If $Entfernung[3] < $Entfernung[0] Then $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[2] Then $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[1] Then $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[0] Then $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[2] Then $Hoehe = 100 + Floor($Entfernung[0] / 100) MsgBox(0, "", 'Entfernung :' & @TAB & Round($Entfernung[0], 3) & @CRLF & _ 'max. Höhe :' & @TAB & $Hoehe) EndIf
; Sonderfall, um das Wahrzeichen herum If $Entfernung[0] = $Entfernung[1] And $Entfernung[0] = $Entfernung[2] Then $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.
|
|
|
 |
|
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.
|
|