Un sistema que estoy construyendo incluye un conjunto de controles deslizantes de UI (el número varía) cada uno con una escala de 0-100. Por control deslizante me refiero a una interfaz de usuario donde agarras un elemento y lo arrastras hacia arriba y hacia abajo, como un control de volumen. Están conectados por un algoritmo que asegura que siempre suman 100. Entonces, cuando un control deslizante se mueve hacia arriba, los demás se mueven hacia abajo, eventualmente a cero. Cuando uno se mueve hacia abajo, los otros se mueven hacia arriba. En todo momento, el total debe ser 100. Entonces, los controles deslizantes tienen varios valores, pero suman 100%:
----O------ 40
O---------- 0
--O-------- 20
--O-------- 20
--O-------- 20
Si el primer control deslizante luego se mueve hacia ARRIBA de 40 a 70, los otros deben moverse hacia ABAJO en valor (a medida que se arrastra el control deslizante). Tenga en cuenta que tres controles deslizantes cambiaron de 20 a 10, y uno se mantuvo en cero, ya que no puede bajar.
-------O--- 70
O---------- 0
-O--------- 10
-O--------- 10
-O--------- 10
Por supuesto, cuando cualquier control deslizante alcanza 0 o 100, no puede moverse más, que es donde realmente me comienza a doler la cabeza. Entonces, si un control deslizante se mueve más alto, los otros se mueven más abajo, pero cuando alguno de ellos llega a cero, solo los restantes que aún no han llegado a cero pueden moverse más abajo.
Estoy haciendo esto aquí ya que esta pregunta es específica del algoritmo, no de la implementación. FWIW la plataforma es Android Java, pero eso no es especialmente relevante.
El enfoque que tomé con mi primera puñalada fue calcular el cambio porcentual del control deslizante que se movió. Luego dividí ese cambio y lo apliqué (en la otra dirección) a los otros valores del control deslizante. Sin embargo, el problema es que al usar porcentajes y multiplicar, si un control deslizante llega a cero, nunca se puede volver a aumentar desde cero; el resultado neto es que los controles deslizantes individuales se atascan en cero. He usado controles deslizantes con un rango de 0 - 1,000,000 para evitar problemas de redondeo y eso parece ser útil, pero todavía tengo que crear un algoritmo que maneje bien todos los escenarios.