|
No hay razón para que el valor del índice en su bucle "for" deba avanzar un paso cada vez. Puesto que al bucle "while" no le importa cómo cambia el índice, usted lo puede cambiar como quiera. Ej:
#declare Index = Index - 1; Disminuye el index (cuidado con la condición
del while)
#declare Index = Index + 0.2; Incrementa en pasos de 0.2
#declare Index = Index * 2; Dobla el valor del index en cada paso.
etc.
Sea cuidadoso de donde coloca su bucle "while".
He visto esta clase de errores más de una vez:
#declare Index = 1;
#while(Index <= 10)
blob
{ threshold 0.6
sphere { <Index, 0, 0>, 2, 1 }
}
#declare Index = Index + 1;
#end
Podrá ver el problema inmediatamente.
Este código genera 10 blobs con un componente cada uno. No parece tener mucho sentido. Muy probablemente el usuario quería hacer un blob con 10 componentes.
¿Por qué ocurre este error? Puede ser que el usuario (más o menos subconscientemente) pensó que el bucle while debía ser la estructura de control más externa y no se dió cuenta de que los bucles "while" pueden estar en cualquier parte, también dentro de los objetos (creando subcomponentes o lo que sea).
El código correcto es, por supuesto:
blob
{ threshold 0.6
#declare Index = 1;
#while(Index <= 10)
sphere { <Index, 0, 0>, 2, 1 }
#declare Index = Index + 1;
#end
}
La diferencia esencial aqui es que solamente el código de la esfera es el que se ejecuta 10 veces, en lugar de todo el código de los blobs. El resultado neto es el mismo que si hubiéramos escrito el código de la esfera 10 veces con los valores apropiados del 'Index'.
Tenga cuidado también con la colocación de las llaves. Si las pone en el lugar equivocado puede terminar repitiendo accidentalmente la apertura o el cierre de la llave 10 veces. De nuevo, un sangrado apropiado ayuda bastante para evitar estos errores (como se ve en el ejemplo anterior).
Consejo: Puede usar bucles "while" en conjunción con las matrices (arrays) para automatizar la creación de largas listas de elementos con datos diferentes.
Imagine que está haciendo algo como esto:
color_map
{ [0.00 rgb <.1,1,.6>]
[0.05 rgb <.8,.3,.6>]
[0.10 rgb <.3,.7,.9>]
[0.15 rgb <1,.7,.3>]
...
y asi
Es tedioso tener que escribir las mismas cosas una y otra vez sólo para cambiar el valor index y los valores en el vector (aún si lo hace copiando y pegando líneas).
También hay aqui un gran problema: Si alguna vez quisiera añadir un nuevo color al mapa de colores, o quitar un color, tendría que enumerar de nuevo todos los índices, lo que puede ser extremadamente tedioso y frustrante.
¿No sería bueno automatizar la creación del mapa de color de manera que sólo tenga que escribir los vectores y ya está?
Bien, sí se puede. Usando un bucle que lea una matriz de vectores:
#declare MyColors = array[20]
{ <.1,1,.6>, <.8,.3,.6>, <.3,.7,.9>,
<1,.7,.3>, ...
}
...
color_map
{ #declare LastIndex = dimension_size(MyColors, 1)-1;
#declare Index = 0;
#while(Index <= LastIndex)
[Index/LastIndex rgb MyColors[Index]]
#declare Index = Index + 1;
#end
}
Ahora es fácil añadir, eliminar o modificar los colores de su mapa de colores. Sólo edite su matriz de vectores (recordando cambiar el tamaño del número respectivamente) y el bucle calculará automáticamente los valores correctos y le creará su mapa de colores.
|