German Kleinsten Wert aus Liste ermitteln

Matzele73

Member
Licensed User
Longtime User
Hallo zusammen,

ich möchte die kleinstmögliche Auflösung dieser Liste ermitteln.

B4X:
Type CameraSize (Width As Int, Height As Int)

Dim pictureSizes() As CameraSize = Camera1.GetSupportedPicturesSizes

Dim current As CameraSize = Camera1.GetPictureSize

Kann mir jemand helfen?

Viele Grüße Matthias
 

DonManfred

Expert
Licensed User
Longtime User
Maybe this help you? That´s a really simple logic. It iterates trough the list and takes the one with the smallest width...

Tschuldigung... Ich kann natürlich Deutsch reden ;)

Hoffe, Dir hilft diese kleine Routine die ich grad mal geschrieben habe. finde, es passt so ohne viel Aufwand ganz gut.

Ist im Grunde eine ganz simple Logik:
Es wird durch die Liste iteriert und die Auflösung mit der kleinsten Breite wird genommen.

B4X:
Dim smallest As CameraSize
Dim dummy As Double
Dim pictureSizes() As CameraSize = camEx.GetSupportedPicturesSizes 
dummy = 16384
For Each cs As CameraSize In pictureSizes
  dummy = Min(dummy,cs.Width)
  If dummy = cs.Width Then
    smallest = cs
  End If
Next
Log ("Die kleinste Auflösung (Breite/Höhe) ist: "&smallest.Width&"/"&smallest.Height )

Die kleinste Auflösung (Breite/Höhe) ist: 640/480
 
Last edited:

DonManfred

Expert
Licensed User
Longtime User
Mir fällt grad ein, das man auch anders vorgehen könnte:

Man Multipliziert Breite mit der Höhe und man erhält ja die "Pixelanzahl". Man könnte die kleinste Auflösung auch SO suchen/finden. Also; die Auflösung mit der geringsten Pixelanzahl "gewinnt" ;-)

Die kleinste Auflösung (Breite/Höhe) ist: 640/480 307200 'Pixel' ;-)

Ok, Ergebniss bleibt wohl das selbe :D

Von der Performance her ist die erste Variante aber definitiv besser. Hier werden nur bereits vorhandene Werte miteinander verglichen. hingegeben in der 2. Variante wird erstmal eine Multiplikation angewandt und dann verglichen. Braucht also sicher nen Tick oder zwei mehr :D
 
Last edited:

Matzele73

Member
Licensed User
Longtime User
Hi Manfred,
vielen Dank für diese nützlichen Beispiele. Ich habe mich für das erste entschieden, es funktioniert wunderbar.

Allerdings verstehe ich (in meiner Blödheit) gerade nicht, warum dummy mit cs.Width verglichen werden muss.:(
Vielleicht kannst Du mir das noch kurz erläutern?

Viele Grüße,
Matthias
 

DonManfred

Expert
Licensed User
Longtime User
dummy qird zu Beginn auf einen extra grossen Wert (auf jeden fall grösser als die wirklich kleinste) gesetzt (16384 = 16kb)

Dann wird dummy in jedem durchlauf neu gesetzt
B4X:
dummy = Min(dummy,cs.Width)

dummy =
min(wert1,wert2) ermittelt den kleineren der zwei übergebenen werte (in meinem beispiel der aktuelle wert von dummy und die breite des aktuell durchlaufenen Eintrages) und liefert DIESEN zurück...

Fazit: dummy wird beim durchlaufen immer kleiner.Genauer: halt immer dann, wenn ein Eintrag geprüft wird, der kleiner ist als der zuletzt enthaltene Wert von dummy.

dummy wird also auf den neuen gesetzt und "smallest" wird mit dem aktuell bearbeiteten eintrag belegt.

Also immer wenn dummy sich zum vorherigen durchlauf verändert, dann wird auch smallest neu gesetzt.

B4X:
  If dummy = cs.Width Then
    smallest = cs
  End If

Wichtiger Hinweis zum Verständniss:

Ich mache mir hier halt die Eingeart zunutze die in der Logik der Routine entsteht. wenn dummy jetzt aktuell der Breite entspricht, dann muss die Breite ja der kleinere der beiden an min übergebenen Werte gewesen sein (die Zeile vor der IF-Abfrage). Sie ist also kleiner als vorher und somit wird "smallest" neu gesetzt.
 
Last edited:

DonManfred

Expert
Licensed User
Longtime User
Auf die gleiche Weise könnte man den größten Wert ermitteln in dem man dummy zu beginn auf 0 setzt und dann den Befehl min durch den Befehl max tauscht.

Es mag aber auch ein gewisser Vorteil sein wenn man, wie ich, schon ca 30 Jahre lang programmiert :D
 

MaFu

Well-Known Member
Licensed User
Longtime User
Ich würds so schreiben:
B4X:
Dim smallest As CameraSize
Dim pictureSizes() As CameraSize = camEx.GetSupportedPicturesSizes 
smallest.Width = 16384
For Each cs As CameraSize In pictureSizes
  If cs.Width < smallest.Width Then
    smallest = cs
  End If
Next
Log ("Die kleinste Auflösung (Breite/Höhe) ist: "&smallest.Width&"/"&smallest.Height )
Das mit den 30 Jahren kommt mir bekannt vor, muss am Namen liegen :D
 

Matzele73

Member
Licensed User
Longtime User
Vielen Dank für deine tolle Erklärung und deine Hilfe!

Eigentlich ja logisch, man muss es nur wissen. ;)
 
Top